actionpack 3.2.19 → 4.2.11.3

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 (244) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +412 -503
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +11 -294
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +52 -18
  7. data/lib/abstract_controller/callbacks.rb +87 -89
  8. data/lib/abstract_controller/collector.rb +17 -3
  9. data/lib/abstract_controller/helpers.rb +41 -14
  10. data/lib/abstract_controller/logger.rb +1 -2
  11. data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
  12. data/lib/abstract_controller/rendering.rb +65 -118
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +7 -7
  15. data/lib/abstract_controller.rb +2 -10
  16. data/lib/action_controller/base.rb +61 -28
  17. data/lib/action_controller/caching/fragments.rb +30 -54
  18. data/lib/action_controller/caching.rb +38 -35
  19. data/lib/action_controller/log_subscriber.rb +35 -18
  20. data/lib/action_controller/metal/conditional_get.rb +103 -34
  21. data/lib/action_controller/metal/data_streaming.rb +20 -26
  22. data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
  23. data/lib/action_controller/metal/exceptions.rb +19 -6
  24. data/lib/action_controller/metal/flash.rb +41 -9
  25. data/lib/action_controller/metal/force_ssl.rb +70 -12
  26. data/lib/action_controller/metal/head.rb +30 -7
  27. data/lib/action_controller/metal/helpers.rb +11 -11
  28. data/lib/action_controller/metal/hide_actions.rb +0 -1
  29. data/lib/action_controller/metal/http_authentication.rb +140 -94
  30. data/lib/action_controller/metal/implicit_render.rb +1 -1
  31. data/lib/action_controller/metal/instrumentation.rb +11 -7
  32. data/lib/action_controller/metal/live.rb +328 -0
  33. data/lib/action_controller/metal/mime_responds.rb +161 -152
  34. data/lib/action_controller/metal/params_wrapper.rb +126 -81
  35. data/lib/action_controller/metal/rack_delegation.rb +10 -4
  36. data/lib/action_controller/metal/redirecting.rb +44 -41
  37. data/lib/action_controller/metal/renderers.rb +48 -19
  38. data/lib/action_controller/metal/rendering.rb +46 -11
  39. data/lib/action_controller/metal/request_forgery_protection.rb +250 -29
  40. data/lib/action_controller/metal/streaming.rb +30 -38
  41. data/lib/action_controller/metal/strong_parameters.rb +669 -0
  42. data/lib/action_controller/metal/testing.rb +12 -18
  43. data/lib/action_controller/metal/url_for.rb +31 -29
  44. data/lib/action_controller/metal.rb +31 -40
  45. data/lib/action_controller/model_naming.rb +12 -0
  46. data/lib/action_controller/railtie.rb +38 -18
  47. data/lib/action_controller/railties/helpers.rb +22 -0
  48. data/lib/action_controller/test_case.rb +359 -173
  49. data/lib/action_controller.rb +9 -16
  50. data/lib/action_dispatch/http/cache.rb +64 -11
  51. data/lib/action_dispatch/http/filter_parameters.rb +20 -10
  52. data/lib/action_dispatch/http/filter_redirect.rb +38 -0
  53. data/lib/action_dispatch/http/headers.rb +85 -17
  54. data/lib/action_dispatch/http/mime_negotiation.rb +55 -5
  55. data/lib/action_dispatch/http/mime_type.rb +167 -114
  56. data/lib/action_dispatch/http/mime_types.rb +2 -1
  57. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  58. data/lib/action_dispatch/http/parameters.rb +30 -46
  59. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  60. data/lib/action_dispatch/http/request.rb +108 -45
  61. data/lib/action_dispatch/http/response.rb +247 -48
  62. data/lib/action_dispatch/http/upload.rb +60 -29
  63. data/lib/action_dispatch/http/url.rb +135 -45
  64. data/lib/action_dispatch/journey/backwards.rb +5 -0
  65. data/lib/action_dispatch/journey/formatter.rb +166 -0
  66. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  67. data/lib/action_dispatch/journey/gtg/simulator.rb +47 -0
  68. data/lib/action_dispatch/journey/gtg/transition_table.rb +157 -0
  69. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  70. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  71. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  72. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  73. data/lib/action_dispatch/journey/nodes/node.rb +128 -0
  74. data/lib/action_dispatch/journey/parser.rb +198 -0
  75. data/lib/action_dispatch/journey/parser.y +49 -0
  76. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  77. data/lib/action_dispatch/journey/path/pattern.rb +193 -0
  78. data/lib/action_dispatch/journey/route.rb +125 -0
  79. data/lib/action_dispatch/journey/router/strexp.rb +27 -0
  80. data/lib/action_dispatch/journey/router/utils.rb +93 -0
  81. data/lib/action_dispatch/journey/router.rb +144 -0
  82. data/lib/action_dispatch/journey/routes.rb +80 -0
  83. data/lib/action_dispatch/journey/scanner.rb +61 -0
  84. data/lib/action_dispatch/journey/visitors.rb +221 -0
  85. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  86. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  87. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  88. data/lib/action_dispatch/journey.rb +5 -0
  89. data/lib/action_dispatch/middleware/callbacks.rb +16 -11
  90. data/lib/action_dispatch/middleware/cookies.rb +346 -125
  91. data/lib/action_dispatch/middleware/debug_exceptions.rb +52 -24
  92. data/lib/action_dispatch/middleware/exception_wrapper.rb +75 -9
  93. data/lib/action_dispatch/middleware/flash.rb +85 -72
  94. data/lib/action_dispatch/middleware/params_parser.rb +16 -31
  95. data/lib/action_dispatch/middleware/public_exceptions.rb +39 -14
  96. data/lib/action_dispatch/middleware/reloader.rb +16 -7
  97. data/lib/action_dispatch/middleware/remote_ip.rb +132 -40
  98. data/lib/action_dispatch/middleware/request_id.rb +3 -7
  99. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  100. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  101. data/lib/action_dispatch/middleware/session/cookie_store.rb +84 -29
  102. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  103. data/lib/action_dispatch/middleware/show_exceptions.rb +15 -44
  104. data/lib/action_dispatch/middleware/ssl.rb +72 -0
  105. data/lib/action_dispatch/middleware/stack.rb +6 -1
  106. data/lib/action_dispatch/middleware/static.rb +80 -23
  107. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +34 -0
  108. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  109. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +27 -0
  110. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  111. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  112. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  114. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +133 -5
  115. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  125. data/lib/action_dispatch/railtie.rb +19 -6
  126. data/lib/action_dispatch/request/session.rb +193 -0
  127. data/lib/action_dispatch/request/utils.rb +35 -0
  128. data/lib/action_dispatch/routing/endpoint.rb +10 -0
  129. data/lib/action_dispatch/routing/inspector.rb +234 -0
  130. data/lib/action_dispatch/routing/mapper.rb +897 -436
  131. data/lib/action_dispatch/routing/polymorphic_routes.rb +213 -92
  132. data/lib/action_dispatch/routing/redirection.rb +97 -37
  133. data/lib/action_dispatch/routing/route_set.rb +432 -239
  134. data/lib/action_dispatch/routing/routes_proxy.rb +7 -4
  135. data/lib/action_dispatch/routing/url_for.rb +63 -34
  136. data/lib/action_dispatch/routing.rb +57 -89
  137. data/lib/action_dispatch/testing/assertions/dom.rb +2 -36
  138. data/lib/action_dispatch/testing/assertions/response.rb +24 -38
  139. data/lib/action_dispatch/testing/assertions/routing.rb +55 -54
  140. data/lib/action_dispatch/testing/assertions/selector.rb +2 -434
  141. data/lib/action_dispatch/testing/assertions/tag.rb +2 -137
  142. data/lib/action_dispatch/testing/assertions.rb +11 -7
  143. data/lib/action_dispatch/testing/integration.rb +88 -72
  144. data/lib/action_dispatch/testing/test_process.rb +9 -6
  145. data/lib/action_dispatch/testing/test_request.rb +13 -9
  146. data/lib/action_dispatch/testing/test_response.rb +1 -5
  147. data/lib/action_dispatch.rb +24 -21
  148. data/lib/action_pack/gem_version.rb +15 -0
  149. data/lib/action_pack/version.rb +5 -7
  150. data/lib/action_pack.rb +1 -1
  151. metadata +181 -292
  152. data/lib/abstract_controller/layouts.rb +0 -423
  153. data/lib/abstract_controller/view_paths.rb +0 -96
  154. data/lib/action_controller/caching/actions.rb +0 -185
  155. data/lib/action_controller/caching/pages.rb +0 -187
  156. data/lib/action_controller/caching/sweeping.rb +0 -97
  157. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  158. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  159. data/lib/action_controller/deprecated.rb +0 -3
  160. data/lib/action_controller/metal/compatibility.rb +0 -65
  161. data/lib/action_controller/metal/responder.rb +0 -286
  162. data/lib/action_controller/metal/session_management.rb +0 -14
  163. data/lib/action_controller/railties/paths.rb +0 -25
  164. data/lib/action_controller/record_identifier.rb +0 -85
  165. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  166. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  167. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  168. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  169. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  170. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  171. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  172. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  173. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  174. data/lib/action_dispatch/middleware/head.rb +0 -18
  175. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  176. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  177. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  178. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  179. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  180. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  181. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  182. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  183. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  184. data/lib/action_view/asset_paths.rb +0 -142
  185. data/lib/action_view/base.rb +0 -220
  186. data/lib/action_view/buffers.rb +0 -43
  187. data/lib/action_view/context.rb +0 -36
  188. data/lib/action_view/flows.rb +0 -79
  189. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  190. data/lib/action_view/helpers/asset_paths.rb +0 -7
  191. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  192. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  193. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  194. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  195. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  196. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  197. data/lib/action_view/helpers/cache_helper.rb +0 -64
  198. data/lib/action_view/helpers/capture_helper.rb +0 -203
  199. data/lib/action_view/helpers/controller_helper.rb +0 -25
  200. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  201. data/lib/action_view/helpers/date_helper.rb +0 -1062
  202. data/lib/action_view/helpers/debug_helper.rb +0 -40
  203. data/lib/action_view/helpers/form_helper.rb +0 -1486
  204. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  205. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  206. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  207. data/lib/action_view/helpers/number_helper.rb +0 -622
  208. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  209. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  210. data/lib/action_view/helpers/rendering_helper.rb +0 -90
  211. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  212. data/lib/action_view/helpers/tag_helper.rb +0 -160
  213. data/lib/action_view/helpers/text_helper.rb +0 -426
  214. data/lib/action_view/helpers/translation_helper.rb +0 -91
  215. data/lib/action_view/helpers/url_helper.rb +0 -693
  216. data/lib/action_view/helpers.rb +0 -60
  217. data/lib/action_view/locale/en.yml +0 -160
  218. data/lib/action_view/log_subscriber.rb +0 -28
  219. data/lib/action_view/lookup_context.rb +0 -254
  220. data/lib/action_view/path_set.rb +0 -89
  221. data/lib/action_view/railtie.rb +0 -55
  222. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  223. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  224. data/lib/action_view/renderer/renderer.rb +0 -54
  225. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  226. data/lib/action_view/renderer/template_renderer.rb +0 -94
  227. data/lib/action_view/template/error.rb +0 -128
  228. data/lib/action_view/template/handlers/builder.rb +0 -26
  229. data/lib/action_view/template/handlers/erb.rb +0 -125
  230. data/lib/action_view/template/handlers.rb +0 -50
  231. data/lib/action_view/template/resolver.rb +0 -272
  232. data/lib/action_view/template/text.rb +0 -30
  233. data/lib/action_view/template.rb +0 -337
  234. data/lib/action_view/test_case.rb +0 -245
  235. data/lib/action_view/testing/resolvers.rb +0 -50
  236. data/lib/action_view.rb +0 -84
  237. data/lib/sprockets/assets.rake +0 -99
  238. data/lib/sprockets/bootstrap.rb +0 -37
  239. data/lib/sprockets/compressors.rb +0 -83
  240. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  241. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  242. data/lib/sprockets/helpers.rb +0 -6
  243. data/lib/sprockets/railtie.rb +0 -62
  244. data/lib/sprockets/static_compiler.rb +0 -56
