rack-mount 0.6.1 → 0.6.2
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.rb +3 -13
- data/lib/rack/mount/analysis/frequency.rb +0 -2
- data/lib/rack/mount/analysis/splitting.rb +2 -2
- data/lib/rack/mount/code_generation.rb +113 -0
- data/lib/rack/mount/generatable_regexp.rb +1 -1
- data/lib/rack/mount/route.rb +69 -5
- data/lib/rack/mount/route_set.rb +289 -46
- data/lib/rack/mount/strexp.rb +53 -50
- data/lib/rack/mount/utils.rb +7 -7
- data/lib/rack/mount/vendor/reginald/reginald.rb +2 -1
- data/lib/rack/mount/vendor/reginald/reginald/alternation.rb +11 -1
- data/lib/rack/mount/vendor/reginald/reginald/atom.rb +17 -5
- data/lib/rack/mount/vendor/reginald/reginald/character.rb +11 -2
- data/lib/rack/mount/vendor/reginald/reginald/character_class.rb +8 -20
- data/lib/rack/mount/vendor/reginald/reginald/collection.rb +10 -6
- data/lib/rack/mount/vendor/reginald/reginald/expression.rb +30 -20
- data/lib/rack/mount/vendor/reginald/reginald/group.rb +22 -8
- data/lib/rack/mount/vendor/reginald/reginald/options.rb +47 -0
- data/lib/rack/mount/vendor/reginald/reginald/parser.rb +137 -273
- data/lib/rack/mount/vendor/reginald/reginald/tokenizer.rb +1 -1
- data/lib/rack/mount/vendor/reginald/reginald/version.rb +3 -0
- data/lib/rack/mount/version.rb +1 -1
- metadata +6 -10
- data/lib/rack/mount/exceptions.rb +0 -3
- data/lib/rack/mount/generation/route.rb +0 -59
- data/lib/rack/mount/generation/route_set.rb +0 -200
- data/lib/rack/mount/mixover.rb +0 -60
- data/lib/rack/mount/recognition/code_generation.rb +0 -124
- data/lib/rack/mount/recognition/route.rb +0 -62
- data/lib/rack/mount/recognition/route_set.rb +0 -121
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'rack/mount/utils'
|
2
|
-
|
3
|
-
module Rack::Mount
|
4
|
-
module Recognition
|
5
|
-
module Route #:nodoc:
|
6
|
-
attr_reader :named_captures
|
7
|
-
|
8
|
-
def initialize(*args)
|
9
|
-
super
|
10
|
-
|
11
|
-
@named_captures = {}
|
12
|
-
@conditions.map { |method, condition|
|
13
|
-
next unless condition.respond_to?(:named_captures)
|
14
|
-
@named_captures[method] = condition.named_captures.inject({}) { |named_captures, (k, v)|
|
15
|
-
named_captures[k.to_sym] = v.last - 1
|
16
|
-
named_captures
|
17
|
-
}.freeze
|
18
|
-
}
|
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
|
-
end
|
33
|
-
|
34
|
-
def recognize(obj)
|
35
|
-
matches = {}
|
36
|
-
params = @defaults.dup
|
37
|
-
|
38
|
-
if @conditions.all? { |method, condition|
|
39
|
-
value = obj.send(method)
|
40
|
-
if condition.is_a?(Regexp) && (m = value.match(condition))
|
41
|
-
matches[method] = m
|
42
|
-
captures = m.captures
|
43
|
-
@named_captures[method].each { |k, i|
|
44
|
-
if v = captures[i]
|
45
|
-
params[k] = v
|
46
|
-
end
|
47
|
-
}
|
48
|
-
true
|
49
|
-
elsif value == condition
|
50
|
-
true
|
51
|
-
else
|
52
|
-
false
|
53
|
-
end
|
54
|
-
}
|
55
|
-
return matches, params
|
56
|
-
else
|
57
|
-
nil
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,121 +0,0 @@
|
|
1
|
-
require 'rack/mount/utils'
|
2
|
-
|
3
|
-
module Rack::Mount
|
4
|
-
module Recognition
|
5
|
-
module RouteSet
|
6
|
-
attr_reader :parameters_key
|
7
|
-
|
8
|
-
# Adds recognition related concerns to RouteSet.new.
|
9
|
-
def initialize(options = {})
|
10
|
-
@parameters_key = options.delete(:parameters_key) || 'rack.routing_args'
|
11
|
-
@parameters_key.freeze
|
12
|
-
@recognition_key_analyzer = Analysis::Frequency.new_with_module(Analysis::Splitting)
|
13
|
-
|
14
|
-
super
|
15
|
-
end
|
16
|
-
|
17
|
-
# Adds recognition aspects to RouteSet#add_route.
|
18
|
-
def add_route(*args)
|
19
|
-
route = super
|
20
|
-
@recognition_key_analyzer << route.conditions
|
21
|
-
route
|
22
|
-
end
|
23
|
-
|
24
|
-
def recognize(obj)
|
25
|
-
raise 'route set not finalized' unless @recognition_graph
|
26
|
-
|
27
|
-
cache = {}
|
28
|
-
keys = @recognition_keys.map { |key|
|
29
|
-
if key.respond_to?(:call_source)
|
30
|
-
key.call(cache, obj)
|
31
|
-
else
|
32
|
-
obj.send(key)
|
33
|
-
end
|
34
|
-
}
|
35
|
-
@recognition_graph[*keys].each do |route|
|
36
|
-
matches, params = route.recognize(obj)
|
37
|
-
if matches && params
|
38
|
-
if block_given?
|
39
|
-
yield route, matches, params
|
40
|
-
else
|
41
|
-
return route, matches, params
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
nil
|
47
|
-
end
|
48
|
-
|
49
|
-
X_CASCADE = 'X-Cascade'.freeze
|
50
|
-
PASS = 'pass'.freeze
|
51
|
-
PATH_INFO = 'PATH_INFO'.freeze
|
52
|
-
|
53
|
-
# Rack compatible recognition and dispatching method. Routes are
|
54
|
-
# tried until one returns a non-catch status code. If no routes
|
55
|
-
# match, the catch status code is returned.
|
56
|
-
#
|
57
|
-
# This method can only be invoked after the RouteSet has been
|
58
|
-
# finalized.
|
59
|
-
def call(env)
|
60
|
-
raise 'route set not finalized' unless @recognition_graph
|
61
|
-
|
62
|
-
env[PATH_INFO] = Utils.normalize_path(env[PATH_INFO])
|
63
|
-
|
64
|
-
request = nil
|
65
|
-
req = @request_class.new(env)
|
66
|
-
recognize(req) do |route, matches, params|
|
67
|
-
# TODO: We only want to unescape params from uri related methods
|
68
|
-
params.each { |k, v| params[k] = Utils.unescape_uri(v) if v.is_a?(String) }
|
69
|
-
|
70
|
-
if route.prefix?
|
71
|
-
env[Prefix::KEY] = matches[:path_info].to_s
|
72
|
-
end
|
73
|
-
|
74
|
-
env[@parameters_key] = params
|
75
|
-
result = route.app.call(env)
|
76
|
-
return result unless result[1][X_CASCADE] == PASS
|
77
|
-
end
|
78
|
-
|
79
|
-
request || [404, {'Content-Type' => 'text/html', 'X-Cascade' => 'pass'}, ['Not Found']]
|
80
|
-
end
|
81
|
-
|
82
|
-
def rehash #:nodoc:
|
83
|
-
@recognition_keys = build_recognition_keys
|
84
|
-
@recognition_graph = build_recognition_graph
|
85
|
-
|
86
|
-
super
|
87
|
-
end
|
88
|
-
|
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
|
-
private
|
99
|
-
def expire!
|
100
|
-
@recognition_keys = @recognition_graph = nil
|
101
|
-
@recognition_key_analyzer.expire!
|
102
|
-
super
|
103
|
-
end
|
104
|
-
|
105
|
-
def flush!
|
106
|
-
@recognition_key_analyzer = nil
|
107
|
-
super
|
108
|
-
end
|
109
|
-
|
110
|
-
def build_recognition_graph
|
111
|
-
build_nested_route_set(@recognition_keys) { |k, i|
|
112
|
-
@recognition_key_analyzer.possible_keys[i][k]
|
113
|
-
}
|
114
|
-
end
|
115
|
-
|
116
|
-
def build_recognition_keys
|
117
|
-
@recognition_key_analyzer.report
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|