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.

Files changed (131) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +553 -401
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +2 -3
  5. data/lib/abstract_controller/base.rb +28 -38
  6. data/lib/{action_controller → abstract_controller}/caching/fragments.rb +51 -11
  7. data/lib/abstract_controller/caching.rb +62 -0
  8. data/lib/abstract_controller/callbacks.rb +52 -19
  9. data/lib/abstract_controller/collector.rb +4 -9
  10. data/lib/abstract_controller/error.rb +4 -0
  11. data/lib/abstract_controller/helpers.rb +4 -3
  12. data/lib/abstract_controller/railties/routes_helpers.rb +2 -2
  13. data/lib/abstract_controller/rendering.rb +28 -18
  14. data/lib/abstract_controller/translation.rb +8 -7
  15. data/lib/abstract_controller.rb +6 -2
  16. data/lib/action_controller/api/api_rendering.rb +14 -0
  17. data/lib/action_controller/api.rb +147 -0
  18. data/lib/action_controller/base.rb +10 -13
  19. data/lib/action_controller/caching.rb +13 -58
  20. data/lib/action_controller/form_builder.rb +48 -0
  21. data/lib/action_controller/log_subscriber.rb +3 -10
  22. data/lib/action_controller/metal/basic_implicit_render.rb +11 -0
  23. data/lib/action_controller/metal/conditional_get.rb +106 -34
  24. data/lib/action_controller/metal/cookies.rb +1 -3
  25. data/lib/action_controller/metal/data_streaming.rb +11 -32
  26. data/lib/action_controller/metal/etag_with_template_digest.rb +1 -1
  27. data/lib/action_controller/metal/exceptions.rb +11 -6
  28. data/lib/action_controller/metal/force_ssl.rb +10 -10
  29. data/lib/action_controller/metal/head.rb +14 -8
  30. data/lib/action_controller/metal/helpers.rb +15 -6
  31. data/lib/action_controller/metal/http_authentication.rb +44 -35
  32. data/lib/action_controller/metal/implicit_render.rb +61 -6
  33. data/lib/action_controller/metal/instrumentation.rb +5 -5
  34. data/lib/action_controller/metal/live.rb +66 -88
  35. data/lib/action_controller/metal/mime_responds.rb +27 -42
  36. data/lib/action_controller/metal/params_wrapper.rb +8 -8
  37. data/lib/action_controller/metal/redirecting.rb +32 -9
  38. data/lib/action_controller/metal/renderers.rb +85 -40
  39. data/lib/action_controller/metal/rendering.rb +38 -6
  40. data/lib/action_controller/metal/request_forgery_protection.rb +126 -48
  41. data/lib/action_controller/metal/rescue.rb +3 -12
  42. data/lib/action_controller/metal/streaming.rb +4 -4
  43. data/lib/action_controller/metal/strong_parameters.rb +293 -90
  44. data/lib/action_controller/metal/testing.rb +1 -12
  45. data/lib/action_controller/metal/url_for.rb +12 -5
  46. data/lib/action_controller/metal.rb +88 -63
  47. data/lib/action_controller/renderer.rb +111 -0
  48. data/lib/action_controller/template_assertions.rb +9 -0
  49. data/lib/action_controller/test_case.rb +288 -368
  50. data/lib/action_controller.rb +12 -9
  51. data/lib/action_dispatch/http/cache.rb +73 -34
  52. data/lib/action_dispatch/http/filter_parameters.rb +15 -11
  53. data/lib/action_dispatch/http/filter_redirect.rb +7 -8
  54. data/lib/action_dispatch/http/headers.rb +44 -13
  55. data/lib/action_dispatch/http/mime_negotiation.rb +41 -23
  56. data/lib/action_dispatch/http/mime_type.rb +126 -90
  57. data/lib/action_dispatch/http/mime_types.rb +3 -4
  58. data/lib/action_dispatch/http/parameter_filter.rb +18 -8
  59. data/lib/action_dispatch/http/parameters.rb +54 -41
  60. data/lib/action_dispatch/http/request.rb +149 -82
  61. data/lib/action_dispatch/http/response.rb +206 -102
  62. data/lib/action_dispatch/http/url.rb +117 -8
  63. data/lib/action_dispatch/journey/formatter.rb +39 -28
  64. data/lib/action_dispatch/journey/gtg/transition_table.rb +1 -1
  65. data/lib/action_dispatch/journey/nfa/dot.rb +0 -2
  66. data/lib/action_dispatch/journey/nfa/transition_table.rb +1 -46
  67. data/lib/action_dispatch/journey/nodes/node.rb +14 -4
  68. data/lib/action_dispatch/journey/parser_extras.rb +4 -0
  69. data/lib/action_dispatch/journey/path/pattern.rb +38 -42
  70. data/lib/action_dispatch/journey/route.rb +74 -19
  71. data/lib/action_dispatch/journey/router/utils.rb +5 -5
  72. data/lib/action_dispatch/journey/router.rb +5 -9
  73. data/lib/action_dispatch/journey/routes.rb +14 -15
  74. data/lib/action_dispatch/journey/visitors.rb +86 -43
  75. data/lib/action_dispatch/middleware/callbacks.rb +10 -1
  76. data/lib/action_dispatch/middleware/cookies.rb +189 -135
  77. data/lib/action_dispatch/middleware/debug_exceptions.rb +124 -49
  78. data/lib/action_dispatch/middleware/exception_wrapper.rb +21 -21
  79. data/lib/action_dispatch/middleware/executor.rb +19 -0
  80. data/lib/action_dispatch/middleware/flash.rb +66 -45
  81. data/lib/action_dispatch/middleware/params_parser.rb +32 -46
  82. data/lib/action_dispatch/middleware/public_exceptions.rb +2 -2
  83. data/lib/action_dispatch/middleware/reloader.rb +14 -58
  84. data/lib/action_dispatch/middleware/remote_ip.rb +29 -19
  85. data/lib/action_dispatch/middleware/request_id.rb +11 -6
  86. data/lib/action_dispatch/middleware/session/abstract_store.rb +23 -11
  87. data/lib/action_dispatch/middleware/session/cache_store.rb +9 -6
  88. data/lib/action_dispatch/middleware/session/cookie_store.rb +30 -24
  89. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +4 -0
  90. data/lib/action_dispatch/middleware/show_exceptions.rb +11 -9
  91. data/lib/action_dispatch/middleware/ssl.rb +115 -36
  92. data/lib/action_dispatch/middleware/stack.rb +44 -40
  93. data/lib/action_dispatch/middleware/static.rb +51 -35
  94. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +2 -14
  95. data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
  96. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +1 -1
  97. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +1 -1
  98. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +4 -4
  99. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +59 -63
  100. data/lib/action_dispatch/railtie.rb +2 -2
  101. data/lib/action_dispatch/request/session.rb +69 -33
  102. data/lib/action_dispatch/request/utils.rb +51 -19
  103. data/lib/action_dispatch/routing/inspector.rb +32 -43
  104. data/lib/action_dispatch/routing/mapper.rb +491 -338
  105. data/lib/action_dispatch/routing/polymorphic_routes.rb +8 -14
  106. data/lib/action_dispatch/routing/redirection.rb +3 -3
  107. data/lib/action_dispatch/routing/route_set.rb +145 -238
  108. data/lib/action_dispatch/routing/url_for.rb +27 -10
  109. data/lib/action_dispatch/routing.rb +17 -13
  110. data/lib/action_dispatch/testing/assertion_response.rb +45 -0
  111. data/lib/action_dispatch/testing/assertions/response.rb +38 -20
  112. data/lib/action_dispatch/testing/assertions/routing.rb +11 -10
  113. data/lib/action_dispatch/testing/assertions.rb +1 -1
  114. data/lib/action_dispatch/testing/integration.rb +368 -97
  115. data/lib/action_dispatch/testing/test_process.rb +5 -6
  116. data/lib/action_dispatch/testing/test_request.rb +22 -31
  117. data/lib/action_dispatch/testing/test_response.rb +7 -4
  118. data/lib/action_dispatch.rb +3 -1
  119. data/lib/action_pack/gem_version.rb +3 -3
  120. data/lib/action_pack.rb +1 -1
  121. metadata +30 -34
  122. data/lib/action_controller/metal/hide_actions.rb +0 -40
  123. data/lib/action_controller/metal/rack_delegation.rb +0 -32
  124. data/lib/action_controller/middleware.rb +0 -39
  125. data/lib/action_controller/model_naming.rb +0 -12
  126. data/lib/action_dispatch/journey/backwards.rb +0 -5
  127. data/lib/action_dispatch/journey/router/strexp.rb +0 -27
  128. data/lib/action_dispatch/testing/assertions/dom.rb +0 -3
  129. data/lib/action_dispatch/testing/assertions/selector.rb +0 -3
  130. data/lib/action_dispatch/testing/assertions/tag.rb +0 -3
  131. /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, :named_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