@@ -0,0 +1,198 @@
1
+ #
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by Racc 1.4.11
4
+ # from Racc grammer file "".
5
+ #
6
+
7
+ require 'racc/parser.rb'
8
+
9
+
10
+ require 'action_dispatch/journey/parser_extras'
11
+ module ActionDispatch
12
+ module Journey
13
+ class Parser < Racc::Parser
14
+ ##### State transition tables begin ###
15
+
16
+ racc_action_table = [
17
+ 13, 15, 14, 7, 21, 16, 8, 19, 13, 15,
18
+ 14, 7, 17, 16, 8, 13, 15, 14, 7, 24,
19
+ 16, 8, 13, 15, 14, 7, 19, 16, 8 ]
20
+
21
+ racc_action_check = [
22
+ 2, 2, 2, 2, 17, 2, 2, 2, 0, 0,
23
+ 0, 0, 1, 0, 0, 19, 19, 19, 19, 20,
24
+ 19, 19, 7, 7, 7, 7, 22, 7, 7 ]
25
+
26
+ racc_action_pointer = [
27
+ 6, 12, -2, nil, nil, nil, nil, 20, nil, nil,
28
+ nil, nil, nil, nil, nil, nil, nil, 4, nil, 13,
29
+ 13, nil, 17, nil, nil ]
30
+
31
+ racc_action_default = [
32
+ -19, -19, -2, -3, -4, -5, -6, -19, -10, -11,
33
+ -12, -13, -14, -15, -16, -17, -18, -19, -1, -19,
34
+ -19, 25, -8, -9, -7 ]
35
+
36
+ racc_goto_table = [
37
+ 1, 22, 18, 23, nil, nil, nil, 20 ]
38
+
39
+ racc_goto_check = [
40
+ 1, 2, 1, 3, nil, nil, nil, 1 ]
41
+
42
+ racc_goto_pointer = [
43
+ nil, 0, -18, -16, nil, nil, nil, nil, nil, nil,
44
+ nil ]
45
+
46
+ racc_goto_default = [
47
+ nil, nil, 2, 3, 4, 5, 6, 9, 10, 11,
48
+ 12 ]
49
+
50
+ racc_reduce_table = [
51
+ 0, 0, :racc_error,
52
+ 2, 11, :_reduce_1,
53
+ 1, 11, :_reduce_2,
54
+ 1, 11, :_reduce_none,
55
+ 1, 12, :_reduce_none,
56
+ 1, 12, :_reduce_none,
57
+ 1, 12, :_reduce_none,
58
+ 3, 15, :_reduce_7,
59
+ 3, 13, :_reduce_8,
60
+ 3, 13, :_reduce_9,
61
+ 1, 16, :_reduce_10,
62
+ 1, 14, :_reduce_none,
63
+ 1, 14, :_reduce_none,
64
+ 1, 14, :_reduce_none,
65
+ 1, 14, :_reduce_none,
66
+ 1, 19, :_reduce_15,
67
+ 1, 17, :_reduce_16,
68
+ 1, 18, :_reduce_17,
69
+ 1, 20, :_reduce_18 ]
70
+
71
+ racc_reduce_n = 19
72
+
73
+ racc_shift_n = 25
74
+
75
+ racc_token_table = {
76
+ false => 0,
77
+ :error => 1,
78
+ :SLASH => 2,
79
+ :LITERAL => 3,
80
+ :SYMBOL => 4,
81
+ :LPAREN => 5,
82
+ :RPAREN => 6,
83
+ :DOT => 7,
84
+ :STAR => 8,
85
+ :OR => 9 }
86
+
87
+ racc_nt_base = 10
88
+
89
+ racc_use_result_var = false
90
+
91
+ Racc_arg = [
92
+ racc_action_table,
93
+ racc_action_check,
94
+ racc_action_default,
95
+ racc_action_pointer,
96
+ racc_goto_table,
97
+ racc_goto_check,
98
+ racc_goto_default,
99
+ racc_goto_pointer,
100
+ racc_nt_base,
101
+ racc_reduce_table,
102
+ racc_token_table,
103
+ racc_shift_n,
104
+ racc_reduce_n,
105
+ racc_use_result_var ]
106
+
107
+ Racc_token_to_s_table = [
108
+ "$end",
109
+ "error",
110
+ "SLASH",
111
+ "LITERAL",
112
+ "SYMBOL",
113
+ "LPAREN",
114
+ "RPAREN",
115
+ "DOT",
116
+ "STAR",
117
+ "OR",
118
+ "$start",
119
+ "expressions",
120
+ "expression",
121
+ "or",
122
+ "terminal",
123
+ "group",
124
+ "star",
125
+ "symbol",
126
+ "literal",
127
+ "slash",
128
+ "dot" ]
129
+
130
+ Racc_debug_parser = false
131
+
132
+ ##### State transition tables end #####
133
+
134
+ # reduce 0 omitted
135
+
136
+ def _reduce_1(val, _values)
137
+ Cat.new(val.first, val.last)
138
+ end
139
+
140
+ def _reduce_2(val, _values)
141
+ val.first
142
+ end
143
+
144
+ # reduce 3 omitted
145
+
146
+ # reduce 4 omitted
147
+
148
+ # reduce 5 omitted
149
+
150
+ # reduce 6 omitted
151
+
152
+ def _reduce_7(val, _values)
153
+ Group.new(val[1])
154
+ end
155
+
156
+ def _reduce_8(val, _values)
157
+ Or.new([val.first, val.last])
158
+ end
159
+
160
+ def _reduce_9(val, _values)
161
+ Or.new([val.first, val.last])
162
+ end
163
+
164
+ def _reduce_10(val, _values)
165
+ Star.new(Symbol.new(val.last))
166
+ end
167
+
168
+ # reduce 11 omitted
169
+
170
+ # reduce 12 omitted
171
+
172
+ # reduce 13 omitted
173
+
174
+ # reduce 14 omitted
175
+
176
+ def _reduce_15(val, _values)
177
+ Slash.new('/')
178
+ end
179
+
180
+ def _reduce_16(val, _values)
181
+ Symbol.new(val.first)
182
+ end
183
+
184
+ def _reduce_17(val, _values)
185
+ Literal.new(val.first)
186
+ end
187
+
188
+ def _reduce_18(val, _values)
189
+ Dot.new(val.first)
190
+ end
191
+
192
+ def _reduce_none(val, _values)
193
+ val[0]
194
+ end
195
+
196
+ end # class Parser
197
+ end # module Journey
198
+ end # module ActionDispatch
@@ -0,0 +1,49 @@
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('/') }
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
+
49
+ require 'action_dispatch/journey/parser_extras'
@@ -0,0 +1,23 @@
1
+ require 'action_dispatch/journey/scanner'
2
+ require 'action_dispatch/journey/nodes/node'
3
+
4
+ module ActionDispatch
5
+ module Journey # :nodoc:
6
+ class Parser < Racc::Parser # :nodoc:
7
+ include Journey::Nodes
8
+
9
+ def initialize
10
+ @scanner = Scanner.new
11
+ end
12
+
13
+ def parse(string)
14
+ @scanner.scan_setup(string)
15
+ do_parse
16
+ end
17
+
18
+ def next_token
19
+ @scanner.next_token
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,193 @@
1
+ require 'action_dispatch/journey/router/strexp'
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
+ new Journey::Router::Strexp.build(string, {}, ["/.?"], true)
11
+ end
12
+
13
+ def initialize(strexp)
14
+ @spec = strexp.ast
15
+ @requirements = strexp.requirements
16
+ @separators = strexp.separators.join
17
+ @anchored = strexp.anchor
18
+
19
+ @names = nil
20
+ @optional_names = nil
21
+ @required_names = nil
22
+ @re = nil
23
+ @offsets = nil
24
+ end
25
+
26
+ def build_formatter
27
+ Visitors::FormatBuilder.new.accept(spec)
28
+ end
29
+
30
+ def ast
31
+ @spec.grep(Nodes::Symbol).each do |node|
32
+ re = @requirements[node.to_sym]
33
+ node.regexp = re if re
34
+ end
35
+
36
+ @spec.grep(Nodes::Star).each do |node|
37
+ node = node.left
38
+ node.regexp = @requirements[node.to_sym] || /(.+)/
39
+ end
40
+
41
+ @spec
42
+ end
43
+
44
+ def names
45
+ @names ||= spec.grep(Nodes::Symbol).map { |n| n.name }
46
+ end
47
+
48
+ def required_names
49
+ @required_names ||= names - optional_names
50
+ end
51
+
52
+ def optional_names
53
+ @optional_names ||= spec.grep(Nodes::Group).flat_map { |group|
54
+ group.grep(Nodes::Symbol)
55
+ }.map { |n| n.name }.uniq
56
+ end
57
+
58
+ class RegexpOffsets < Journey::Visitors::Visitor # :nodoc:
59
+ attr_reader :offsets
60
+
61
+ def initialize(matchers)
62
+ @matchers = matchers
63
+ @capture_count = [0]
64
+ end
65
+
66
+ def visit(node)
67
+ super
68
+ @capture_count
69
+ end
70
+
71
+ def visit_SYMBOL(node)
72
+ node = node.to_sym
73
+
74
+ if @matchers.key?(node)
75
+ re = /#{@matchers[node]}|/
76
+ @capture_count.push((re.match('').length - 1) + (@capture_count.last || 0))
77
+ else
78
+ @capture_count << (@capture_count.last || 0)
79
+ end
80
+ end
81
+ end
82
+
83
+ class AnchoredRegexp < Journey::Visitors::Visitor # :nodoc:
84
+ def initialize(separator, matchers)
85
+ @separator = separator
86
+ @matchers = matchers
87
+ @separator_re = "([^#{separator}]+)"
88
+ super()
89
+ end
90
+
91
+ def accept(node)
92
+ %r{\A#{visit node}\Z}
93
+ end
94
+
95
+ def visit_CAT(node)
96
+ [visit(node.left), visit(node.right)].join
97
+ end
98
+
99
+ def visit_SYMBOL(node)
100
+ node = node.to_sym
101
+
102
+ return @separator_re unless @matchers.key?(node)
103
+
104
+ re = @matchers[node]
105
+ "(#{re})"
106
+ end
107
+
108
+ def visit_GROUP(node)
109
+ "(?:#{visit node.left})?"
110
+ end
111
+
112
+ def visit_LITERAL(node)
113
+ Regexp.escape(node.left)
114
+ end
115
+ alias :visit_DOT :visit_LITERAL
116
+
117
+ def visit_SLASH(node)
118
+ node.left
119
+ end
120
+
121
+ def visit_STAR(node)
122
+ re = @matchers[node.left.to_sym] || '.+'
123
+ "(#{re})"
124
+ end
125
+ end
126
+
127
+ class UnanchoredRegexp < AnchoredRegexp # :nodoc:
128
+ def accept(node)
129
+ %r{\A#{visit node}}
130
+ end
131
+ end
132
+
133
+ class MatchData # :nodoc:
134
+ attr_reader :names
135
+
136
+ def initialize(names, offsets, match)
137
+ @names = names
138
+ @offsets = offsets
139
+ @match = match
140
+ end
141
+
142
+ def captures
143
+ (length - 1).times.map { |i| self[i + 1] }
144
+ end
145
+
146
+ def [](x)
147
+ idx = @offsets[x - 1] + x
148
+ @match[idx]
149
+ end
150
+
151
+ def length
152
+ @offsets.length
153
+ end
154
+
155
+ def post_match
156
+ @match.post_match
157
+ end
158
+
159
+ def to_s
160
+ @match.to_s
161
+ end
162
+ end
163
+
164
+ def match(other)
165
+ return unless match = to_regexp.match(other)
166
+ MatchData.new(names, offsets, match)
167
+ end
168
+ alias :=~ :match
169
+
170
+ def source
171
+ to_regexp.source
172
+ end
173
+
174
+ def to_regexp
175
+ @re ||= regexp_visitor.new(@separators, @requirements).accept spec
176
+ end
177
+
178
+ private
179
+
180
+ def regexp_visitor
181
+ @anchored ? AnchoredRegexp : UnanchoredRegexp
182
+ end
183
+
184
+ def offsets
185
+ return @offsets if @offsets
186
+
187
+ viz = RegexpOffsets.new(@requirements)
188
+ @offsets = viz.accept(spec)
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,125 @@
1
+ module ActionDispatch
2
+ module Journey # :nodoc:
3
+ class Route # :nodoc:
4
+ attr_reader :app, :path, :defaults, :name
5
+
6
+ attr_reader :constraints
7
+ alias :conditions :constraints
8
+
9
+ attr_accessor :precedence
10
+
11
+ ##
12
+ # +path+ is a path constraint.
13
+ # +constraints+ is a hash of constraints to be applied to this route.
14
+ def initialize(name, app, path, constraints, defaults = {})
15
+ @name = name
16
+ @app = app
17
+ @path = path
18
+
19
+ @constraints = constraints
20
+ @defaults = defaults
21
+ @required_defaults = nil
22
+ @required_parts = nil
23
+ @parts = nil
24
+ @decorated_ast = nil
25
+ @precedence = 0
26
+ @path_formatter = @path.build_formatter
27
+ end
28
+
29
+ def ast
30
+ @decorated_ast ||= begin
31
+ decorated_ast = path.ast
32
+ decorated_ast.grep(Nodes::Terminal).each { |n| n.memo = self }
33
+ decorated_ast
34
+ end
35
+ end
36
+
37
+ def requirements # :nodoc:
38
+ # needed for rails `rake routes`
39
+ @defaults.merge(path.requirements).delete_if { |_,v|
40
+ /.+?/ == v
41
+ }
42
+ end
43
+
44
+ def segments
45
+ path.names
46
+ end
47
+
48
+ def required_keys
49
+ required_parts + required_defaults.keys
50
+ end
51
+
52
+ def score(constraints)
53
+ required_keys = path.required_names
54
+ supplied_keys = constraints.map { |k,v| v && k.to_s }.compact
55
+
56
+ return -1 unless (required_keys - supplied_keys).empty?
57
+
58
+ score = (supplied_keys & path.names).length
59
+ score + (required_defaults.length * 2)
60
+ end
61
+
62
+ def parts
63
+ @parts ||= segments.map { |n| n.to_sym }
64
+ end
65
+ alias :segment_keys :parts
66
+
67
+ def format(path_options)
68
+ @path_formatter.evaluate path_options
69
+ end
70
+
71
+ def optional_parts
72
+ path.optional_names.map { |n| n.to_sym }
73
+ end
74
+
75
+ def required_parts
76
+ @required_parts ||= path.required_names.map { |n| n.to_sym }
77
+ end
78
+
79
+ def required_default?(key)
80
+ (constraints[:required_defaults] || []).include?(key)
81
+ end
82
+
83
+ def required_defaults
84
+ @required_defaults ||= @defaults.dup.delete_if do |k,_|
85
+ parts.include?(k) || !required_default?(k)
86
+ end
87
+ end
88
+
89
+ def glob?
90
+ !path.spec.grep(Nodes::Star).empty?
91
+ end
92
+
93
+ def dispatcher?
94
+ @app.dispatcher?
95
+ end
96
+
97
+ def matches?(request)
98
+ constraints.all? do |method, value|
99
+ next true unless request.respond_to?(method)
100
+
101
+ case value
102
+ when Regexp, String
103
+ value === request.send(method).to_s
104
+ when Array
105
+ value.include?(request.send(method))
106
+ when TrueClass
107
+ request.send(method).present?
108
+ when FalseClass
109
+ request.send(method).blank?
110
+ else
111
+ value === request.send(method)
112
+ end
113
+ end
114
+ end
115
+
116
+ def ip
117
+ constraints[:ip] || //
118
+ end
119
+
120
+ def verb
121
+ constraints[:request_method] || //
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,27 @@
1
+ module ActionDispatch
2
+ module Journey # :nodoc:
3
+ class Router # :nodoc:
4
+ class Strexp # :nodoc:
5
+ class << self
6
+ alias :compile :new
7
+ end
8
+
9
+ attr_reader :path, :requirements, :separators, :anchor, :ast
10
+
11
+ def self.build(path, requirements, separators, anchor = true)
12
+ parser = Journey::Parser.new
13
+ ast = parser.parse path
14
+ new ast, path, requirements, separators, anchor
15
+ end
16
+
17
+ def initialize(ast, path, requirements, separators, anchor = true)
18
+ @ast = ast
19
+ @path = path
20
+ @requirements = requirements
21
+ @separators = separators
22
+ @anchor = anchor
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,93 @@
1
+ module ActionDispatch
2
+ module Journey # :nodoc:
3
+ class Router # :nodoc:
4
+ class Utils # :nodoc:
5
+ # Normalizes URI path.
6
+ #
7
+ # Strips off trailing slash and ensures there is a leading slash.
8
+ # Also converts downcase url encoded string to uppercase.
9
+ #
10
+ # normalize_path("/foo") # => "/foo"
11
+ # normalize_path("/foo/") # => "/foo"
12
+ # normalize_path("foo") # => "/foo"
13
+ # normalize_path("") # => "/"
14
+ # normalize_path("/%ab") # => "/%AB"
15
+ def self.normalize_path(path)
16
+ path = "/#{path}".force_encoding(Encoding::UTF_8)
17
+ path.squeeze!('/')
18
+ path.sub!(%r{/+\Z}, '')
19
+ path.gsub!(/(%[a-f0-9]{2})/) { $1.upcase }
20
+ path = '/' if path == ''
21
+ path
22
+ end
23
+
24
+ # URI path and fragment escaping
25
+ # http://tools.ietf.org/html/rfc3986
26
+ class UriEncoder # :nodoc:
27
+ ENCODE = "%%%02X".freeze
28
+ US_ASCII = Encoding::US_ASCII
29
+ UTF_8 = Encoding::UTF_8
30
+ EMPTY = "".force_encoding(US_ASCII).freeze
31
+ DEC2HEX = (0..255).to_a.map{ |i| ENCODE % i }.map{ |s| s.force_encoding(US_ASCII) }
32
+
33
+ ALPHA = "a-zA-Z".freeze
34
+ DIGIT = "0-9".freeze
35
+ UNRESERVED = "#{ALPHA}#{DIGIT}\\-\\._~".freeze
36
+ SUB_DELIMS = "!\\$&'\\(\\)\\*\\+,;=".freeze
37
+
38
+ ESCAPED = /%[a-zA-Z0-9]{2}/.freeze
39
+
40
+ FRAGMENT = /[^#{UNRESERVED}#{SUB_DELIMS}:@\/\?]/.freeze
41
+ SEGMENT = /[^#{UNRESERVED}#{SUB_DELIMS}:@]/.freeze
42
+ PATH = /[^#{UNRESERVED}#{SUB_DELIMS}:@\/]/.freeze
43
+
44
+ def escape_fragment(fragment)
45
+ escape(fragment, FRAGMENT)
46
+ end
47
+
48
+ def escape_path(path)
49
+ escape(path, PATH)
50
+ end
51
+
52
+ def escape_segment(segment)
53
+ escape(segment, SEGMENT)
54
+ end
55
+
56
+ def unescape_uri(uri)
57
+ encoding = uri.encoding == US_ASCII ? UTF_8 : uri.encoding
58
+ uri.gsub(ESCAPED) { [$&[1, 2].hex].pack('C') }.force_encoding(encoding)
59
+ end
60
+
61
+ protected
62
+ def escape(component, pattern)
63
+ component.gsub(pattern){ |unsafe| percent_encode(unsafe) }.force_encoding(US_ASCII)
64
+ end
65
+
66
+ def percent_encode(unsafe)
67
+ safe = EMPTY.dup
68
+ unsafe.each_byte { |b| safe << DEC2HEX[b] }
69
+ safe
70
+ end
71
+ end
72
+
73
+ ENCODER = UriEncoder.new
74
+
75
+ def self.escape_path(path)
76
+ ENCODER.escape_path(path.to_s)
77
+ end
78
+
79
+ def self.escape_segment(segment)
80
+ ENCODER.escape_segment(segment.to_s)
81
+ end
82
+
83
+ def self.escape_fragment(fragment)
84
+ ENCODER.escape_fragment(fragment.to_s)
85
+ end
86
+
87
+ def self.unescape_uri(uri)
88
+ ENCODER.unescape_uri(uri)
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end