omg-actionpack 8.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (187) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +129 -0
  3. data/MIT-LICENSE +21 -0
  4. data/README.rdoc +57 -0
  5. data/lib/abstract_controller/asset_paths.rb +14 -0
  6. data/lib/abstract_controller/base.rb +299 -0
  7. data/lib/abstract_controller/caching/fragments.rb +149 -0
  8. data/lib/abstract_controller/caching.rb +68 -0
  9. data/lib/abstract_controller/callbacks.rb +265 -0
  10. data/lib/abstract_controller/collector.rb +44 -0
  11. data/lib/abstract_controller/deprecator.rb +9 -0
  12. data/lib/abstract_controller/error.rb +8 -0
  13. data/lib/abstract_controller/helpers.rb +243 -0
  14. data/lib/abstract_controller/logger.rb +16 -0
  15. data/lib/abstract_controller/railties/routes_helpers.rb +25 -0
  16. data/lib/abstract_controller/rendering.rb +126 -0
  17. data/lib/abstract_controller/translation.rb +42 -0
  18. data/lib/abstract_controller/url_for.rb +37 -0
  19. data/lib/abstract_controller.rb +36 -0
  20. data/lib/action_controller/api/api_rendering.rb +18 -0
  21. data/lib/action_controller/api.rb +155 -0
  22. data/lib/action_controller/base.rb +332 -0
  23. data/lib/action_controller/caching.rb +49 -0
  24. data/lib/action_controller/deprecator.rb +9 -0
  25. data/lib/action_controller/form_builder.rb +55 -0
  26. data/lib/action_controller/log_subscriber.rb +96 -0
  27. data/lib/action_controller/metal/allow_browser.rb +123 -0
  28. data/lib/action_controller/metal/basic_implicit_render.rb +17 -0
  29. data/lib/action_controller/metal/conditional_get.rb +341 -0
  30. data/lib/action_controller/metal/content_security_policy.rb +86 -0
  31. data/lib/action_controller/metal/cookies.rb +20 -0
  32. data/lib/action_controller/metal/data_streaming.rb +154 -0
  33. data/lib/action_controller/metal/default_headers.rb +21 -0
  34. data/lib/action_controller/metal/etag_with_flash.rb +22 -0
  35. data/lib/action_controller/metal/etag_with_template_digest.rb +59 -0
  36. data/lib/action_controller/metal/exceptions.rb +106 -0
  37. data/lib/action_controller/metal/flash.rb +67 -0
  38. data/lib/action_controller/metal/head.rb +67 -0
  39. data/lib/action_controller/metal/helpers.rb +129 -0
  40. data/lib/action_controller/metal/http_authentication.rb +565 -0
  41. data/lib/action_controller/metal/implicit_render.rb +67 -0
  42. data/lib/action_controller/metal/instrumentation.rb +120 -0
  43. data/lib/action_controller/metal/live.rb +398 -0
  44. data/lib/action_controller/metal/logging.rb +22 -0
  45. data/lib/action_controller/metal/mime_responds.rb +337 -0
  46. data/lib/action_controller/metal/parameter_encoding.rb +84 -0
  47. data/lib/action_controller/metal/params_wrapper.rb +312 -0
  48. data/lib/action_controller/metal/permissions_policy.rb +38 -0
  49. data/lib/action_controller/metal/rate_limiting.rb +62 -0
  50. data/lib/action_controller/metal/redirecting.rb +251 -0
  51. data/lib/action_controller/metal/renderers.rb +181 -0
  52. data/lib/action_controller/metal/rendering.rb +260 -0
  53. data/lib/action_controller/metal/request_forgery_protection.rb +667 -0
  54. data/lib/action_controller/metal/rescue.rb +33 -0
  55. data/lib/action_controller/metal/streaming.rb +183 -0
  56. data/lib/action_controller/metal/strong_parameters.rb +1546 -0
  57. data/lib/action_controller/metal/testing.rb +25 -0
  58. data/lib/action_controller/metal/url_for.rb +65 -0
  59. data/lib/action_controller/metal.rb +339 -0
  60. data/lib/action_controller/railtie.rb +149 -0
  61. data/lib/action_controller/railties/helpers.rb +26 -0
  62. data/lib/action_controller/renderer.rb +161 -0
  63. data/lib/action_controller/template_assertions.rb +13 -0
  64. data/lib/action_controller/test_case.rb +691 -0
  65. data/lib/action_controller.rb +80 -0
  66. data/lib/action_dispatch/constants.rb +34 -0
  67. data/lib/action_dispatch/deprecator.rb +9 -0
  68. data/lib/action_dispatch/http/cache.rb +249 -0
  69. data/lib/action_dispatch/http/content_disposition.rb +47 -0
  70. data/lib/action_dispatch/http/content_security_policy.rb +365 -0
  71. data/lib/action_dispatch/http/filter_parameters.rb +80 -0
  72. data/lib/action_dispatch/http/filter_redirect.rb +50 -0
  73. data/lib/action_dispatch/http/headers.rb +134 -0
  74. data/lib/action_dispatch/http/mime_negotiation.rb +187 -0
  75. data/lib/action_dispatch/http/mime_type.rb +389 -0
  76. data/lib/action_dispatch/http/mime_types.rb +54 -0
  77. data/lib/action_dispatch/http/parameters.rb +119 -0
  78. data/lib/action_dispatch/http/permissions_policy.rb +189 -0
  79. data/lib/action_dispatch/http/rack_cache.rb +67 -0
  80. data/lib/action_dispatch/http/request.rb +498 -0
  81. data/lib/action_dispatch/http/response.rb +556 -0
  82. data/lib/action_dispatch/http/upload.rb +107 -0
  83. data/lib/action_dispatch/http/url.rb +344 -0
  84. data/lib/action_dispatch/journey/formatter.rb +226 -0
  85. data/lib/action_dispatch/journey/gtg/builder.rb +149 -0
  86. data/lib/action_dispatch/journey/gtg/simulator.rb +50 -0
  87. data/lib/action_dispatch/journey/gtg/transition_table.rb +217 -0
  88. data/lib/action_dispatch/journey/nfa/dot.rb +27 -0
  89. data/lib/action_dispatch/journey/nodes/node.rb +208 -0
  90. data/lib/action_dispatch/journey/parser.rb +103 -0
  91. data/lib/action_dispatch/journey/path/pattern.rb +209 -0
  92. data/lib/action_dispatch/journey/route.rb +189 -0
  93. data/lib/action_dispatch/journey/router/utils.rb +105 -0
  94. data/lib/action_dispatch/journey/router.rb +151 -0
  95. data/lib/action_dispatch/journey/routes.rb +82 -0
  96. data/lib/action_dispatch/journey/scanner.rb +70 -0
  97. data/lib/action_dispatch/journey/visitors.rb +267 -0
  98. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  99. data/lib/action_dispatch/journey/visualizer/fsm.js +159 -0
  100. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  101. data/lib/action_dispatch/journey.rb +7 -0
  102. data/lib/action_dispatch/log_subscriber.rb +25 -0
  103. data/lib/action_dispatch/middleware/actionable_exceptions.rb +46 -0
  104. data/lib/action_dispatch/middleware/assume_ssl.rb +27 -0
  105. data/lib/action_dispatch/middleware/callbacks.rb +38 -0
  106. data/lib/action_dispatch/middleware/cookies.rb +719 -0
  107. data/lib/action_dispatch/middleware/debug_exceptions.rb +206 -0
  108. data/lib/action_dispatch/middleware/debug_locks.rb +129 -0
  109. data/lib/action_dispatch/middleware/debug_view.rb +73 -0
  110. data/lib/action_dispatch/middleware/exception_wrapper.rb +350 -0
  111. data/lib/action_dispatch/middleware/executor.rb +32 -0
  112. data/lib/action_dispatch/middleware/flash.rb +318 -0
  113. data/lib/action_dispatch/middleware/host_authorization.rb +171 -0
  114. data/lib/action_dispatch/middleware/public_exceptions.rb +64 -0
  115. data/lib/action_dispatch/middleware/reloader.rb +16 -0
  116. data/lib/action_dispatch/middleware/remote_ip.rb +199 -0
  117. data/lib/action_dispatch/middleware/request_id.rb +50 -0
  118. data/lib/action_dispatch/middleware/server_timing.rb +78 -0
  119. data/lib/action_dispatch/middleware/session/abstract_store.rb +112 -0
  120. data/lib/action_dispatch/middleware/session/cache_store.rb +66 -0
  121. data/lib/action_dispatch/middleware/session/cookie_store.rb +129 -0
  122. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +34 -0
  123. data/lib/action_dispatch/middleware/show_exceptions.rb +88 -0
  124. data/lib/action_dispatch/middleware/ssl.rb +180 -0
  125. data/lib/action_dispatch/middleware/stack.rb +194 -0
  126. data/lib/action_dispatch/middleware/static.rb +192 -0
  127. data/lib/action_dispatch/middleware/templates/rescues/_actions.html.erb +13 -0
  128. data/lib/action_dispatch/middleware/templates/rescues/_actions.text.erb +0 -0
  129. data/lib/action_dispatch/middleware/templates/rescues/_message_and_suggestions.html.erb +22 -0
  130. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +17 -0
  131. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  132. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +36 -0
  133. data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
  134. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +62 -0
  135. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  136. data/lib/action_dispatch/middleware/templates/rescues/blocked_host.html.erb +12 -0
  137. data/lib/action_dispatch/middleware/templates/rescues/blocked_host.text.erb +9 -0
  138. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +35 -0
  139. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  140. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +24 -0
  141. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +16 -0
  142. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +284 -0
  143. data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb +23 -0
  144. data/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.text.erb +3 -0
  145. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  146. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  147. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  148. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  149. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  150. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  151. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  152. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  153. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +19 -0
  154. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +232 -0
  155. data/lib/action_dispatch/railtie.rb +77 -0
  156. data/lib/action_dispatch/request/session.rb +283 -0
  157. data/lib/action_dispatch/request/utils.rb +109 -0
  158. data/lib/action_dispatch/routing/endpoint.rb +19 -0
  159. data/lib/action_dispatch/routing/inspector.rb +323 -0
  160. data/lib/action_dispatch/routing/mapper.rb +2372 -0
  161. data/lib/action_dispatch/routing/polymorphic_routes.rb +363 -0
  162. data/lib/action_dispatch/routing/redirection.rb +218 -0
  163. data/lib/action_dispatch/routing/route_set.rb +958 -0
  164. data/lib/action_dispatch/routing/routes_proxy.rb +66 -0
  165. data/lib/action_dispatch/routing/url_for.rb +244 -0
  166. data/lib/action_dispatch/routing.rb +262 -0
  167. data/lib/action_dispatch/system_test_case.rb +206 -0
  168. data/lib/action_dispatch/system_testing/browser.rb +75 -0
  169. data/lib/action_dispatch/system_testing/driver.rb +85 -0
  170. data/lib/action_dispatch/system_testing/server.rb +33 -0
  171. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +164 -0
  172. data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +23 -0
  173. data/lib/action_dispatch/testing/assertion_response.rb +48 -0
  174. data/lib/action_dispatch/testing/assertions/response.rb +114 -0
  175. data/lib/action_dispatch/testing/assertions/routing.rb +343 -0
  176. data/lib/action_dispatch/testing/assertions.rb +25 -0
  177. data/lib/action_dispatch/testing/integration.rb +694 -0
  178. data/lib/action_dispatch/testing/request_encoder.rb +60 -0
  179. data/lib/action_dispatch/testing/test_helpers/page_dump_helper.rb +35 -0
  180. data/lib/action_dispatch/testing/test_process.rb +57 -0
  181. data/lib/action_dispatch/testing/test_request.rb +73 -0
  182. data/lib/action_dispatch/testing/test_response.rb +58 -0
  183. data/lib/action_dispatch.rb +147 -0
  184. data/lib/action_pack/gem_version.rb +19 -0
  185. data/lib/action_pack/version.rb +12 -0
  186. data/lib/action_pack.rb +27 -0
  187. metadata +375 -0
