actionpack 4.2.10 → 5.0.0
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 +553 -401
- data/MIT-LICENSE +1 -1
- data/README.rdoc +2 -3
- data/lib/abstract_controller/base.rb +28 -38
- data/lib/{action_controller → abstract_controller}/caching/fragments.rb +51 -11
- data/lib/abstract_controller/caching.rb +62 -0
- data/lib/abstract_controller/callbacks.rb +52 -19
- data/lib/abstract_controller/collector.rb +4 -9
- data/lib/abstract_controller/error.rb +4 -0
- data/lib/abstract_controller/helpers.rb +4 -3
- data/lib/abstract_controller/railties/routes_helpers.rb +2 -2
- data/lib/abstract_controller/rendering.rb +28 -18
- data/lib/abstract_controller/translation.rb +8 -7
- data/lib/abstract_controller.rb +6 -2
- data/lib/action_controller/api/api_rendering.rb +14 -0
- data/lib/action_controller/api.rb +147 -0
- data/lib/action_controller/base.rb +10 -13
- data/lib/action_controller/caching.rb +13 -58
- data/lib/action_controller/form_builder.rb +48 -0
- data/lib/action_controller/log_subscriber.rb +3 -10
- data/lib/action_controller/metal/basic_implicit_render.rb +11 -0
- data/lib/action_controller/metal/conditional_get.rb +106 -34
- data/lib/action_controller/metal/cookies.rb +1 -3
- data/lib/action_controller/metal/data_streaming.rb +11 -32
- data/lib/action_controller/metal/etag_with_template_digest.rb +1 -1
- data/lib/action_controller/metal/exceptions.rb +11 -6
- data/lib/action_controller/metal/force_ssl.rb +10 -10
- data/lib/action_controller/metal/head.rb +14 -8
- data/lib/action_controller/metal/helpers.rb +15 -6
- data/lib/action_controller/metal/http_authentication.rb +44 -35
- data/lib/action_controller/metal/implicit_render.rb +61 -6
- data/lib/action_controller/metal/instrumentation.rb +5 -5
- data/lib/action_controller/metal/live.rb +66 -88
- data/lib/action_controller/metal/mime_responds.rb +27 -42
- data/lib/action_controller/metal/params_wrapper.rb +8 -8
- data/lib/action_controller/metal/redirecting.rb +32 -9
- data/lib/action_controller/metal/renderers.rb +85 -40
- data/lib/action_controller/metal/rendering.rb +38 -6
- data/lib/action_controller/metal/request_forgery_protection.rb +126 -48
- data/lib/action_controller/metal/rescue.rb +3 -12
- data/lib/action_controller/metal/streaming.rb +4 -4
- data/lib/action_controller/metal/strong_parameters.rb +293 -90
- data/lib/action_controller/metal/testing.rb +1 -12
- data/lib/action_controller/metal/url_for.rb +12 -5
- data/lib/action_controller/metal.rb +88 -63
- data/lib/action_controller/renderer.rb +111 -0
- data/lib/action_controller/template_assertions.rb +9 -0
- data/lib/action_controller/test_case.rb +288 -368
- data/lib/action_controller.rb +12 -9
- data/lib/action_dispatch/http/cache.rb +73 -34
- data/lib/action_dispatch/http/filter_parameters.rb +15 -11
- data/lib/action_dispatch/http/filter_redirect.rb +7 -8
- data/lib/action_dispatch/http/headers.rb +44 -13
- data/lib/action_dispatch/http/mime_negotiation.rb +41 -23
- data/lib/action_dispatch/http/mime_type.rb +126 -90
- data/lib/action_dispatch/http/mime_types.rb +3 -4
- data/lib/action_dispatch/http/parameter_filter.rb +18 -8
- data/lib/action_dispatch/http/parameters.rb +54 -41
- data/lib/action_dispatch/http/request.rb +149 -82
- data/lib/action_dispatch/http/response.rb +206 -102
- data/lib/action_dispatch/http/url.rb +117 -8
- data/lib/action_dispatch/journey/formatter.rb +39 -28
- data/lib/action_dispatch/journey/gtg/transition_table.rb +1 -1
- data/lib/action_dispatch/journey/nfa/dot.rb +0 -2
- data/lib/action_dispatch/journey/nfa/transition_table.rb +1 -46
- data/lib/action_dispatch/journey/nodes/node.rb +14 -4
- data/lib/action_dispatch/journey/parser_extras.rb +4 -0
- data/lib/action_dispatch/journey/path/pattern.rb +38 -42
- data/lib/action_dispatch/journey/route.rb +74 -19
- data/lib/action_dispatch/journey/router/utils.rb +5 -5
- data/lib/action_dispatch/journey/router.rb +5 -9
- data/lib/action_dispatch/journey/routes.rb +14 -15
- data/lib/action_dispatch/journey/visitors.rb +86 -43
- data/lib/action_dispatch/middleware/callbacks.rb +10 -1
- data/lib/action_dispatch/middleware/cookies.rb +189 -135
- data/lib/action_dispatch/middleware/debug_exceptions.rb +124 -49
- data/lib/action_dispatch/middleware/exception_wrapper.rb +21 -21
- data/lib/action_dispatch/middleware/executor.rb +19 -0
- data/lib/action_dispatch/middleware/flash.rb +66 -45
- data/lib/action_dispatch/middleware/params_parser.rb +32 -46
- data/lib/action_dispatch/middleware/public_exceptions.rb +2 -2
- data/lib/action_dispatch/middleware/reloader.rb +14 -58
- data/lib/action_dispatch/middleware/remote_ip.rb +29 -19
- data/lib/action_dispatch/middleware/request_id.rb +11 -6
- data/lib/action_dispatch/middleware/session/abstract_store.rb +23 -11
- data/lib/action_dispatch/middleware/session/cache_store.rb +9 -6
- data/lib/action_dispatch/middleware/session/cookie_store.rb +30 -24
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +4 -0
- data/lib/action_dispatch/middleware/show_exceptions.rb +11 -9
- data/lib/action_dispatch/middleware/ssl.rb +115 -36
- data/lib/action_dispatch/middleware/stack.rb +44 -40
- data/lib/action_dispatch/middleware/static.rb +51 -35
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +2 -14
- data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +1 -1
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +1 -1
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +4 -4
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +59 -63
- data/lib/action_dispatch/railtie.rb +2 -2
- data/lib/action_dispatch/request/session.rb +69 -33
- data/lib/action_dispatch/request/utils.rb +51 -19
- data/lib/action_dispatch/routing/inspector.rb +32 -43
- data/lib/action_dispatch/routing/mapper.rb +491 -338
- data/lib/action_dispatch/routing/polymorphic_routes.rb +8 -14
- data/lib/action_dispatch/routing/redirection.rb +3 -3
- data/lib/action_dispatch/routing/route_set.rb +145 -238
- data/lib/action_dispatch/routing/url_for.rb +27 -10
- data/lib/action_dispatch/routing.rb +17 -13
- data/lib/action_dispatch/testing/assertion_response.rb +45 -0
- data/lib/action_dispatch/testing/assertions/response.rb +38 -20
- data/lib/action_dispatch/testing/assertions/routing.rb +11 -10
- data/lib/action_dispatch/testing/assertions.rb +1 -1
- data/lib/action_dispatch/testing/integration.rb +368 -97
- data/lib/action_dispatch/testing/test_process.rb +5 -6
- data/lib/action_dispatch/testing/test_request.rb +22 -31
- data/lib/action_dispatch/testing/test_response.rb +7 -4
- data/lib/action_dispatch.rb +3 -1
- data/lib/action_pack/gem_version.rb +3 -3
- data/lib/action_pack.rb +1 -1
- metadata +30 -34
- data/lib/action_controller/metal/hide_actions.rb +0 -40
- data/lib/action_controller/metal/rack_delegation.rb +0 -32
- data/lib/action_controller/middleware.rb +0 -39
- data/lib/action_controller/model_naming.rb +0 -12
- data/lib/action_dispatch/journey/backwards.rb +0 -5
- data/lib/action_dispatch/journey/router/strexp.rb +0 -27
- data/lib/action_dispatch/testing/assertions/dom.rb +0 -3
- data/lib/action_dispatch/testing/assertions/selector.rb +0 -3
- data/lib/action_dispatch/testing/assertions/tag.rb +0 -3
- /data/lib/action_dispatch/middleware/templates/rescues/{_source.erb → _source.html.erb} +0 -0
@@ -5,13 +5,13 @@ module ActionDispatch
|
|
5
5
|
class Routes # :nodoc:
|
6
6
|
include Enumerable
|
7
7
|
|
8
|
-
attr_reader :routes, :
|
8
|
+
attr_reader :routes, :custom_routes, :anchored_routes
|
9
9
|
|
10
10
|
def initialize
|
11
11
|
@routes = []
|
12
|
-
@named_routes = {}
|
13
12
|
@ast = nil
|
14
|
-
@
|
13
|
+
@anchored_routes = []
|
14
|
+
@custom_routes = []
|
15
15
|
@simulator = nil
|
16
16
|
end
|
17
17
|
|
@@ -34,18 +34,21 @@ module ActionDispatch
|
|
34
34
|
|
35
35
|
def clear
|
36
36
|
routes.clear
|
37
|
-
|
37
|
+
anchored_routes.clear
|
38
|
+
custom_routes.clear
|
38
39
|
end
|
39
40
|
|
40
|
-
def
|
41
|
-
|
42
|
-
|
41
|
+
def partition_route(route)
|
42
|
+
if route.path.anchored && route.ast.grep(Nodes::Symbol).all?(&:default_regexp?)
|
43
|
+
anchored_routes << route
|
44
|
+
else
|
45
|
+
custom_routes << route
|
43
46
|
end
|
44
47
|
end
|
45
48
|
|
46
49
|
def ast
|
47
50
|
@ast ||= begin
|
48
|
-
asts =
|
51
|
+
asts = anchored_routes.map(&:ast)
|
49
52
|
Nodes::Or.new(asts) unless asts.empty?
|
50
53
|
end
|
51
54
|
end
|
@@ -57,13 +60,10 @@ module ActionDispatch
|
|
57
60
|
end
|
58
61
|
end
|
59
62
|
|
60
|
-
|
61
|
-
|
62
|
-
route = Route.new(name, app, path, conditions, defaults)
|
63
|
-
|
64
|
-
route.precedence = routes.length
|
63
|
+
def add_route(name, mapping)
|
64
|
+
route = mapping.make_route name, routes.length
|
65
65
|
routes << route
|
66
|
-
|
66
|
+
partition_route(route)
|
67
67
|
clear_cache!
|
68
68
|
route
|
69
69
|
end
|
@@ -72,7 +72,6 @@ module ActionDispatch
|
|
72
72
|
|
73
73
|
def clear_cache!
|
74
74
|
@ast = nil
|
75
|
-
@partitioned_routes = nil
|
76
75
|
@simulator = nil
|
77
76
|
end
|
78
77
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
1
|
module ActionDispatch
|
4
2
|
module Journey # :nodoc:
|
5
3
|
class Format
|
@@ -92,6 +90,45 @@ module ActionDispatch
|
|
92
90
|
end
|
93
91
|
end
|
94
92
|
|
93
|
+
class FunctionalVisitor # :nodoc:
|
94
|
+
DISPATCH_CACHE = {}
|
95
|
+
|
96
|
+
def accept(node, seed)
|
97
|
+
visit(node, seed)
|
98
|
+
end
|
99
|
+
|
100
|
+
def visit node, seed
|
101
|
+
send(DISPATCH_CACHE[node.type], node, seed)
|
102
|
+
end
|
103
|
+
|
104
|
+
def binary(node, seed)
|
105
|
+
visit(node.right, visit(node.left, seed))
|
106
|
+
end
|
107
|
+
def visit_CAT(n, seed); binary(n, seed); end
|
108
|
+
|
109
|
+
def nary(node, seed)
|
110
|
+
node.children.inject(seed) { |s, c| visit(c, s) }
|
111
|
+
end
|
112
|
+
def visit_OR(n, seed); nary(n, seed); end
|
113
|
+
|
114
|
+
def unary(node, seed)
|
115
|
+
visit(node.left, seed)
|
116
|
+
end
|
117
|
+
def visit_GROUP(n, seed); unary(n, seed); end
|
118
|
+
def visit_STAR(n, seed); unary(n, seed); end
|
119
|
+
|
120
|
+
def terminal(node, seed); seed; end
|
121
|
+
def visit_LITERAL(n, seed); terminal(n, seed); end
|
122
|
+
def visit_SYMBOL(n, seed); terminal(n, seed); end
|
123
|
+
def visit_SLASH(n, seed); terminal(n, seed); end
|
124
|
+
def visit_DOT(n, seed); terminal(n, seed); end
|
125
|
+
|
126
|
+
instance_methods(false).each do |pim|
|
127
|
+
next unless pim =~ /^visit_(.*)$/
|
128
|
+
DISPATCH_CACHE[$1.to_sym] = pim
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
95
132
|
class FormatBuilder < Visitor # :nodoc:
|
96
133
|
def accept(node); Journey::Format.new(super); end
|
97
134
|
def terminal(node); [node.left]; end
|
@@ -117,104 +154,110 @@ module ActionDispatch
|
|
117
154
|
end
|
118
155
|
|
119
156
|
# Loop through the requirements AST
|
120
|
-
class Each <
|
121
|
-
|
122
|
-
|
123
|
-
def initialize(block)
|
124
|
-
@block = block
|
125
|
-
end
|
126
|
-
|
127
|
-
def visit(node)
|
157
|
+
class Each < FunctionalVisitor # :nodoc:
|
158
|
+
def visit(node, block)
|
128
159
|
block.call(node)
|
129
160
|
super
|
130
161
|
end
|
162
|
+
|
163
|
+
INSTANCE = new
|
131
164
|
end
|
132
165
|
|
133
|
-
class String <
|
166
|
+
class String < FunctionalVisitor # :nodoc:
|
134
167
|
private
|
135
168
|
|
136
|
-
def binary(node)
|
137
|
-
|
169
|
+
def binary(node, seed)
|
170
|
+
visit(node.right, visit(node.left, seed))
|
138
171
|
end
|
139
172
|
|
140
|
-
def nary(node)
|
141
|
-
node.children.
|
173
|
+
def nary(node, seed)
|
174
|
+
last_child = node.children.last
|
175
|
+
node.children.inject(seed) { |s, c|
|
176
|
+
string = visit(c, s)
|
177
|
+
string << "|".freeze unless last_child == c
|
178
|
+
string
|
179
|
+
}
|
142
180
|
end
|
143
181
|
|
144
|
-
def terminal(node)
|
145
|
-
node.left
|
182
|
+
def terminal(node, seed)
|
183
|
+
seed + node.left
|
146
184
|
end
|
147
185
|
|
148
|
-
def visit_GROUP(node)
|
149
|
-
|
186
|
+
def visit_GROUP(node, seed)
|
187
|
+
visit(node.left, seed << "(".freeze) << ")".freeze
|
150
188
|
end
|
189
|
+
|
190
|
+
INSTANCE = new
|
151
191
|
end
|
152
192
|
|
153
|
-
class Dot <
|
193
|
+
class Dot < FunctionalVisitor # :nodoc:
|
154
194
|
def initialize
|
155
195
|
@nodes = []
|
156
196
|
@edges = []
|
157
197
|
end
|
158
198
|
|
159
|
-
def accept(node)
|
199
|
+
def accept(node, seed = [[], []])
|
160
200
|
super
|
201
|
+
nodes, edges = seed
|
161
202
|
<<-eodot
|
162
203
|
digraph parse_tree {
|
163
204
|
size="8,5"
|
164
205
|
node [shape = none];
|
165
206
|
edge [dir = none];
|
166
|
-
#{
|
167
|
-
#{
|
207
|
+
#{nodes.join "\n"}
|
208
|
+
#{edges.join("\n")}
|
168
209
|
}
|
169
210
|
eodot
|
170
211
|
end
|
171
212
|
|
172
213
|
private
|
173
214
|
|
174
|
-
def binary(node)
|
175
|
-
node.children.
|
176
|
-
|
177
|
-
|
215
|
+
def binary(node, seed)
|
216
|
+
seed.last.concat node.children.map { |c|
|
217
|
+
"#{node.object_id} -> #{c.object_id};"
|
218
|
+
}
|
178
219
|
super
|
179
220
|
end
|
180
221
|
|
181
|
-
def nary(node)
|
182
|
-
node.children.
|
183
|
-
|
184
|
-
|
222
|
+
def nary(node, seed)
|
223
|
+
seed.last.concat node.children.map { |c|
|
224
|
+
"#{node.object_id} -> #{c.object_id};"
|
225
|
+
}
|
185
226
|
super
|
186
227
|
end
|
187
228
|
|
188
|
-
def unary(node)
|
189
|
-
|
229
|
+
def unary(node, seed)
|
230
|
+
seed.last << "#{node.object_id} -> #{node.left.object_id};"
|
190
231
|
super
|
191
232
|
end
|
192
233
|
|
193
|
-
def visit_GROUP(node)
|
194
|
-
|
234
|
+
def visit_GROUP(node, seed)
|
235
|
+
seed.first << "#{node.object_id} [label=\"()\"];"
|
195
236
|
super
|
196
237
|
end
|
197
238
|
|
198
|
-
def visit_CAT(node)
|
199
|
-
|
239
|
+
def visit_CAT(node, seed)
|
240
|
+
seed.first << "#{node.object_id} [label=\"○\"];"
|
200
241
|
super
|
201
242
|
end
|
202
243
|
|
203
|
-
def visit_STAR(node)
|
204
|
-
|
244
|
+
def visit_STAR(node, seed)
|
245
|
+
seed.first << "#{node.object_id} [label=\"*\"];"
|
205
246
|
super
|
206
247
|
end
|
207
248
|
|
208
|
-
def visit_OR(node)
|
209
|
-
|
249
|
+
def visit_OR(node, seed)
|
250
|
+
seed.first << "#{node.object_id} [label=\"|\"];"
|
210
251
|
super
|
211
252
|
end
|
212
253
|
|
213
|
-
def terminal(node)
|
254
|
+
def terminal(node, seed)
|
214
255
|
value = node.left
|
215
256
|
|
216
|
-
|
257
|
+
seed.first << "#{node.object_id} [label=\"#{value}\"];"
|
258
|
+
seed
|
217
259
|
end
|
260
|
+
INSTANCE = new
|
218
261
|
end
|
219
262
|
end
|
220
263
|
end
|
@@ -7,7 +7,16 @@ module ActionDispatch
|
|
7
7
|
define_callbacks :call
|
8
8
|
|
9
9
|
class << self
|
10
|
-
|
10
|
+
def to_prepare(*args, &block)
|
11
|
+
ActiveSupport::Reloader.to_prepare(*args, &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_cleanup(*args, &block)
|
15
|
+
ActiveSupport::Reloader.to_complete(*args, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
deprecate to_prepare: 'use ActiveSupport::Reloader.to_prepare instead',
|
19
|
+
to_cleanup: 'use ActiveSupport::Reloader.to_complete instead'
|
11
20
|
|
12
21
|
def before(*args, &block)
|
13
22
|
set_callback(:call, :before, *args, &block)
|