omg-actionpack 8.0.0.alpha1

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.
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