rack-mount 0.4.6 → 0.4.7
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/splitting.rb +7 -7
- data/lib/rack/mount/mixover.rb +8 -21
- data/lib/rack/mount/prefix.rb +10 -16
- data/lib/rack/mount/recognition/code_generation.rb +8 -10
- data/lib/rack/mount/recognition/route.rb +4 -19
- data/lib/rack/mount/recognition/route_set.rb +5 -19
- data/lib/rack/mount/strexp.rb +1 -2
- data/lib/rack/mount/strexp/parser.rb +2 -2
- data/lib/rack/mount/utils.rb +0 -11
- metadata +2 -2
@@ -5,7 +5,11 @@ module Rack::Mount
|
|
5
5
|
module Splitting
|
6
6
|
NULL = "\0".freeze
|
7
7
|
|
8
|
-
class Key <
|
8
|
+
class Key < Array
|
9
|
+
def initialize(method, index, separators)
|
10
|
+
replace([method, index, separators])
|
11
|
+
end
|
12
|
+
|
9
13
|
def self.split(value, separator_pattern)
|
10
14
|
keys = value.split(separator_pattern)
|
11
15
|
keys.shift if keys[0] == ''
|
@@ -14,15 +18,11 @@ module Rack::Mount
|
|
14
18
|
end
|
15
19
|
|
16
20
|
def call(cache, obj)
|
17
|
-
(cache[
|
21
|
+
(cache[self[0]] ||= self.class.split(obj.send(self[0]), self[2]))[self[1]]
|
18
22
|
end
|
19
23
|
|
20
24
|
def call_source(cache, obj)
|
21
|
-
"(#{cache}[:#{
|
22
|
-
end
|
23
|
-
|
24
|
-
def inspect
|
25
|
-
"#{method}[#{index}]"
|
25
|
+
"(#{cache}[:#{self[0]}] ||= Analysis::Splitting::Key.split(#{obj}.#{self[0]}, #{self[2].inspect}))[#{self[1]}]"
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
data/lib/rack/mount/mixover.rb
CHANGED
@@ -4,12 +4,6 @@ module Rack::Mount
|
|
4
4
|
# metaclass. This allows mixins to be stacked ontop of the instance
|
5
5
|
# methods.
|
6
6
|
module Mixover
|
7
|
-
def self.extended(klass)
|
8
|
-
klass.instance_eval do
|
9
|
-
@extended_modules = []
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
7
|
module InstanceMethods #:nodoc:
|
14
8
|
def dup
|
15
9
|
obj = super
|
@@ -21,40 +15,33 @@ module Rack::Mount
|
|
21
15
|
|
22
16
|
# Replaces include with a lazy version.
|
23
17
|
def include(*mod)
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
def extended_modules
|
28
|
-
Thread.current[extended_modules_thread_local_key] || @extended_modules
|
18
|
+
(@included_modules ||= []).push(*mod)
|
29
19
|
end
|
30
20
|
|
31
21
|
def new(*args, &block) #:nodoc:
|
32
22
|
obj = allocate
|
33
23
|
obj.extend(InstanceMethods)
|
34
|
-
|
24
|
+
(@included_modules ||= []).each { |mod| obj.extend(mod) }
|
35
25
|
obj.send(:initialize, *args, &block)
|
36
26
|
obj
|
37
27
|
end
|
38
28
|
|
39
29
|
# Create a new class without an included module.
|
40
30
|
def new_without_module(mod, *args, &block)
|
41
|
-
(
|
31
|
+
old_included_modules = (@included_modules ||= []).dup
|
32
|
+
@included_modules.delete(mod)
|
42
33
|
new(*args, &block)
|
43
34
|
ensure
|
44
|
-
|
35
|
+
@included_modules = old_included_modules
|
45
36
|
end
|
46
37
|
|
47
38
|
# Create a new class temporarily with a module.
|
48
39
|
def new_with_module(mod, *args, &block)
|
49
|
-
(
|
40
|
+
old_included_modules = (@included_modules ||= []).dup
|
41
|
+
include(mod)
|
50
42
|
new(*args, &block)
|
51
43
|
ensure
|
52
|
-
|
44
|
+
@included_modules = old_included_modules
|
53
45
|
end
|
54
|
-
|
55
|
-
private
|
56
|
-
def extended_modules_thread_local_key
|
57
|
-
"mixover_extended_modules_#{object_id}"
|
58
|
-
end
|
59
46
|
end
|
60
47
|
end
|
data/lib/rack/mount/prefix.rb
CHANGED
@@ -7,29 +7,23 @@ module Rack::Mount
|
|
7
7
|
SCRIPT_NAME = 'SCRIPT_NAME'.freeze
|
8
8
|
SLASH = '/'.freeze
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
def initialize(app, prefix = nil)
|
10
|
+
def initialize(app, prefix)
|
13
11
|
@app, @prefix = app, prefix.freeze
|
14
12
|
freeze
|
15
13
|
end
|
16
14
|
|
17
15
|
def call(env)
|
18
|
-
|
19
|
-
|
20
|
-
old_script_name = env[SCRIPT_NAME].dup
|
16
|
+
old_path_info = env[PATH_INFO].dup
|
17
|
+
old_script_name = env[SCRIPT_NAME].dup
|
21
18
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
@app.call(env)
|
27
|
-
ensure
|
28
|
-
env[PATH_INFO] = old_path_info
|
29
|
-
env[SCRIPT_NAME] = old_script_name
|
30
|
-
end
|
31
|
-
else
|
19
|
+
begin
|
20
|
+
env[PATH_INFO] = Utils.normalize_path(env[PATH_INFO].sub(@prefix, EMPTY_STRING))
|
21
|
+
env[PATH_INFO] = EMPTY_STRING if env[PATH_INFO] == SLASH
|
22
|
+
env[SCRIPT_NAME] = Utils.normalize_path(env[SCRIPT_NAME].to_s + @prefix)
|
32
23
|
@app.call(env)
|
24
|
+
ensure
|
25
|
+
env[PATH_INFO] = old_path_info
|
26
|
+
env[SCRIPT_NAME] = old_script_name
|
33
27
|
end
|
34
28
|
end
|
35
29
|
end
|
@@ -39,7 +39,6 @@ module Rack::Mount
|
|
39
39
|
|
40
40
|
container.each_with_index { |route, i|
|
41
41
|
body << "route = self[#{i}]"
|
42
|
-
body << 'matches = {}'
|
43
42
|
body << 'params = route.defaults.dup'
|
44
43
|
|
45
44
|
conditions = []
|
@@ -47,11 +46,10 @@ module Rack::Mount
|
|
47
46
|
b = []
|
48
47
|
if condition.is_a?(Regexp)
|
49
48
|
b << "if m = obj.#{method}.match(#{condition.inspect})"
|
50
|
-
b << "matches[:#{method}] = m"
|
51
49
|
if (named_captures = route.named_captures[method]) && named_captures.any?
|
52
|
-
b << '
|
50
|
+
b << 'matches = m.captures'
|
53
51
|
b << 'p = nil'
|
54
|
-
b << named_captures.map { |k, j| "params[#{k.inspect}] = p if p =
|
52
|
+
b << named_captures.map { |k, j| "params[#{k.inspect}] = p if p = matches[#{j}]" }.join('; ')
|
55
53
|
end
|
56
54
|
else
|
57
55
|
b << "if m = obj.#{method} == route.conditions[:#{method}]"
|
@@ -63,7 +61,7 @@ module Rack::Mount
|
|
63
61
|
|
64
62
|
body << <<-RUBY
|
65
63
|
if #{conditions.join(' && ')}
|
66
|
-
yield route,
|
64
|
+
yield route, params
|
67
65
|
end
|
68
66
|
RUBY
|
69
67
|
}
|
@@ -78,7 +76,7 @@ module Rack::Mount
|
|
78
76
|
|
79
77
|
def optimize_recognize!
|
80
78
|
keys = @recognition_keys.map { |key|
|
81
|
-
if key.
|
79
|
+
if key.is_a?(Array)
|
82
80
|
key.call_source(:cache, :obj)
|
83
81
|
else
|
84
82
|
"obj.#{key}"
|
@@ -96,12 +94,12 @@ module Rack::Mount
|
|
96
94
|
optimize_container_iterator(container) unless container.respond_to?(:optimized_each)
|
97
95
|
|
98
96
|
if block_given?
|
99
|
-
container.optimized_each(obj) do |route,
|
100
|
-
yield route,
|
97
|
+
container.optimized_each(obj) do |route, params|
|
98
|
+
yield route, params
|
101
99
|
end
|
102
100
|
else
|
103
|
-
container.optimized_each(obj) do |route,
|
104
|
-
return route,
|
101
|
+
container.optimized_each(obj) do |route, params|
|
102
|
+
return route, params
|
105
103
|
end
|
106
104
|
end
|
107
105
|
|
@@ -17,31 +17,16 @@ module Rack::Mount
|
|
17
17
|
}.freeze
|
18
18
|
}
|
19
19
|
@named_captures.freeze
|
20
|
-
|
21
|
-
if @conditions.has_key?(:path_info) &&
|
22
|
-
!Utils.regexp_anchored?(@conditions[:path_info])
|
23
|
-
@prefix = true
|
24
|
-
@app = Prefix.new(@app)
|
25
|
-
else
|
26
|
-
@prefix = false
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def prefix?
|
31
|
-
@prefix
|
32
20
|
end
|
33
21
|
|
34
22
|
def recognize(obj)
|
35
|
-
|
36
|
-
params = @defaults.dup
|
37
|
-
|
23
|
+
params = @defaults.dup
|
38
24
|
if @conditions.all? { |method, condition|
|
39
25
|
value = obj.send(method)
|
40
26
|
if condition.is_a?(Regexp) && (m = value.match(condition))
|
41
|
-
matches
|
42
|
-
captures = m.captures
|
27
|
+
matches = m.captures
|
43
28
|
@named_captures[method].each { |k, i|
|
44
|
-
if v =
|
29
|
+
if v = matches[i]
|
45
30
|
params[k] = v
|
46
31
|
end
|
47
32
|
}
|
@@ -52,7 +37,7 @@ module Rack::Mount
|
|
52
37
|
false
|
53
38
|
end
|
54
39
|
}
|
55
|
-
|
40
|
+
params
|
56
41
|
else
|
57
42
|
nil
|
58
43
|
end
|
@@ -26,19 +26,18 @@ module Rack::Mount
|
|
26
26
|
|
27
27
|
cache = {}
|
28
28
|
keys = @recognition_keys.map { |key|
|
29
|
-
if key.
|
29
|
+
if key.is_a?(Array)
|
30
30
|
key.call(cache, obj)
|
31
31
|
else
|
32
32
|
obj.send(key)
|
33
33
|
end
|
34
34
|
}
|
35
35
|
@recognition_graph[*keys].each do |route|
|
36
|
-
|
37
|
-
if matches && params
|
36
|
+
if params = route.recognize(obj)
|
38
37
|
if block_given?
|
39
|
-
yield route,
|
38
|
+
yield route, params
|
40
39
|
else
|
41
|
-
return route,
|
40
|
+
return route, params
|
42
41
|
end
|
43
42
|
end
|
44
43
|
end
|
@@ -63,14 +62,10 @@ module Rack::Mount
|
|
63
62
|
|
64
63
|
request = nil
|
65
64
|
req = @request_class.new(env)
|
66
|
-
recognize(req) do |route,
|
65
|
+
recognize(req) do |route, params|
|
67
66
|
# TODO: We only want to unescape params from uri related methods
|
68
67
|
params.each { |k, v| params[k] = Utils.unescape_uri(v) if v.is_a?(String) }
|
69
68
|
|
70
|
-
if route.prefix?
|
71
|
-
env[Prefix::KEY] = matches[:path_info].to_s
|
72
|
-
end
|
73
|
-
|
74
69
|
env[@parameters_key] = params
|
75
70
|
result = route.app.call(env)
|
76
71
|
return result unless result[1][X_CASCADE] == PASS
|
@@ -86,15 +81,6 @@ module Rack::Mount
|
|
86
81
|
super
|
87
82
|
end
|
88
83
|
|
89
|
-
protected
|
90
|
-
def recognition_stats
|
91
|
-
{ :keys => @recognition_keys,
|
92
|
-
:keys_size => @recognition_keys.size,
|
93
|
-
:graph_size => @recognition_graph.size,
|
94
|
-
:graph_height => @recognition_graph.height,
|
95
|
-
:graph_average_height => @recognition_graph.average_height }
|
96
|
-
end
|
97
|
-
|
98
84
|
private
|
99
85
|
def expire!
|
100
86
|
@recognition_keys = @recognition_graph = nil
|
data/lib/rack/mount/strexp.rb
CHANGED
@@ -21,14 +21,13 @@ module Rack::Mount
|
|
21
21
|
#
|
22
22
|
# Strexp.compile('src/*files')
|
23
23
|
# # => %r{\Asrc/(?<files>.+)\Z}
|
24
|
-
def initialize(str, requirements = {}, separators = []
|
24
|
+
def initialize(str, requirements = {}, separators = [])
|
25
25
|
return super(str) if str.is_a?(Regexp)
|
26
26
|
|
27
27
|
requirements = requirements ? requirements.dup : {}
|
28
28
|
normalize_requirements!(requirements, separators)
|
29
29
|
|
30
30
|
parser = StrexpParser.new
|
31
|
-
parser.anchor = anchor
|
32
31
|
parser.requirements = requirements
|
33
32
|
|
34
33
|
begin
|
@@ -20,7 +20,7 @@ else
|
|
20
20
|
REGEXP_NAMED_CAPTURE = '(?:<%s>%s)'.freeze
|
21
21
|
end
|
22
22
|
|
23
|
-
attr_accessor :
|
23
|
+
attr_accessor :requirements
|
24
24
|
##### State transition tables begin ###
|
25
25
|
|
26
26
|
racc_action_table = [
|
@@ -114,7 +114,7 @@ Racc_debug_parser = false
|
|
114
114
|
# reduce 0 omitted
|
115
115
|
|
116
116
|
def _reduce_1(val, _values, result)
|
117
|
-
result =
|
117
|
+
result = "\\A#{val.join}\\Z"
|
118
118
|
result
|
119
119
|
end
|
120
120
|
|
data/lib/rack/mount/utils.rb
CHANGED
@@ -88,17 +88,6 @@ module Rack::Mount
|
|
88
88
|
end
|
89
89
|
module_function :build_nested_query
|
90
90
|
|
91
|
-
# Determines whether the regexp must match the entire string.
|
92
|
-
#
|
93
|
-
# regexp_anchored?(/^foo$/) # => true
|
94
|
-
# regexp_anchored?(/foo/) # => false
|
95
|
-
# regexp_anchored?(/^foo/) # => false
|
96
|
-
# regexp_anchored?(/foo$/) # => false
|
97
|
-
def regexp_anchored?(regexp)
|
98
|
-
regexp.source =~ /\A(\\A|\^).*(\\Z|\$)\Z/ ? true : false
|
99
|
-
end
|
100
|
-
module_function :regexp_anchored?
|
101
|
-
|
102
91
|
def normalize_extended_expression(regexp)
|
103
92
|
return regexp unless regexp.options & Regexp::EXTENDED != 0
|
104
93
|
source = regexp.source
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-mount
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Peek
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-02-
|
12
|
+
date: 2010-02-09 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|