- @partitioned_routes = nil
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
- named_routes.clear
37
+ anchored_routes.clear
38
+ custom_routes.clear
38
39
  end
39
40
 
40
- def partitioned_routes
41
- @partitioned_routes ||= routes.partition do |r|
42
- r.path.anchored && r.ast.grep(Nodes::Symbol).all?(&:default_regexp?)
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 = partitioned_routes.first.map(&:ast)
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
- # Add a route to the routing table.
61
- def add_route(app, path, conditions, defaults, name = nil)
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
- named_routes[name] = route if name && !named_routes[name]
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 < Visitor # :nodoc:
121
- attr_reader :block
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 < Visitor # :nodoc:
166
+ class String < FunctionalVisitor # :nodoc:
134
167
  private
135
168
 
136
- def binary(node)
137
- [visit(node.left), visit(node.right)].join
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.map { |c| visit(c) }.join '|'
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
- "(#{visit(node.left)})"
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 < Visitor # :nodoc:
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
- #{@nodes.join "\n"}
167
- #{@edges.join("\n")}
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.each do |c|
176
- @edges << "#{node.object_id} -> #{c.object_id};"
177
- end
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.each do |c|
183
- @edges << "#{node.object_id} -> #{c.object_id};"
184
- end
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
- @edges << "#{node.object_id} -> #{node.left.object_id};"
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
- @nodes << "#{node.object_id} [label=\"()\"];"
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
- @nodes << "#{node.object_id} [label=\"○\"];"
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
- @nodes << "#{node.object_id} [label=\"*\"];"
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
- @nodes << "#{node.object_id} [label=\"|\"];"
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
- @nodes << "#{node.object_id} [label=\"#{value}\"];"
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
- delegate :to_prepare, :to_cleanup, :to => "ActionDispatch::Reloader"
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)