actionpack 4.1.7 → 4.2.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of actionpack might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +311 -527
- data/README.rdoc +7 -2
- data/lib/abstract_controller/base.rb +16 -6
- data/lib/abstract_controller/callbacks.rb +28 -51
- data/lib/abstract_controller/helpers.rb +11 -4
- data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
- data/lib/abstract_controller/url_for.rb +1 -1
- data/lib/action_controller/base.rb +2 -1
- data/lib/action_controller/caching/fragments.rb +7 -1
- data/lib/action_controller/caching.rb +1 -1
- data/lib/action_controller/log_subscriber.rb +26 -26
- data/lib/action_controller/metal/conditional_get.rb +37 -12
- data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
- data/lib/action_controller/metal/exceptions.rb +1 -1
- data/lib/action_controller/metal/force_ssl.rb +1 -1
- data/lib/action_controller/metal/head.rb +7 -3
- data/lib/action_controller/metal/http_authentication.rb +14 -9
- data/lib/action_controller/metal/instrumentation.rb +8 -5
- data/lib/action_controller/metal/live.rb +57 -6
- data/lib/action_controller/metal/mime_responds.rb +23 -246
- data/lib/action_controller/metal/params_wrapper.rb +2 -2
- data/lib/action_controller/metal/rack_delegation.rb +1 -1
- data/lib/action_controller/metal/redirecting.rb +14 -8
- data/lib/action_controller/metal/renderers.rb +30 -10
- data/lib/action_controller/metal/rendering.rb +2 -6
- data/lib/action_controller/metal/request_forgery_protection.rb +78 -7
- data/lib/action_controller/metal/streaming.rb +1 -1
- data/lib/action_controller/metal/strong_parameters.rb +125 -12
- data/lib/action_controller/metal/url_for.rb +11 -12
- data/lib/action_controller/metal.rb +12 -11
- data/lib/action_controller/model_naming.rb +1 -1
- data/lib/action_controller/railtie.rb +4 -0
- data/lib/action_controller/test_case.rb +112 -75
- data/lib/action_controller.rb +1 -1
- data/lib/action_dispatch/http/cache.rb +5 -4
- data/lib/action_dispatch/http/filter_parameters.rb +2 -2
- data/lib/action_dispatch/http/headers.rb +43 -9
- data/lib/action_dispatch/http/mime_negotiation.rb +10 -3
- data/lib/action_dispatch/http/mime_type.rb +2 -2
- data/lib/action_dispatch/http/parameter_filter.rb +1 -1
- data/lib/action_dispatch/http/parameters.rb +11 -26
- data/lib/action_dispatch/http/request.rb +37 -11
- data/lib/action_dispatch/http/response.rb +70 -18
- data/lib/action_dispatch/http/upload.rb +3 -8
- data/lib/action_dispatch/http/url.rb +88 -69
- data/lib/action_dispatch/journey/formatter.rb +33 -17
- data/lib/action_dispatch/journey/gtg/builder.rb +3 -3
- data/lib/action_dispatch/journey/gtg/simulator.rb +10 -7
- data/lib/action_dispatch/journey/gtg/transition_table.rb +20 -28
- data/lib/action_dispatch/journey/nfa/dot.rb +2 -2
- data/lib/action_dispatch/journey/nfa/simulator.rb +1 -1
- data/lib/action_dispatch/journey/nfa/transition_table.rb +5 -5
- data/lib/action_dispatch/journey/nodes/node.rb +4 -0
- data/lib/action_dispatch/journey/parser.rb +52 -60
- data/lib/action_dispatch/journey/parser.y +11 -10
- data/lib/action_dispatch/journey/path/pattern.rb +16 -19
- data/lib/action_dispatch/journey/route.rb +3 -18
- data/lib/action_dispatch/journey/router/strexp.rb +9 -6
- data/lib/action_dispatch/journey/router.rb +53 -77
- data/lib/action_dispatch/journey/scanner.rb +5 -5
- data/lib/action_dispatch/journey/visitors.rb +81 -92
- data/lib/action_dispatch/journey/visualizer/fsm.css +0 -4
- data/lib/action_dispatch/journey/visualizer/index.html.erb +2 -2
- data/lib/action_dispatch/middleware/callbacks.rb +1 -1
- data/lib/action_dispatch/middleware/cookies.rb +29 -29
- data/lib/action_dispatch/middleware/debug_exceptions.rb +15 -4
- data/lib/action_dispatch/middleware/exception_wrapper.rb +50 -18
- data/lib/action_dispatch/middleware/flash.rb +13 -7
- data/lib/action_dispatch/middleware/params_parser.rb +1 -1
- data/lib/action_dispatch/middleware/public_exceptions.rb +12 -3
- data/lib/action_dispatch/middleware/remote_ip.rb +40 -54
- data/lib/action_dispatch/middleware/request_id.rb +1 -1
- data/lib/action_dispatch/middleware/session/cookie_store.rb +1 -1
- data/lib/action_dispatch/middleware/show_exceptions.rb +1 -0
- data/lib/action_dispatch/middleware/static.rb +66 -37
- data/lib/action_dispatch/middleware/templates/rescues/_source.erb +21 -19
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +37 -9
- data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +2 -8
- data/lib/action_dispatch/middleware/templates/rescues/{diagnostics.erb → diagnostics.html.erb} +0 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +6 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +4 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +2 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +1 -24
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +0 -1
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +120 -64
- data/lib/action_dispatch/routing/endpoint.rb +10 -0
- data/lib/action_dispatch/routing/inspector.rb +5 -12
- data/lib/action_dispatch/routing/mapper.rb +410 -281
- data/lib/action_dispatch/routing/polymorphic_routes.rb +191 -79
- data/lib/action_dispatch/routing/redirection.rb +10 -12
- data/lib/action_dispatch/routing/route_set.rb +297 -168
- data/lib/action_dispatch/routing/url_for.rb +15 -4
- data/lib/action_dispatch/testing/assertions/dom.rb +2 -26
- data/lib/action_dispatch/testing/assertions/response.rb +2 -7
- data/lib/action_dispatch/testing/assertions/routing.rb +22 -22
- data/lib/action_dispatch/testing/assertions/selector.rb +2 -429
- data/lib/action_dispatch/testing/assertions/tag.rb +2 -134
- data/lib/action_dispatch/testing/assertions.rb +11 -7
- data/lib/action_dispatch/testing/integration.rb +24 -19
- data/lib/action_dispatch/testing/test_request.rb +1 -1
- data/lib/action_dispatch/testing/test_response.rb +7 -0
- data/lib/action_pack/gem_version.rb +3 -3
- metadata +55 -13
- data/lib/action_controller/metal/responder.rb +0 -297
@@ -16,9 +16,9 @@ module ActionDispatch
|
|
16
16
|
# end
|
17
17
|
# " #{n.object_id} [label=\"#{label}\", shape=box];"
|
18
18
|
#}
|
19
|
-
#memo_edges = memos.
|
19
|
+
#memo_edges = memos.flat_map { |k, memos|
|
20
20
|
# (memos || []).map { |v| " #{k} -> #{v.object_id};" }
|
21
|
-
#}.
|
21
|
+
#}.uniq
|
22
22
|
|
23
23
|
<<-eodot
|
24
24
|
digraph nfa {
|
@@ -42,7 +42,7 @@ module ActionDispatch
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def states
|
45
|
-
(@table.keys + @table.values.
|
45
|
+
(@table.keys + @table.values.flat_map(&:keys)).uniq
|
46
46
|
end
|
47
47
|
|
48
48
|
# Returns a generalized transition graph with reduced states. The states
|
@@ -93,7 +93,7 @@ module ActionDispatch
|
|
93
93
|
# Returns set of NFA states to which there is a transition on ast symbol
|
94
94
|
# +a+ from some state +s+ in +t+.
|
95
95
|
def following_states(t, a)
|
96
|
-
Array(t).
|
96
|
+
Array(t).flat_map { |s| inverted[s][a] }.uniq
|
97
97
|
end
|
98
98
|
|
99
99
|
# Returns set of NFA states to which there is a transition on ast symbol
|
@@ -107,7 +107,7 @@ module ActionDispatch
|
|
107
107
|
end
|
108
108
|
|
109
109
|
def alphabet
|
110
|
-
inverted.values.
|
110
|
+
inverted.values.flat_map(&:keys).compact.uniq.sort_by { |x| x.to_s }
|
111
111
|
end
|
112
112
|
|
113
113
|
# Returns a set of NFA states reachable from some NFA state +s+ in set
|
@@ -131,9 +131,9 @@ module ActionDispatch
|
|
131
131
|
end
|
132
132
|
|
133
133
|
def transitions
|
134
|
-
@table.
|
134
|
+
@table.flat_map { |to, hash|
|
135
135
|
hash.map { |from, sym| [from, sym, to] }
|
136
|
-
}
|
136
|
+
}
|
137
137
|
end
|
138
138
|
|
139
139
|
private
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# DO NOT MODIFY!!!!
|
3
|
-
# This file is automatically generated by Racc 1.4.
|
4
|
-
# from Racc
|
3
|
+
# This file is automatically generated by Racc 1.4.11
|
4
|
+
# from Racc grammer file "".
|
5
5
|
#
|
6
6
|
|
7
7
|
require 'racc/parser.rb'
|
@@ -9,42 +9,38 @@ require 'racc/parser.rb'
|
|
9
9
|
|
10
10
|
require 'action_dispatch/journey/parser_extras'
|
11
11
|
module ActionDispatch
|
12
|
-
module Journey
|
13
|
-
class Parser < Racc::Parser
|
12
|
+
module Journey
|
13
|
+
class Parser < Racc::Parser
|
14
14
|
##### State transition tables begin ###
|
15
15
|
|
16
16
|
racc_action_table = [
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
16, 8, 13, 15, 14, 7, nil, 16, 8 ]
|
17
|
+
13, 15, 14, 7, 21, 16, 8, 19, 13, 15,
|
18
|
+
14, 7, 17, 16, 8, 13, 15, 14, 7, 24,
|
19
|
+
16, 8, 13, 15, 14, 7, 19, 16, 8 ]
|
21
20
|
|
22
21
|
racc_action_check = [
|
23
|
-
|
24
|
-
|
25
|
-
7, 7,
|
26
|
-
19, 19, 0, 0, 0, 0, nil, 0, 0 ]
|
22
|
+
2, 2, 2, 2, 17, 2, 2, 2, 0, 0,
|
23
|
+
0, 0, 1, 0, 0, 19, 19, 19, 19, 20,
|
24
|
+
19, 19, 7, 7, 7, 7, 22, 7, 7 ]
|
27
25
|
|
28
26
|
racc_action_pointer = [
|
29
|
-
|
30
|
-
nil, nil, nil, nil, nil, nil, nil,
|
31
|
-
|
27
|
+
6, 12, -2, nil, nil, nil, nil, 20, nil, nil,
|
28
|
+
nil, nil, nil, nil, nil, nil, nil, 4, nil, 13,
|
29
|
+
13, nil, 17, nil, nil ]
|
32
30
|
|
33
31
|
racc_action_default = [
|
34
|
-
-
|
35
|
-
-
|
36
|
-
-
|
32
|
+
-19, -19, -2, -3, -4, -5, -6, -19, -10, -11,
|
33
|
+
-12, -13, -14, -15, -16, -17, -18, -19, -1, -19,
|
34
|
+
-19, 25, -8, -9, -7 ]
|
37
35
|
|
38
36
|
racc_goto_table = [
|
39
|
-
|
40
|
-
nil, nil, nil, nil, nil, nil, nil, nil, 22, 18 ]
|
37
|
+
1, 22, 18, 23, nil, nil, nil, 20 ]
|
41
38
|
|
42
39
|
racc_goto_check = [
|
43
|
-
2, 1,
|
44
|
-
nil, nil, nil, nil, nil, nil, nil, nil, 2, 2 ]
|
40
|
+
1, 2, 1, 3, nil, nil, nil, 1 ]
|
45
41
|
|
46
42
|
racc_goto_pointer = [
|
47
|
-
nil,
|
43
|
+
nil, 0, -18, -16, nil, nil, nil, nil, nil, nil,
|
48
44
|
nil ]
|
49
45
|
|
50
46
|
racc_goto_default = [
|
@@ -61,19 +57,20 @@ racc_reduce_table = [
|
|
61
57
|
1, 12, :_reduce_none,
|
62
58
|
3, 15, :_reduce_7,
|
63
59
|
3, 13, :_reduce_8,
|
64
|
-
|
60
|
+
3, 13, :_reduce_9,
|
61
|
+
1, 16, :_reduce_10,
|
65
62
|
1, 14, :_reduce_none,
|
66
63
|
1, 14, :_reduce_none,
|
67
64
|
1, 14, :_reduce_none,
|
68
65
|
1, 14, :_reduce_none,
|
69
|
-
1, 19, :
|
70
|
-
1, 17, :
|
71
|
-
1, 18, :
|
72
|
-
1, 20, :
|
66
|
+
1, 19, :_reduce_15,
|
67
|
+
1, 17, :_reduce_16,
|
68
|
+
1, 18, :_reduce_17,
|
69
|
+
1, 20, :_reduce_18 ]
|
73
70
|
|
74
|
-
racc_reduce_n =
|
71
|
+
racc_reduce_n = 19
|
75
72
|
|
76
|
-
racc_shift_n =
|
73
|
+
racc_shift_n = 25
|
77
74
|
|
78
75
|
racc_token_table = {
|
79
76
|
false => 0,
|
@@ -89,7 +86,7 @@ racc_token_table = {
|
|
89
86
|
|
90
87
|
racc_nt_base = 10
|
91
88
|
|
92
|
-
racc_use_result_var =
|
89
|
+
racc_use_result_var = false
|
93
90
|
|
94
91
|
Racc_arg = [
|
95
92
|
racc_action_table,
|
@@ -136,14 +133,12 @@ Racc_debug_parser = false
|
|
136
133
|
|
137
134
|
# reduce 0 omitted
|
138
135
|
|
139
|
-
def _reduce_1(val, _values
|
140
|
-
|
141
|
-
result
|
136
|
+
def _reduce_1(val, _values)
|
137
|
+
Cat.new(val.first, val.last)
|
142
138
|
end
|
143
139
|
|
144
|
-
def _reduce_2(val, _values
|
145
|
-
|
146
|
-
result
|
140
|
+
def _reduce_2(val, _values)
|
141
|
+
val.first
|
147
142
|
end
|
148
143
|
|
149
144
|
# reduce 3 omitted
|
@@ -154,22 +149,21 @@ end
|
|
154
149
|
|
155
150
|
# reduce 6 omitted
|
156
151
|
|
157
|
-
def _reduce_7(val, _values
|
158
|
-
|
159
|
-
result
|
152
|
+
def _reduce_7(val, _values)
|
153
|
+
Group.new(val[1])
|
160
154
|
end
|
161
155
|
|
162
|
-
def _reduce_8(val, _values
|
163
|
-
|
164
|
-
result
|
156
|
+
def _reduce_8(val, _values)
|
157
|
+
Or.new([val.first, val.last])
|
165
158
|
end
|
166
159
|
|
167
|
-
def _reduce_9(val, _values
|
168
|
-
|
169
|
-
result
|
160
|
+
def _reduce_9(val, _values)
|
161
|
+
Or.new([val.first, val.last])
|
170
162
|
end
|
171
163
|
|
172
|
-
|
164
|
+
def _reduce_10(val, _values)
|
165
|
+
Star.new(Symbol.new(val.last))
|
166
|
+
end
|
173
167
|
|
174
168
|
# reduce 11 omitted
|
175
169
|
|
@@ -177,27 +171,25 @@ end
|
|
177
171
|
|
178
172
|
# reduce 13 omitted
|
179
173
|
|
180
|
-
|
181
|
-
|
182
|
-
|
174
|
+
# reduce 14 omitted
|
175
|
+
|
176
|
+
def _reduce_15(val, _values)
|
177
|
+
Slash.new('/')
|
183
178
|
end
|
184
179
|
|
185
|
-
def
|
186
|
-
|
187
|
-
result
|
180
|
+
def _reduce_16(val, _values)
|
181
|
+
Symbol.new(val.first)
|
188
182
|
end
|
189
183
|
|
190
|
-
def
|
191
|
-
|
192
|
-
result
|
184
|
+
def _reduce_17(val, _values)
|
185
|
+
Literal.new(val.first)
|
193
186
|
end
|
194
187
|
|
195
|
-
def
|
196
|
-
|
197
|
-
result
|
188
|
+
def _reduce_18(val, _values)
|
189
|
+
Dot.new(val.first)
|
198
190
|
end
|
199
191
|
|
200
|
-
def _reduce_none(val, _values
|
192
|
+
def _reduce_none(val, _values)
|
201
193
|
val[0]
|
202
194
|
end
|
203
195
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
class ActionDispatch::Journey::Parser
|
2
|
-
|
2
|
+
options no_result_var
|
3
3
|
token SLASH LITERAL SYMBOL LPAREN RPAREN DOT STAR OR
|
4
4
|
|
5
5
|
rule
|
6
6
|
expressions
|
7
|
-
: expressions
|
8
|
-
| expression {
|
7
|
+
: expression expressions { Cat.new(val.first, val.last) }
|
8
|
+
| expression { val.first }
|
9
9
|
| or
|
10
10
|
;
|
11
11
|
expression
|
@@ -14,13 +14,14 @@ rule
|
|
14
14
|
| star
|
15
15
|
;
|
16
16
|
group
|
17
|
-
: LPAREN expressions RPAREN {
|
17
|
+
: LPAREN expressions RPAREN { Group.new(val[1]) }
|
18
18
|
;
|
19
19
|
or
|
20
|
-
:
|
20
|
+
: expression OR expression { Or.new([val.first, val.last]) }
|
21
|
+
| expression OR or { Or.new([val.first, val.last]) }
|
21
22
|
;
|
22
23
|
star
|
23
|
-
: STAR {
|
24
|
+
: STAR { Star.new(Symbol.new(val.last)) }
|
24
25
|
;
|
25
26
|
terminal
|
26
27
|
: symbol
|
@@ -29,16 +30,16 @@ rule
|
|
29
30
|
| dot
|
30
31
|
;
|
31
32
|
slash
|
32
|
-
: SLASH {
|
33
|
+
: SLASH { Slash.new('/') }
|
33
34
|
;
|
34
35
|
symbol
|
35
|
-
: SYMBOL {
|
36
|
+
: SYMBOL { Symbol.new(val.first) }
|
36
37
|
;
|
37
38
|
literal
|
38
|
-
: LITERAL {
|
39
|
+
: LITERAL { Literal.new(val.first) }
|
39
40
|
;
|
40
41
|
dot
|
41
|
-
: DOT {
|
42
|
+
: DOT { Dot.new(val.first) }
|
42
43
|
;
|
43
44
|
|
44
45
|
end
|
@@ -1,27 +1,20 @@
|
|
1
|
+
require 'action_dispatch/journey/router/strexp'
|
2
|
+
|
1
3
|
module ActionDispatch
|
2
4
|
module Journey # :nodoc:
|
3
5
|
module Path # :nodoc:
|
4
6
|
class Pattern # :nodoc:
|
5
7
|
attr_reader :spec, :requirements, :anchored
|
6
8
|
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
@anchored = true
|
9
|
+
def self.from_string string
|
10
|
+
new Journey::Router::Strexp.build(string, {}, ["/.?"], true)
|
11
|
+
end
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
when Router::Strexp
|
18
|
-
@spec = parser.parse(strexp.path)
|
19
|
-
@requirements = strexp.requirements
|
20
|
-
@separators = strexp.separators.join
|
21
|
-
@anchored = strexp.anchor
|
22
|
-
else
|
23
|
-
raise ArgumentError, "Bad expression: #{strexp}"
|
24
|
-
end
|
13
|
+
def initialize(strexp)
|
14
|
+
@spec = strexp.ast
|
15
|
+
@requirements = strexp.requirements
|
16
|
+
@separators = strexp.separators.join
|
17
|
+
@anchored = strexp.anchor
|
25
18
|
|
26
19
|
@names = nil
|
27
20
|
@optional_names = nil
|
@@ -30,6 +23,10 @@ module ActionDispatch
|
|
30
23
|
@offsets = nil
|
31
24
|
end
|
32
25
|
|
26
|
+
def build_formatter
|
27
|
+
Visitors::FormatBuilder.new.accept(spec)
|
28
|
+
end
|
29
|
+
|
33
30
|
def ast
|
34
31
|
@spec.grep(Nodes::Symbol).each do |node|
|
35
32
|
re = @requirements[node.to_sym]
|
@@ -53,9 +50,9 @@ module ActionDispatch
|
|
53
50
|
end
|
54
51
|
|
55
52
|
def optional_names
|
56
|
-
@optional_names ||= spec.grep(Nodes::Group).
|
53
|
+
@optional_names ||= spec.grep(Nodes::Group).flat_map { |group|
|
57
54
|
group.grep(Nodes::Symbol)
|
58
|
-
}.
|
55
|
+
}.map { |n| n.name }.uniq
|
59
56
|
end
|
60
57
|
|
61
58
|
class RegexpOffsets < Journey::Visitors::Visitor # :nodoc:
|
@@ -16,14 +16,6 @@ module ActionDispatch
|
|
16
16
|
@app = app
|
17
17
|
@path = path
|
18
18
|
|
19
|
-
# Unwrap any constraints so we can see what's inside for route generation.
|
20
|
-
# This allows the formatter to skip over any mounted applications or redirects
|
21
|
-
# that shouldn't be matched when using a url_for without a route name.
|
22
|
-
while app.is_a?(Routing::Mapper::Constraints) do
|
23
|
-
app = app.app
|
24
|
-
end
|
25
|
-
@dispatcher = app.is_a?(Routing::RouteSet::Dispatcher)
|
26
|
-
|
27
19
|
@constraints = constraints
|
28
20
|
@defaults = defaults
|
29
21
|
@required_defaults = nil
|
@@ -31,6 +23,7 @@ module ActionDispatch
|
|
31
23
|
@parts = nil
|
32
24
|
@decorated_ast = nil
|
33
25
|
@precedence = 0
|
26
|
+
@path_formatter = @path.build_formatter
|
34
27
|
end
|
35
28
|
|
36
29
|
def ast
|
@@ -72,15 +65,7 @@ module ActionDispatch
|
|
72
65
|
alias :segment_keys :parts
|
73
66
|
|
74
67
|
def format(path_options)
|
75
|
-
|
76
|
-
value.to_s == defaults[key].to_s && !required_parts.include?(key)
|
77
|
-
end
|
78
|
-
|
79
|
-
Visitors::Formatter.new(path_options).accept(path.spec)
|
80
|
-
end
|
81
|
-
|
82
|
-
def optimized_path
|
83
|
-
Visitors::OptimizedPath.new.accept(path.spec)
|
68
|
+
@path_formatter.evaluate path_options
|
84
69
|
end
|
85
70
|
|
86
71
|
def optional_parts
|
@@ -106,7 +91,7 @@ module ActionDispatch
|
|
106
91
|
end
|
107
92
|
|
108
93
|
def dispatcher?
|
109
|
-
@dispatcher
|
94
|
+
@app.dispatcher?
|
110
95
|
end
|
111
96
|
|
112
97
|
def matches?(request)
|
@@ -6,18 +6,21 @@ module ActionDispatch
|
|
6
6
|
alias :compile :new
|
7
7
|
end
|
8
8
|
|
9
|
-
attr_reader :path, :requirements, :separators, :anchor
|
9
|
+
attr_reader :path, :requirements, :separators, :anchor, :ast
|
10
10
|
|
11
|
-
def
|
11
|
+
def self.build(path, requirements, separators, anchor = true)
|
12
|
+
parser = Journey::Parser.new
|
13
|
+
ast = parser.parse path
|
14
|
+
new ast, path, requirements, separators, anchor
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(ast, path, requirements, separators, anchor = true)
|
18
|
+
@ast = ast
|
12
19
|
@path = path
|
13
20
|
@requirements = requirements
|
14
21
|
@separators = separators
|
15
22
|
@anchor = anchor
|
16
23
|
end
|
17
|
-
|
18
|
-
def names
|
19
|
-
@path.scan(/:\w+/).map { |s| s.tr(':', '') }
|
20
|
-
end
|
21
24
|
end
|
22
25
|
end
|
23
26
|
end
|