actionpack 3.2.22.5 → 4.0.0.beta1

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