actionpack 3.2.22.5 → 5.2.4

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 (271) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +279 -603
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +13 -297
  5. data/lib/abstract_controller/asset_paths.rb +4 -2
  6. data/lib/abstract_controller/base.rb +82 -52
  7. data/lib/abstract_controller/caching/fragments.rb +166 -0
  8. data/lib/abstract_controller/caching.rb +66 -0
  9. data/lib/abstract_controller/callbacks.rb +117 -103
  10. data/lib/abstract_controller/collector.rb +18 -7
  11. data/lib/abstract_controller/error.rb +6 -0
  12. data/lib/abstract_controller/helpers.rb +65 -38
  13. data/lib/abstract_controller/logger.rb +3 -2
  14. data/lib/abstract_controller/railties/routes_helpers.rb +5 -3
  15. data/lib/abstract_controller/rendering.rb +77 -129
  16. data/lib/abstract_controller/translation.rb +21 -3
  17. data/lib/abstract_controller/url_for.rb +9 -7
  18. data/lib/abstract_controller.rb +12 -13
  19. data/lib/action_controller/api/api_rendering.rb +16 -0
  20. data/lib/action_controller/api.rb +149 -0
  21. data/lib/action_controller/base.rb +81 -40
  22. data/lib/action_controller/caching.rb +22 -62
  23. data/lib/action_controller/form_builder.rb +50 -0
  24. data/lib/action_controller/log_subscriber.rb +30 -18
  25. data/lib/action_controller/metal/basic_implicit_render.rb +13 -0
  26. data/lib/action_controller/metal/conditional_get.rb +190 -47
  27. data/lib/action_controller/metal/content_security_policy.rb +52 -0
  28. data/lib/action_controller/metal/cookies.rb +3 -3
  29. data/lib/action_controller/metal/data_streaming.rb +40 -65
  30. data/lib/action_controller/metal/etag_with_flash.rb +18 -0
  31. data/lib/action_controller/metal/etag_with_template_digest.rb +57 -0
  32. data/lib/action_controller/metal/exceptions.rb +19 -12
  33. data/lib/action_controller/metal/flash.rb +42 -9
  34. data/lib/action_controller/metal/force_ssl.rb +79 -19
  35. data/lib/action_controller/metal/head.rb +35 -10
  36. data/lib/action_controller/metal/helpers.rb +31 -21
  37. data/lib/action_controller/metal/http_authentication.rb +182 -134
  38. data/lib/action_controller/metal/implicit_render.rb +62 -8
  39. data/lib/action_controller/metal/instrumentation.rb +28 -26
  40. data/lib/action_controller/metal/live.rb +312 -0
  41. data/lib/action_controller/metal/mime_responds.rb +159 -163
  42. data/lib/action_controller/metal/parameter_encoding.rb +51 -0
  43. data/lib/action_controller/metal/params_wrapper.rb +146 -93
  44. data/lib/action_controller/metal/redirecting.rb +80 -56
  45. data/lib/action_controller/metal/renderers.rb +119 -47
  46. data/lib/action_controller/metal/rendering.rb +89 -32
  47. data/lib/action_controller/metal/request_forgery_protection.rb +373 -41
  48. data/lib/action_controller/metal/rescue.rb +9 -16
  49. data/lib/action_controller/metal/streaming.rb +39 -45
  50. data/lib/action_controller/metal/strong_parameters.rb +1086 -0
  51. data/lib/action_controller/metal/testing.rb +8 -29
  52. data/lib/action_controller/metal/url_for.rb +43 -32
  53. data/lib/action_controller/metal.rb +112 -106
  54. data/lib/action_controller/railtie.rb +56 -18
  55. data/lib/action_controller/railties/helpers.rb +24 -0
  56. data/lib/action_controller/renderer.rb +117 -0
  57. data/lib/action_controller/template_assertions.rb +11 -0
  58. data/lib/action_controller/test_case.rb +402 -347
  59. data/lib/action_controller.rb +31 -30
  60. data/lib/action_dispatch/http/cache.rb +133 -34
  61. data/lib/action_dispatch/http/content_security_policy.rb +272 -0
  62. data/lib/action_dispatch/http/filter_parameters.rb +40 -24
  63. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  64. data/lib/action_dispatch/http/headers.rb +117 -16
  65. data/lib/action_dispatch/http/mime_negotiation.rb +98 -33
  66. data/lib/action_dispatch/http/mime_type.rb +198 -146
  67. data/lib/action_dispatch/http/mime_types.rb +22 -7
  68. data/lib/action_dispatch/http/parameter_filter.rb +61 -49
  69. data/lib/action_dispatch/http/parameters.rb +94 -51
  70. data/lib/action_dispatch/http/rack_cache.rb +4 -3
  71. data/lib/action_dispatch/http/request.rb +262 -117
  72. data/lib/action_dispatch/http/response.rb +400 -86
  73. data/lib/action_dispatch/http/upload.rb +66 -29
  74. data/lib/action_dispatch/http/url.rb +232 -60
  75. data/lib/action_dispatch/journey/formatter.rb +189 -0
  76. data/lib/action_dispatch/journey/gtg/builder.rb +164 -0
  77. data/lib/action_dispatch/journey/gtg/simulator.rb +41 -0
  78. data/lib/action_dispatch/journey/gtg/transition_table.rb +158 -0
  79. data/lib/action_dispatch/journey/nfa/builder.rb +78 -0
  80. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  81. data/lib/action_dispatch/journey/nfa/simulator.rb +49 -0
  82. data/lib/action_dispatch/journey/nfa/transition_table.rb +120 -0
  83. data/lib/action_dispatch/journey/nodes/node.rb +140 -0
  84. data/lib/action_dispatch/journey/parser.rb +199 -0
  85. data/lib/action_dispatch/journey/parser.y +50 -0
  86. data/lib/action_dispatch/journey/parser_extras.rb +31 -0
  87. data/lib/action_dispatch/journey/path/pattern.rb +199 -0
  88. data/lib/action_dispatch/journey/route.rb +203 -0
  89. data/lib/action_dispatch/journey/router/utils.rb +102 -0
  90. data/lib/action_dispatch/journey/router.rb +156 -0
  91. data/lib/action_dispatch/journey/routes.rb +82 -0
  92. data/lib/action_dispatch/journey/scanner.rb +64 -0
  93. data/lib/action_dispatch/journey/visitors.rb +268 -0
  94. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  95. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  96. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  97. data/lib/action_dispatch/journey.rb +7 -0
  98. data/lib/action_dispatch/middleware/callbacks.rb +17 -13
  99. data/lib/action_dispatch/middleware/cookies.rb +494 -162
  100. data/lib/action_dispatch/middleware/debug_exceptions.rb +176 -53
  101. data/lib/action_dispatch/middleware/debug_locks.rb +124 -0
  102. data/lib/action_dispatch/middleware/exception_wrapper.rb +103 -38
  103. data/lib/action_dispatch/middleware/executor.rb +21 -0
  104. data/lib/action_dispatch/middleware/flash.rb +128 -91
  105. data/lib/action_dispatch/middleware/public_exceptions.rb +43 -16
  106. data/lib/action_dispatch/middleware/reloader.rb +6 -83
  107. data/lib/action_dispatch/middleware/remote_ip.rb +151 -49
  108. data/lib/action_dispatch/middleware/request_id.rb +19 -15
  109. data/lib/action_dispatch/middleware/session/abstract_store.rb +38 -34
  110. data/lib/action_dispatch/middleware/session/cache_store.rb +14 -9
  111. data/lib/action_dispatch/middleware/session/cookie_store.rb +94 -44
  112. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +15 -4
  113. data/lib/action_dispatch/middleware/show_exceptions.rb +36 -61
  114. data/lib/action_dispatch/middleware/ssl.rb +150 -0
  115. data/lib/action_dispatch/middleware/stack.rb +33 -41
  116. data/lib/action_dispatch/middleware/static.rb +92 -48
  117. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +22 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +27 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  123. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  125. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +21 -0
  126. data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +13 -0
  127. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +134 -5
  128. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  129. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  130. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  131. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  132. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  133. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  134. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  135. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  136. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  137. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  138. data/lib/action_dispatch/railtie.rb +29 -8
  139. data/lib/action_dispatch/request/session.rb +234 -0
  140. data/lib/action_dispatch/request/utils.rb +78 -0
  141. data/lib/action_dispatch/routing/endpoint.rb +17 -0
  142. data/lib/action_dispatch/routing/inspector.rb +225 -0
  143. data/lib/action_dispatch/routing/mapper.rb +1329 -582
  144. data/lib/action_dispatch/routing/polymorphic_routes.rb +237 -94
  145. data/lib/action_dispatch/routing/redirection.rb +120 -50
  146. data/lib/action_dispatch/routing/route_set.rb +545 -322
  147. data/lib/action_dispatch/routing/routes_proxy.rb +37 -7
  148. data/lib/action_dispatch/routing/url_for.rb +103 -34
  149. data/lib/action_dispatch/routing.rb +66 -99
  150. data/lib/action_dispatch/system_test_case.rb +147 -0
  151. data/lib/action_dispatch/system_testing/browser.rb +49 -0
  152. data/lib/action_dispatch/system_testing/driver.rb +59 -0
  153. data/lib/action_dispatch/system_testing/server.rb +31 -0
  154. data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +96 -0
  155. data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +31 -0
  156. data/lib/action_dispatch/system_testing/test_helpers/undef_methods.rb +26 -0
  157. data/lib/action_dispatch/testing/assertion_response.rb +47 -0
  158. data/lib/action_dispatch/testing/assertions/response.rb +53 -42
  159. data/lib/action_dispatch/testing/assertions/routing.rb +79 -74
  160. data/lib/action_dispatch/testing/assertions.rb +15 -9
  161. data/lib/action_dispatch/testing/integration.rb +361 -207
  162. data/lib/action_dispatch/testing/request_encoder.rb +55 -0
  163. data/lib/action_dispatch/testing/test_process.rb +28 -19
  164. data/lib/action_dispatch/testing/test_request.rb +30 -33
  165. data/lib/action_dispatch/testing/test_response.rb +35 -11
  166. data/lib/action_dispatch.rb +42 -32
  167. data/lib/action_pack/gem_version.rb +17 -0
  168. data/lib/action_pack/version.rb +7 -7
  169. data/lib/action_pack.rb +4 -2
  170. metadata +116 -175
  171. data/lib/abstract_controller/layouts.rb +0 -423
  172. data/lib/abstract_controller/view_paths.rb +0 -96
  173. data/lib/action_controller/caching/actions.rb +0 -185
  174. data/lib/action_controller/caching/fragments.rb +0 -127
  175. data/lib/action_controller/caching/pages.rb +0 -187
  176. data/lib/action_controller/caching/sweeping.rb +0 -97
  177. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  178. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  179. data/lib/action_controller/deprecated.rb +0 -3
  180. data/lib/action_controller/metal/compatibility.rb +0 -65
  181. data/lib/action_controller/metal/hide_actions.rb +0 -41
  182. data/lib/action_controller/metal/rack_delegation.rb +0 -26
  183. data/lib/action_controller/metal/responder.rb +0 -286
  184. data/lib/action_controller/metal/session_management.rb +0 -14
  185. data/lib/action_controller/middleware.rb +0 -39
  186. data/lib/action_controller/railties/paths.rb +0 -25
  187. data/lib/action_controller/record_identifier.rb +0 -85
  188. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  189. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  190. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  191. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  192. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  193. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  194. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  195. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  196. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  197. data/lib/action_dispatch/middleware/head.rb +0 -18
  198. data/lib/action_dispatch/middleware/params_parser.rb +0 -75
  199. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  200. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  201. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  202. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  203. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  204. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  205. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  206. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  207. data/lib/action_dispatch/testing/assertions/dom.rb +0 -37
  208. data/lib/action_dispatch/testing/assertions/selector.rb +0 -435
  209. data/lib/action_dispatch/testing/assertions/tag.rb +0 -138
  210. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  211. data/lib/action_view/asset_paths.rb +0 -142
  212. data/lib/action_view/base.rb +0 -220
  213. data/lib/action_view/buffers.rb +0 -43
  214. data/lib/action_view/context.rb +0 -36
  215. data/lib/action_view/flows.rb +0 -79
  216. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  217. data/lib/action_view/helpers/asset_paths.rb +0 -7
  218. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  219. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  220. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  221. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  222. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  223. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  224. data/lib/action_view/helpers/cache_helper.rb +0 -64
  225. data/lib/action_view/helpers/capture_helper.rb +0 -203
  226. data/lib/action_view/helpers/controller_helper.rb +0 -25
  227. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  228. data/lib/action_view/helpers/date_helper.rb +0 -1062
  229. data/lib/action_view/helpers/debug_helper.rb +0 -40
  230. data/lib/action_view/helpers/form_helper.rb +0 -1486
  231. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  232. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  233. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  234. data/lib/action_view/helpers/number_helper.rb +0 -622
  235. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  236. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  237. data/lib/action_view/helpers/rendering_helper.rb +0 -92
  238. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  239. data/lib/action_view/helpers/tag_helper.rb +0 -167
  240. data/lib/action_view/helpers/text_helper.rb +0 -426
  241. data/lib/action_view/helpers/translation_helper.rb +0 -91
  242. data/lib/action_view/helpers/url_helper.rb +0 -693
  243. data/lib/action_view/helpers.rb +0 -60
  244. data/lib/action_view/locale/en.yml +0 -160
  245. data/lib/action_view/log_subscriber.rb +0 -28
  246. data/lib/action_view/lookup_context.rb +0 -258
  247. data/lib/action_view/path_set.rb +0 -101
  248. data/lib/action_view/railtie.rb +0 -55
  249. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  250. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  251. data/lib/action_view/renderer/renderer.rb +0 -61
  252. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  253. data/lib/action_view/renderer/template_renderer.rb +0 -95
  254. data/lib/action_view/template/error.rb +0 -128
  255. data/lib/action_view/template/handlers/builder.rb +0 -26
  256. data/lib/action_view/template/handlers/erb.rb +0 -125
  257. data/lib/action_view/template/handlers.rb +0 -50
  258. data/lib/action_view/template/resolver.rb +0 -298
  259. data/lib/action_view/template/text.rb +0 -30
  260. data/lib/action_view/template.rb +0 -337
  261. data/lib/action_view/test_case.rb +0 -246
  262. data/lib/action_view/testing/resolvers.rb +0 -49
  263. data/lib/action_view.rb +0 -84
  264. data/lib/sprockets/assets.rake +0 -99
  265. data/lib/sprockets/bootstrap.rb +0 -37
  266. data/lib/sprockets/compressors.rb +0 -83
  267. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  268. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  269. data/lib/sprockets/helpers.rb +0 -6
  270. data/lib/sprockets/railtie.rb +0 -62
  271. data/lib/sprockets/static_compiler.rb +0 -56
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "action_dispatch/journey/visitors"
4
+
5
+ module ActionDispatch
6
+ module Journey # :nodoc:
7
+ module Nodes # :nodoc:
8
+ class Node # :nodoc:
9
+ include Enumerable
10
+
11
+ attr_accessor :left, :memo
12
+
13
+ def initialize(left)
14
+ @left = left
15
+ @memo = nil
16
+ end
17
+
18
+ def each(&block)
19
+ Visitors::Each::INSTANCE.accept(self, block)
20
+ end
21
+
22
+ def to_s
23
+ Visitors::String::INSTANCE.accept(self, "")
24
+ end
25
+
26
+ def to_dot
27
+ Visitors::Dot::INSTANCE.accept(self)
28
+ end
29
+
30
+ def to_sym
31
+ name.to_sym
32
+ end
33
+
34
+ def name
35
+ left.tr "*:".freeze, "".freeze
36
+ end
37
+
38
+ def type
39
+ raise NotImplementedError
40
+ end
41
+
42
+ def symbol?; false; end
43
+ def literal?; false; end
44
+ def terminal?; false; end
45
+ def star?; false; end
46
+ def cat?; false; end
47
+ def group?; false; end
48
+ end
49
+
50
+ class Terminal < Node # :nodoc:
51
+ alias :symbol :left
52
+ def terminal?; true; end
53
+ end
54
+
55
+ class Literal < Terminal # :nodoc:
56
+ def literal?; true; end
57
+ def type; :LITERAL; end
58
+ end
59
+
60
+ class Dummy < Literal # :nodoc:
61
+ def initialize(x = Object.new)
62
+ super
63
+ end
64
+
65
+ def literal?; false; end
66
+ end
67
+
68
+ %w{ Symbol Slash Dot }.each do |t|
69
+ class_eval <<-eoruby, __FILE__, __LINE__ + 1
70
+ class #{t} < Terminal;
71
+ def type; :#{t.upcase}; end
72
+ end
73
+ eoruby
74
+ end
75
+
76
+ class Symbol < Terminal # :nodoc:
77
+ attr_accessor :regexp
78
+ alias :symbol :regexp
79
+ attr_reader :name
80
+
81
+ DEFAULT_EXP = /[^\.\/\?]+/
82
+ def initialize(left)
83
+ super
84
+ @regexp = DEFAULT_EXP
85
+ @name = left.tr "*:".freeze, "".freeze
86
+ end
87
+
88
+ def default_regexp?
89
+ regexp == DEFAULT_EXP
90
+ end
91
+
92
+ def symbol?; true; end
93
+ end
94
+
95
+ class Unary < Node # :nodoc:
96
+ def children; [left] end
97
+ end
98
+
99
+ class Group < Unary # :nodoc:
100
+ def type; :GROUP; end
101
+ def group?; true; end
102
+ end
103
+
104
+ class Star < Unary # :nodoc:
105
+ def star?; true; end
106
+ def type; :STAR; end
107
+
108
+ def name
109
+ left.name.tr "*:", ""
110
+ end
111
+ end
112
+
113
+ class Binary < Node # :nodoc:
114
+ attr_accessor :right
115
+
116
+ def initialize(left, right)
117
+ super(left)
118
+ @right = right
119
+ end
120
+
121
+ def children; [left, right] end
122
+ end
123
+
124
+ class Cat < Binary # :nodoc:
125
+ def cat?; true; end
126
+ def type; :CAT; end
127
+ end
128
+
129
+ class Or < Node # :nodoc:
130
+ attr_reader :children
131
+
132
+ def initialize(children)
133
+ @children = children
134
+ end
135
+
136
+ def type; :OR; end
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,199 @@
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.4.14
4
+ # from Racc grammar file "".
5
+ #
6
+
7
+ require 'racc/parser.rb'
8
+
9
+ # :stopdoc:
10
+
11
+ require "action_dispatch/journey/parser_extras"
12
+ module ActionDispatch
13
+ module Journey
14
+ class Parser < Racc::Parser
15
+ ##### State transition tables begin ###
16
+
17
+ racc_action_table = [
18
+ 13, 15, 14, 7, 19, 16, 8, 19, 13, 15,
19
+ 14, 7, 17, 16, 8, 13, 15, 14, 7, 21,
20
+ 16, 8, 13, 15, 14, 7, 24, 16, 8 ]
21
+
22
+ racc_action_check = [
23
+ 2, 2, 2, 2, 22, 2, 2, 2, 19, 19,
24
+ 19, 19, 1, 19, 19, 7, 7, 7, 7, 17,
25
+ 7, 7, 0, 0, 0, 0, 20, 0, 0 ]
26
+
27
+ racc_action_pointer = [
28
+ 20, 12, -2, nil, nil, nil, nil, 13, nil, nil,
29
+ nil, nil, nil, nil, nil, nil, nil, 19, nil, 6,
30
+ 20, nil, -5, nil, nil ]
31
+
32
+ racc_action_default = [
33
+ -19, -19, -2, -3, -4, -5, -6, -19, -10, -11,
34
+ -12, -13, -14, -15, -16, -17, -18, -19, -1, -19,
35
+ -19, 25, -8, -9, -7 ]
36
+
37
+ racc_goto_table = [
38
+ 1, 22, 18, 23, nil, nil, nil, 20 ]
39
+
40
+ racc_goto_check = [
41
+ 1, 2, 1, 3, nil, nil, nil, 1 ]
42
+
43
+ racc_goto_pointer = [
44
+ nil, 0, -18, -16, nil, nil, nil, nil, nil, nil,
45
+ nil ]
46
+
47
+ racc_goto_default = [
48
+ nil, nil, 2, 3, 4, 5, 6, 9, 10, 11,
49
+ 12 ]
50
+
51
+ racc_reduce_table = [
52
+ 0, 0, :racc_error,
53
+ 2, 11, :_reduce_1,
54
+ 1, 11, :_reduce_2,
55
+ 1, 11, :_reduce_none,
56
+ 1, 12, :_reduce_none,
57
+ 1, 12, :_reduce_none,
58
+ 1, 12, :_reduce_none,
59
+ 3, 15, :_reduce_7,
60
+ 3, 13, :_reduce_8,
61
+ 3, 13, :_reduce_9,
62
+ 1, 16, :_reduce_10,
63
+ 1, 14, :_reduce_none,
64
+ 1, 14, :_reduce_none,
65
+ 1, 14, :_reduce_none,
66
+ 1, 14, :_reduce_none,
67
+ 1, 19, :_reduce_15,
68
+ 1, 17, :_reduce_16,
69
+ 1, 18, :_reduce_17,
70
+ 1, 20, :_reduce_18 ]
71
+
72
+ racc_reduce_n = 19
73
+
74
+ racc_shift_n = 25
75
+
76
+ racc_token_table = {
77
+ false => 0,
78
+ :error => 1,
79
+ :SLASH => 2,
80
+ :LITERAL => 3,
81
+ :SYMBOL => 4,
82
+ :LPAREN => 5,
83
+ :RPAREN => 6,
84
+ :DOT => 7,
85
+ :STAR => 8,
86
+ :OR => 9 }
87
+
88
+ racc_nt_base = 10
89
+
90
+ racc_use_result_var = false
91
+
92
+ Racc_arg = [
93
+ racc_action_table,
94
+ racc_action_check,
95
+ racc_action_default,
96
+ racc_action_pointer,
97
+ racc_goto_table,
98
+ racc_goto_check,
99
+ racc_goto_default,
100
+ racc_goto_pointer,
101
+ racc_nt_base,
102
+ racc_reduce_table,
103
+ racc_token_table,
104
+ racc_shift_n,
105
+ racc_reduce_n,
106
+ racc_use_result_var ]
107
+
108
+ Racc_token_to_s_table = [
109
+ "$end",
110
+ "error",
111
+ "SLASH",
112
+ "LITERAL",
113
+ "SYMBOL",
114
+ "LPAREN",
115
+ "RPAREN",
116
+ "DOT",
117
+ "STAR",
118
+ "OR",
119
+ "$start",
120
+ "expressions",
121
+ "expression",
122
+ "or",
123
+ "terminal",
124
+ "group",
125
+ "star",
126
+ "symbol",
127
+ "literal",
128
+ "slash",
129
+ "dot" ]
130
+
131
+ Racc_debug_parser = false
132
+
133
+ ##### State transition tables end #####
134
+
135
+ # reduce 0 omitted
136
+
137
+ def _reduce_1(val, _values)
138
+ Cat.new(val.first, val.last)
139
+ end
140
+
141
+ def _reduce_2(val, _values)
142
+ val.first
143
+ end
144
+
145
+ # reduce 3 omitted
146
+
147
+ # reduce 4 omitted
148
+
149
+ # reduce 5 omitted
150
+
151
+ # reduce 6 omitted
152
+
153
+ def _reduce_7(val, _values)
154
+ Group.new(val[1])
155
+ end
156
+
157
+ def _reduce_8(val, _values)
158
+ Or.new([val.first, val.last])
159
+ end
160
+
161
+ def _reduce_9(val, _values)
162
+ Or.new([val.first, val.last])
163
+ end
164
+
165
+ def _reduce_10(val, _values)
166
+ Star.new(Symbol.new(val.last))
167
+ end
168
+
169
+ # reduce 11 omitted
170
+
171
+ # reduce 12 omitted
172
+
173
+ # reduce 13 omitted
174
+
175
+ # reduce 14 omitted
176
+
177
+ def _reduce_15(val, _values)
178
+ Slash.new(val.first)
179
+ end
180
+
181
+ def _reduce_16(val, _values)
182
+ Symbol.new(val.first)
183
+ end
184
+
185
+ def _reduce_17(val, _values)
186
+ Literal.new(val.first)
187
+ end
188
+
189
+ def _reduce_18(val, _values)
190
+ Dot.new(val.first)
191
+ end
192
+
193
+ def _reduce_none(val, _values)
194
+ val[0]
195
+ end
196
+
197
+ end # class Parser
198
+ end # module Journey
199
+ end # module ActionDispatch
@@ -0,0 +1,50 @@
1
+ class ActionDispatch::Journey::Parser
2
+ options no_result_var
3
+ token SLASH LITERAL SYMBOL LPAREN RPAREN DOT STAR OR
4
+
5
+ rule
6
+ expressions
7
+ : expression expressions { Cat.new(val.first, val.last) }
8
+ | expression { val.first }
9
+ | or
10
+ ;
11
+ expression
12
+ : terminal
13
+ | group
14
+ | star
15
+ ;
16
+ group
17
+ : LPAREN expressions RPAREN { Group.new(val[1]) }
18
+ ;
19
+ or
20
+ : expression OR expression { Or.new([val.first, val.last]) }
21
+ | expression OR or { Or.new([val.first, val.last]) }
22
+ ;
23
+ star
24
+ : STAR { Star.new(Symbol.new(val.last)) }
25
+ ;
26
+ terminal
27
+ : symbol
28
+ | literal
29
+ | slash
30
+ | dot
31
+ ;
32
+ slash
33
+ : SLASH { Slash.new(val.first) }
34
+ ;
35
+ symbol
36
+ : SYMBOL { Symbol.new(val.first) }
37
+ ;
38
+ literal
39
+ : LITERAL { Literal.new(val.first) }
40
+ ;
41
+ dot
42
+ : DOT { Dot.new(val.first) }
43
+ ;
44
+
45
+ end
46
+
47
+ ---- header
48
+ # :stopdoc:
49
+
50
+ require "action_dispatch/journey/parser_extras"
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "action_dispatch/journey/scanner"
4
+ require "action_dispatch/journey/nodes/node"
5
+
6
+ module ActionDispatch
7
+ # :stopdoc:
8
+ module Journey
9
+ class Parser < Racc::Parser
10
+ include Journey::Nodes
11
+
12
+ def self.parse(string)
13
+ new.parse string
14
+ end
15
+
16
+ def initialize
17
+ @scanner = Scanner.new
18
+ end
19
+
20
+ def parse(string)
21
+ @scanner.scan_setup(string)
22
+ do_parse
23
+ end
24
+
25
+ def next_token
26
+ @scanner.next_token
27
+ end
28
+ end
29
+ end
30
+ # :startdoc:
31
+ end
@@ -0,0 +1,199 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActionDispatch
4
+ module Journey # :nodoc:
5
+ module Path # :nodoc:
6
+ class Pattern # :nodoc:
7
+ attr_reader :spec, :requirements, :anchored
8
+
9
+ def self.from_string(string)
10
+ build(string, {}, "/.?", true)
11
+ end
12
+
13
+ def self.build(path, requirements, separators, anchored)
14
+ parser = Journey::Parser.new
15
+ ast = parser.parse path
16
+ new ast, requirements, separators, anchored
17
+ end
18
+
19
+ def initialize(ast, requirements, separators, anchored)
20
+ @spec = ast
21
+ @requirements = requirements
22
+ @separators = separators
23
+ @anchored = anchored
24
+
25
+ @names = nil
26
+ @optional_names = nil
27
+ @required_names = nil
28
+ @re = nil
29
+ @offsets = nil
30
+ end
31
+
32
+ def build_formatter
33
+ Visitors::FormatBuilder.new.accept(spec)
34
+ end
35
+
36
+ def eager_load!
37
+ required_names
38
+ offsets
39
+ to_regexp
40
+ nil
41
+ end
42
+
43
+ def ast
44
+ @spec.find_all(&:symbol?).each do |node|
45
+ re = @requirements[node.to_sym]
46
+ node.regexp = re if re
47
+ end
48
+
49
+ @spec.find_all(&:star?).each do |node|
50
+ node = node.left
51
+ node.regexp = @requirements[node.to_sym] || /(.+)/
52
+ end
53
+
54
+ @spec
55
+ end
56
+
57
+ def names
58
+ @names ||= spec.find_all(&:symbol?).map(&:name)
59
+ end
60
+
61
+ def required_names
62
+ @required_names ||= names - optional_names
63
+ end
64
+
65
+ def optional_names
66
+ @optional_names ||= spec.find_all(&:group?).flat_map { |group|
67
+ group.find_all(&:symbol?)
68
+ }.map(&:name).uniq
69
+ end
70
+
71
+ class AnchoredRegexp < Journey::Visitors::Visitor # :nodoc:
72
+ def initialize(separator, matchers)
73
+ @separator = separator
74
+ @matchers = matchers
75
+ @separator_re = "([^#{separator}]+)"
76
+ super()
77
+ end
78
+
79
+ def accept(node)
80
+ %r{\A#{visit node}\Z}
81
+ end
82
+
83
+ def visit_CAT(node)
84
+ [visit(node.left), visit(node.right)].join
85
+ end
86
+
87
+ def visit_SYMBOL(node)
88
+ node = node.to_sym
89
+
90
+ return @separator_re unless @matchers.key?(node)
91
+
92
+ re = @matchers[node]
93
+ "(#{re})"
94
+ end
95
+
96
+ def visit_GROUP(node)
97
+ "(?:#{visit node.left})?"
98
+ end
99
+
100
+ def visit_LITERAL(node)
101
+ Regexp.escape(node.left)
102
+ end
103
+ alias :visit_DOT :visit_LITERAL
104
+
105
+ def visit_SLASH(node)
106
+ node.left
107
+ end
108
+
109
+ def visit_STAR(node)
110
+ re = @matchers[node.left.to_sym] || ".+"
111
+ "(#{re})"
112
+ end
113
+
114
+ def visit_OR(node)
115
+ children = node.children.map { |n| visit n }
116
+ "(?:#{children.join(?|)})"
117
+ end
118
+ end
119
+
120
+ class UnanchoredRegexp < AnchoredRegexp # :nodoc:
121
+ def accept(node)
122
+ path = visit node
123
+ path == "/" ? %r{\A/} : %r{\A#{path}(?:\b|\Z|/)}
124
+ end
125
+ end
126
+
127
+ class MatchData # :nodoc:
128
+ attr_reader :names
129
+
130
+ def initialize(names, offsets, match)
131
+ @names = names
132
+ @offsets = offsets
133
+ @match = match
134
+ end
135
+
136
+ def captures
137
+ Array.new(length - 1) { |i| self[i + 1] }
138
+ end
139
+
140
+ def [](x)
141
+ idx = @offsets[x - 1] + x
142
+ @match[idx]
143
+ end
144
+
145
+ def length
146
+ @offsets.length
147
+ end
148
+
149
+ def post_match
150
+ @match.post_match
151
+ end
152
+
153
+ def to_s
154
+ @match.to_s
155
+ end
156
+ end
157
+
158
+ def match(other)
159
+ return unless match = to_regexp.match(other)
160
+ MatchData.new(names, offsets, match)
161
+ end
162
+ alias :=~ :match
163
+
164
+ def source
165
+ to_regexp.source
166
+ end
167
+
168
+ def to_regexp
169
+ @re ||= regexp_visitor.new(@separators, @requirements).accept spec
170
+ end
171
+
172
+ private
173
+
174
+ def regexp_visitor
175
+ @anchored ? AnchoredRegexp : UnanchoredRegexp
176
+ end
177
+
178
+ def offsets
179
+ return @offsets if @offsets
180
+
181
+ @offsets = [0]
182
+
183
+ spec.find_all(&:symbol?).each do |node|
184
+ node = node.to_sym
185
+
186
+ if @requirements.key?(node)
187
+ re = /#{@requirements[node]}|/
188
+ @offsets.push((re.match("").length - 1) + @offsets.last)
189
+ else
190
+ @offsets << @offsets.last
191
+ end
192
+ end
193
+
194
+ @offsets
195
+ end
196
+ end
197
+ end
198
+ end
199
+ end