@@ -0,0 +1,323 @@
1
+ # frozen_string_literal: true
2
+
3
+ # :markup: markdown
4
+
5
+ require "delegate"
6
+ require "io/console/size"
7
+
8
+ module ActionDispatch
9
+ module Routing
10
+ class RouteWrapper < SimpleDelegator # :nodoc:
11
+ def matches_filter?(filter, value)
12
+ return __getobj__.path.match(value) if filter == :exact_path_match
13
+
14
+ value.match?(public_send(filter))
15
+ end
16
+
17
+ def endpoint
18
+ case
19
+ when app.dispatcher?
20
+ "#{controller}##{action}"
21
+ when rack_app.is_a?(Proc)
22
+ "Inline handler (Proc/Lambda)"
23
+ else
24
+ rack_app.inspect
25
+ end
26
+ end
27
+
28
+ def constraints
29
+ requirements.except(:controller, :action)
30
+ end
31
+
32
+ def rack_app
33
+ app.rack_app
34
+ end
35
+
36
+ def path
37
+ super.spec.to_s
38
+ end
39
+
40
+ def name
41
+ super.to_s
42
+ end
43
+
44
+ def reqs
45
+ @reqs ||= begin
46
+ reqs = endpoint
47
+ reqs += " #{constraints}" unless constraints.empty?
48
+ reqs
49
+ end
50
+ end
51
+
52
+ def controller
53
+ parts.include?(:controller) ? ":controller" : requirements[:controller]
54
+ end
55
+
56
+ def action
57
+ parts.include?(:action) ? ":action" : requirements[:action]
58
+ end
59
+
60
+ def internal?
61
+ internal
62
+ end
63
+
64
+ def engine?
65
+ app.engine?
66
+ end
67
+ end
68
+
69
+ ##
70
+ # This class is just used for displaying route information when someone
71
+ # executes `bin/rails routes` or looks at the RoutingError page. People should
72
+ # not use this class.
73
+ class RoutesInspector # :nodoc:
74
+ def initialize(routes)
75
+ @engines = {}
76
+ @routes = routes
77
+ end
78
+
79
+ def format(formatter, filter = {})
80
+ routes_to_display = filter_routes(normalize_filter(filter))
81
+ routes = collect_routes(routes_to_display)
82
+ if routes.none?
83
+ formatter.no_routes(collect_routes(@routes), filter)
84
+ return formatter.result
85
+ end
86
+
87
+ formatter.header routes
88
+ formatter.section routes
89
+
90
+ @engines.each do |name, engine_routes|
91
+ formatter.section_title "Routes for #{name}"
92
+ formatter.section engine_routes
93
+ end
94
+
95
+ formatter.result
96
+ end
97
+
98
+ private
99
+ def normalize_filter(filter)
100
+ if filter[:controller]
101
+ { controller: /#{filter[:controller].underscore.sub(/_?controller\z/, "")}/ }
102
+ elsif filter[:grep]
103
+ grep_pattern = Regexp.new(filter[:grep])
104
+ path = URI::RFC2396_PARSER.escape(filter[:grep])
105
+ normalized_path = ("/" + path).squeeze("/")
106
+
107
+ {
108
+ controller: grep_pattern,
109
+ action: grep_pattern,
110
+ verb: grep_pattern,
111
+ name: grep_pattern,
112
+ path: grep_pattern,
113
+ exact_path_match: normalized_path,
114
+ }
115
+ end
116
+ end
117
+
118
+ def filter_routes(filter)
119
+ if filter
120
+ @routes.select do |route|
121
+ route_wrapper = RouteWrapper.new(route)
122
+ filter.any? { |filter_type, value| route_wrapper.matches_filter?(filter_type, value) }
123
+ end
124
+ else
125
+ @routes
126
+ end
127
+ end
128
+
129
+ def collect_routes(routes)
130
+ routes.collect do |route|
131
+ RouteWrapper.new(route)
132
+ end.reject(&:internal?).collect do |route|
133
+ collect_engine_routes(route)
134
+
135
+ { name: route.name,
136
+ verb: route.verb,
137
+ path: route.path,
138
+ reqs: route.reqs,
139
+ source_location: route.source_location }
140
+ end
141
+ end
142
+
143
+ def collect_engine_routes(route)
144
+ name = route.endpoint
145
+ return unless route.engine?
146
+ return if @engines[name]
147
+
148
+ routes = route.rack_app.routes
149
+ if routes.is_a?(ActionDispatch::Routing::RouteSet)
150
+ @engines[name] = collect_routes(routes.routes)
151
+ end
152
+ end
153
+ end
154
+
155
+ module ConsoleFormatter
156
+ class Base
157
+ def initialize
158
+ @buffer = []
159
+ end
160
+
161
+ def result
162
+ @buffer.join("\n")
163
+ end
164
+
165
+ def section_title(title)
166
+ end
167
+
168
+ def section(routes)
169
+ end
170
+
171
+ def header(routes)
172
+ end
173
+
174
+ def no_routes(routes, filter)
175
+ @buffer <<
176
+ if routes.none?
177
+ <<~MESSAGE
178
+ You don't have any routes defined!
179
+
180
+ Please add some routes in config/routes.rb.
181
+ MESSAGE
182
+ elsif filter.key?(:controller)
183
+ "No routes were found for this controller."
184
+ elsif filter.key?(:grep)
185
+ "No routes were found for this grep pattern."
186
+ end
187
+
188
+ @buffer << "For more information about routes, see the Rails guide: https://guides.rubyonrails.org/routing.html."
189
+ end
190
+ end
191
+
192
+ class Sheet < Base
193
+ def section_title(title)
194
+ @buffer << "\n#{title}:"
195
+ end
196
+
197
+ def section(routes)
198
+ @buffer << draw_section(routes)
199
+ end
200
+
201
+ def header(routes)
202
+ @buffer << draw_header(routes)
203
+ end
204
+
205
+ private
206
+ def draw_section(routes)
207
+ header_lengths = ["Prefix", "Verb", "URI Pattern"].map(&:length)
208
+ name_width, verb_width, path_width = widths(routes).zip(header_lengths).map(&:max)
209
+
210
+ routes.map do |r|
211
+ "#{r[:name].rjust(name_width)} #{r[:verb].ljust(verb_width)} #{r[:path].ljust(path_width)} #{r[:reqs]}"
212
+ end
213
+ end
214
+
215
+ def draw_header(routes)
216
+ name_width, verb_width, path_width = widths(routes)
217
+
218
+ "#{"Prefix".rjust(name_width)} #{"Verb".ljust(verb_width)} #{"URI Pattern".ljust(path_width)} Controller#Action"
219
+ end
220
+
221
+ def widths(routes)
222
+ [routes.map { |r| r[:name].length }.max || 0,
223
+ routes.map { |r| r[:verb].length }.max || 0,
224
+ routes.map { |r| r[:path].length }.max || 0]
225
+ end
226
+ end
227
+
228
+ class Expanded < Base
229
+ def initialize(width: IO.console_size[1])
230
+ @width = width
231
+ super()
232
+ end
233
+
234
+ def section_title(title)
235
+ @buffer << "\n#{"[ #{title} ]"}"
236
+ end
237
+
238
+ def section(routes)
239
+ @buffer << draw_expanded_section(routes)
240
+ end
241
+
242
+ private
243
+ def draw_expanded_section(routes)
244
+ routes.map.each_with_index do |r, i|
245
+ route_rows = <<~MESSAGE.chomp
246
+ #{route_header(index: i + 1)}
247
+ Prefix | #{r[:name]}
248
+ Verb | #{r[:verb]}
249
+ URI | #{r[:path]}
250
+ Controller#Action | #{r[:reqs]}
251
+ MESSAGE
252
+ source_location = "\nSource Location | #{r[:source_location]}"
253
+ route_rows += source_location if r[:source_location].present?
254
+ route_rows
255
+ end
256
+ end
257
+
258
+ def route_header(index:)
259
+ "--[ Route #{index} ]".ljust(@width, "-")
260
+ end
261
+ end
262
+
263
+ class Unused < Sheet
264
+ def header(routes)
265
+ @buffer << <<~MSG
266
+ Found #{routes.count} unused #{"route".pluralize(routes.count)}:
267
+ MSG
268
+
269
+ super
270
+ end
271
+
272
+ def no_routes(routes, filter)
273
+ @buffer <<
274
+ if filter.none?
275
+ "No unused routes found."
276
+ elsif filter.key?(:controller)
277
+ "No unused routes found for this controller."
278
+ elsif filter.key?(:grep)
279
+ "No unused routes found for this grep pattern."
280
+ end
281
+ end
282
+ end
283
+ end
284
+
285
+ class HtmlTableFormatter
286
+ def initialize(view)
287
+ @view = view
288
+ @buffer = []
289
+ end
290
+
291
+ def section_title(title)
292
+ @buffer << %(<tr><th colspan="5">#{title}</th></tr>)
293
+ end
294
+
295
+ def section(routes)
296
+ @buffer << @view.render(partial: "routes/route", collection: routes)
297
+ end
298
+
299
+ # The header is part of the HTML page, so we don't construct it here.
300
+ def header(routes)
301
+ end
302
+
303
+ def no_routes(*)
304
+ @buffer << <<~MESSAGE
305
+ <p>You don't have any routes defined!</p>
306
+ <ul>
307
+ <li>Please add some routes in <tt>config/routes.rb</tt>.</li>
308
+ <li>
309
+ For more information about routes, please see the Rails guide
310
+ <a href="https://guides.rubyonrails.org/routing.html">Rails Routing from the Outside In</a>.
311
+ </li>
312
+ </ul>
313
+ MESSAGE
314
+ end
315
+
316
+ def result
317
+ @view.raw @view.render(layout: "routes/table") {
318
+ @view.raw @buffer.join("\n")
319
+ }
320
+ end
321
+ end
322
+ end
323
+ end