actionpack 3.2.19 → 4.0.0

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 (263) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +850 -401
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +5 -288
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +39 -37
  7. data/lib/abstract_controller/callbacks.rb +101 -82
  8. data/lib/abstract_controller/collector.rb +7 -3
  9. data/lib/abstract_controller/helpers.rb +25 -13
  10. data/lib/abstract_controller/layouts.rb +74 -74
  11. data/lib/abstract_controller/logger.rb +1 -2
  12. data/lib/abstract_controller/rendering.rb +30 -13
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +6 -6
  15. data/lib/abstract_controller/view_paths.rb +1 -1
  16. data/lib/abstract_controller.rb +1 -8
  17. data/lib/action_controller/base.rb +46 -22
  18. data/lib/action_controller/caching/fragments.rb +23 -53
  19. data/lib/action_controller/caching.rb +46 -33
  20. data/lib/action_controller/deprecated/integration_test.rb +3 -0
  21. data/lib/action_controller/deprecated.rb +5 -1
  22. data/lib/action_controller/log_subscriber.rb +16 -8
  23. data/lib/action_controller/metal/conditional_get.rb +76 -32
  24. data/lib/action_controller/metal/data_streaming.rb +20 -26
  25. data/lib/action_controller/metal/exceptions.rb +19 -6
  26. data/lib/action_controller/metal/flash.rb +24 -9
  27. data/lib/action_controller/metal/force_ssl.rb +70 -12
  28. data/lib/action_controller/metal/head.rb +25 -4
  29. data/lib/action_controller/metal/helpers.rb +5 -9
  30. data/lib/action_controller/metal/hide_actions.rb +0 -1
  31. data/lib/action_controller/metal/http_authentication.rb +107 -83
  32. data/lib/action_controller/metal/implicit_render.rb +1 -1
  33. data/lib/action_controller/metal/instrumentation.rb +2 -1
  34. data/lib/action_controller/metal/live.rb +175 -0
  35. data/lib/action_controller/metal/mime_responds.rb +161 -47
  36. data/lib/action_controller/metal/params_wrapper.rb +112 -74
  37. data/lib/action_controller/metal/rack_delegation.rb +9 -3
  38. data/lib/action_controller/metal/redirecting.rb +15 -20
  39. data/lib/action_controller/metal/renderers.rb +11 -9
  40. data/lib/action_controller/metal/rendering.rb +9 -1
  41. data/lib/action_controller/metal/request_forgery_protection.rb +112 -19
  42. data/lib/action_controller/metal/responder.rb +20 -19
  43. data/lib/action_controller/metal/streaming.rb +12 -18
  44. data/lib/action_controller/metal/strong_parameters.rb +520 -0
  45. data/lib/action_controller/metal/testing.rb +13 -18
  46. data/lib/action_controller/metal/url_for.rb +28 -25
  47. data/lib/action_controller/metal.rb +17 -32
  48. data/lib/action_controller/model_naming.rb +12 -0
  49. data/lib/action_controller/railtie.rb +33 -17
  50. data/lib/action_controller/railties/helpers.rb +22 -0
  51. data/lib/action_controller/record_identifier.rb +18 -72
  52. data/lib/action_controller/test_case.rb +251 -131
  53. data/lib/action_controller/vendor/html-scanner.rb +4 -19
  54. data/lib/action_controller.rb +15 -6
  55. data/lib/action_dispatch/http/cache.rb +63 -11
  56. data/lib/action_dispatch/http/filter_parameters.rb +18 -8
  57. data/lib/action_dispatch/http/filter_redirect.rb +37 -0
  58. data/lib/action_dispatch/http/headers.rb +49 -17
  59. data/lib/action_dispatch/http/mime_negotiation.rb +24 -1
  60. data/lib/action_dispatch/http/mime_type.rb +154 -100
  61. data/lib/action_dispatch/http/mime_types.rb +1 -1
  62. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  63. data/lib/action_dispatch/http/parameters.rb +28 -28
  64. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  65. data/lib/action_dispatch/http/request.rb +64 -18
  66. data/lib/action_dispatch/http/response.rb +130 -35
  67. data/lib/action_dispatch/http/upload.rb +63 -20
  68. data/lib/action_dispatch/http/url.rb +98 -35
  69. data/lib/action_dispatch/journey/backwards.rb +5 -0
  70. data/lib/action_dispatch/journey/formatter.rb +146 -0
  71. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  72. data/lib/action_dispatch/journey/gtg/simulator.rb +44 -0
  73. data/lib/action_dispatch/journey/gtg/transition_table.rb +156 -0
  74. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  75. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  76. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  77. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  78. data/lib/action_dispatch/journey/nodes/node.rb +124 -0
  79. data/lib/action_dispatch/journey/parser.rb +206 -0
  80. data/lib/action_dispatch/journey/parser.y +47 -0
  81. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  82. data/lib/action_dispatch/journey/path/pattern.rb +196 -0
  83. data/lib/action_dispatch/journey/route.rb +124 -0
  84. data/lib/action_dispatch/journey/router/strexp.rb +24 -0
  85. data/lib/action_dispatch/journey/router/utils.rb +54 -0
  86. data/lib/action_dispatch/journey/router.rb +166 -0
  87. data/lib/action_dispatch/journey/routes.rb +75 -0
  88. data/lib/action_dispatch/journey/scanner.rb +61 -0
  89. data/lib/action_dispatch/journey/visitors.rb +197 -0
  90. data/lib/action_dispatch/journey/visualizer/fsm.css +34 -0
  91. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  92. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  93. data/lib/action_dispatch/journey.rb +5 -0
  94. data/lib/action_dispatch/middleware/callbacks.rb +9 -4
  95. data/lib/action_dispatch/middleware/cookies.rb +259 -114
  96. data/lib/action_dispatch/middleware/debug_exceptions.rb +26 -17
  97. data/lib/action_dispatch/middleware/exception_wrapper.rb +29 -3
  98. data/lib/action_dispatch/middleware/flash.rb +58 -58
  99. data/lib/action_dispatch/middleware/params_parser.rb +14 -29
  100. data/lib/action_dispatch/middleware/public_exceptions.rb +30 -14
  101. data/lib/action_dispatch/middleware/reloader.rb +6 -6
  102. data/lib/action_dispatch/middleware/remote_ip.rb +145 -39
  103. data/lib/action_dispatch/middleware/request_id.rb +2 -6
  104. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  105. data/lib/action_dispatch/middleware/session/cookie_store.rb +82 -28
  106. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  107. data/lib/action_dispatch/middleware/show_exceptions.rb +12 -45
  108. data/lib/action_dispatch/middleware/ssl.rb +70 -0
  109. data/lib/action_dispatch/middleware/stack.rb +6 -1
  110. data/lib/action_dispatch/middleware/static.rb +2 -1
  111. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +14 -11
  112. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +25 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +7 -9
  114. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +15 -9
  115. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +127 -5
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +7 -2
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +30 -15
  118. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +39 -13
  119. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +6 -2
  120. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  121. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +144 -0
  122. data/lib/action_dispatch/railtie.rb +16 -6
  123. data/lib/action_dispatch/request/session.rb +181 -0
  124. data/lib/action_dispatch/routing/inspector.rb +240 -0
  125. data/lib/action_dispatch/routing/mapper.rb +540 -291
  126. data/lib/action_dispatch/routing/polymorphic_routes.rb +16 -20
  127. data/lib/action_dispatch/routing/redirection.rb +46 -29
  128. data/lib/action_dispatch/routing/route_set.rb +207 -164
  129. data/lib/action_dispatch/routing/routes_proxy.rb +2 -0
  130. data/lib/action_dispatch/routing/url_for.rb +48 -33
  131. data/lib/action_dispatch/routing.rb +48 -83
  132. data/lib/action_dispatch/testing/assertions/dom.rb +3 -13
  133. data/lib/action_dispatch/testing/assertions/response.rb +32 -40
  134. data/lib/action_dispatch/testing/assertions/routing.rb +42 -41
  135. data/lib/action_dispatch/testing/assertions/selector.rb +17 -22
  136. data/lib/action_dispatch/testing/assertions/tag.rb +20 -23
  137. data/lib/action_dispatch/testing/integration.rb +65 -51
  138. data/lib/action_dispatch/testing/test_process.rb +9 -6
  139. data/lib/action_dispatch/testing/test_request.rb +7 -3
  140. data/lib/action_dispatch.rb +21 -15
  141. data/lib/action_pack/version.rb +7 -6
  142. data/lib/action_pack.rb +1 -1
  143. data/lib/action_view/base.rb +15 -34
  144. data/lib/action_view/buffers.rb +7 -1
  145. data/lib/action_view/context.rb +4 -4
  146. data/lib/action_view/dependency_tracker.rb +93 -0
  147. data/lib/action_view/digestor.rb +85 -0
  148. data/lib/action_view/flows.rb +1 -4
  149. data/lib/action_view/helpers/active_model_helper.rb +3 -4
  150. data/lib/action_view/helpers/asset_tag_helper.rb +215 -352
  151. data/lib/action_view/helpers/asset_url_helper.rb +355 -0
  152. data/lib/action_view/helpers/atom_feed_helper.rb +13 -10
  153. data/lib/action_view/helpers/cache_helper.rb +150 -18
  154. data/lib/action_view/helpers/capture_helper.rb +44 -31
  155. data/lib/action_view/helpers/csrf_helper.rb +0 -2
  156. data/lib/action_view/helpers/date_helper.rb +269 -248
  157. data/lib/action_view/helpers/debug_helper.rb +10 -11
  158. data/lib/action_view/helpers/form_helper.rb +931 -537
  159. data/lib/action_view/helpers/form_options_helper.rb +341 -166
  160. data/lib/action_view/helpers/form_tag_helper.rb +190 -90
  161. data/lib/action_view/helpers/javascript_helper.rb +23 -16
  162. data/lib/action_view/helpers/number_helper.rb +148 -329
  163. data/lib/action_view/helpers/output_safety_helper.rb +3 -3
  164. data/lib/action_view/helpers/record_tag_helper.rb +17 -22
  165. data/lib/action_view/helpers/rendering_helper.rb +2 -2
  166. data/lib/action_view/helpers/sanitize_helper.rb +3 -6
  167. data/lib/action_view/helpers/tag_helper.rb +46 -33
  168. data/lib/action_view/helpers/tags/base.rb +147 -0
  169. data/lib/action_view/helpers/tags/check_box.rb +64 -0
  170. data/lib/action_view/helpers/tags/checkable.rb +16 -0
  171. data/lib/action_view/helpers/tags/collection_check_boxes.rb +43 -0
  172. data/lib/action_view/helpers/tags/collection_helpers.rb +83 -0
  173. data/lib/action_view/helpers/tags/collection_radio_buttons.rb +36 -0
  174. data/lib/action_view/helpers/tags/collection_select.rb +28 -0
  175. data/lib/action_view/helpers/tags/color_field.rb +25 -0
  176. data/lib/action_view/helpers/tags/date_field.rb +13 -0
  177. data/lib/action_view/helpers/tags/date_select.rb +72 -0
  178. data/lib/action_view/helpers/tags/datetime_field.rb +22 -0
  179. data/lib/action_view/helpers/tags/datetime_local_field.rb +19 -0
  180. data/lib/action_view/helpers/tags/datetime_select.rb +8 -0
  181. data/lib/action_view/helpers/tags/email_field.rb +8 -0
  182. data/lib/action_view/helpers/tags/file_field.rb +8 -0
  183. data/lib/action_view/helpers/tags/grouped_collection_select.rb +29 -0
  184. data/lib/action_view/helpers/tags/hidden_field.rb +8 -0
  185. data/lib/action_view/helpers/tags/label.rb +65 -0
  186. data/lib/action_view/helpers/tags/month_field.rb +13 -0
  187. data/lib/action_view/helpers/tags/number_field.rb +18 -0
  188. data/lib/action_view/helpers/tags/password_field.rb +12 -0
  189. data/lib/action_view/helpers/tags/radio_button.rb +31 -0
  190. data/lib/action_view/helpers/tags/range_field.rb +8 -0
  191. data/lib/action_view/helpers/tags/search_field.rb +24 -0
  192. data/lib/action_view/helpers/tags/select.rb +40 -0
  193. data/lib/action_view/helpers/tags/tel_field.rb +8 -0
  194. data/lib/action_view/helpers/tags/text_area.rb +18 -0
  195. data/lib/action_view/helpers/tags/text_field.rb +29 -0
  196. data/lib/action_view/helpers/tags/time_field.rb +13 -0
  197. data/lib/action_view/helpers/tags/time_select.rb +8 -0
  198. data/lib/action_view/helpers/tags/time_zone_select.rb +20 -0
  199. data/lib/action_view/helpers/tags/url_field.rb +8 -0
  200. data/lib/action_view/helpers/tags/week_field.rb +13 -0
  201. data/lib/action_view/helpers/tags.rb +39 -0
  202. data/lib/action_view/helpers/text_helper.rb +130 -114
  203. data/lib/action_view/helpers/translation_helper.rb +32 -16
  204. data/lib/action_view/helpers/url_helper.rb +211 -270
  205. data/lib/action_view/helpers.rb +2 -4
  206. data/lib/action_view/locale/en.yml +1 -105
  207. data/lib/action_view/log_subscriber.rb +6 -4
  208. data/lib/action_view/lookup_context.rb +15 -28
  209. data/lib/action_view/model_naming.rb +12 -0
  210. data/lib/action_view/path_set.rb +8 -20
  211. data/lib/action_view/railtie.rb +6 -22
  212. data/lib/action_view/record_identifier.rb +84 -0
  213. data/lib/action_view/renderer/abstract_renderer.rb +25 -19
  214. data/lib/action_view/renderer/partial_renderer.rb +158 -81
  215. data/lib/action_view/renderer/renderer.rb +8 -12
  216. data/lib/action_view/renderer/streaming_template_renderer.rb +2 -5
  217. data/lib/action_view/renderer/template_renderer.rb +12 -10
  218. data/lib/action_view/routing_url_for.rb +107 -0
  219. data/lib/action_view/template/error.rb +22 -12
  220. data/lib/action_view/template/handlers/builder.rb +1 -1
  221. data/lib/action_view/template/handlers/erb.rb +40 -19
  222. data/lib/action_view/template/handlers/raw.rb +11 -0
  223. data/lib/action_view/template/handlers.rb +12 -9
  224. data/lib/action_view/template/resolver.rb +107 -53
  225. data/lib/action_view/template/text.rb +12 -8
  226. data/lib/action_view/template/types.rb +57 -0
  227. data/lib/action_view/template.rb +25 -23
  228. data/lib/action_view/test_case.rb +67 -42
  229. data/lib/{action_controller → action_view}/vendor/html-scanner/html/document.rb +0 -0
  230. data/lib/{action_controller → action_view}/vendor/html-scanner/html/node.rb +12 -12
  231. data/lib/{action_controller → action_view}/vendor/html-scanner/html/sanitizer.rb +13 -2
  232. data/lib/{action_controller → action_view}/vendor/html-scanner/html/selector.rb +9 -9
  233. data/lib/{action_controller → action_view}/vendor/html-scanner/html/tokenizer.rb +1 -1
  234. data/lib/{action_controller → action_view}/vendor/html-scanner/html/version.rb +0 -0
  235. data/lib/action_view/vendor/html-scanner.rb +20 -0
  236. data/lib/action_view.rb +17 -8
  237. metadata +184 -214
  238. data/lib/action_controller/caching/actions.rb +0 -185
  239. data/lib/action_controller/caching/pages.rb +0 -187
  240. data/lib/action_controller/caching/sweeping.rb +0 -97
  241. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  242. data/lib/action_controller/metal/compatibility.rb +0 -65
  243. data/lib/action_controller/metal/session_management.rb +0 -14
  244. data/lib/action_controller/railties/paths.rb +0 -25
  245. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  246. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  247. data/lib/action_dispatch/middleware/head.rb +0 -18
  248. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  249. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  250. data/lib/action_view/asset_paths.rb +0 -142
  251. data/lib/action_view/helpers/asset_paths.rb +0 -7
  252. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  253. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  254. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  255. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  256. data/lib/sprockets/assets.rake +0 -99
  257. data/lib/sprockets/bootstrap.rb +0 -37
  258. data/lib/sprockets/compressors.rb +0 -83
  259. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  260. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  261. data/lib/sprockets/helpers.rb +0 -6
  262. data/lib/sprockets/railtie.rb +0 -62
  263. data/lib/sprockets/static_compiler.rb +0 -56
@@ -6,6 +6,7 @@ module ActionView #:nodoc:
6
6
 
7
7
  autoload :ActiveModelHelper
8
8
  autoload :AssetTagHelper
9
+ autoload :AssetUrlHelper
9
10
  autoload :AtomFeedHelper
10
11
  autoload :CacheHelper
11
12
  autoload :CaptureHelper
@@ -29,13 +30,10 @@ module ActionView #:nodoc:
29
30
 
30
31
  extend ActiveSupport::Concern
31
32
 
32
- included do
33
- extend SanitizeHelper::ClassMethods
34
- end
35
-
36
33
  include ActiveSupport::Benchmarkable
37
34
  include ActiveModelHelper
38
35
  include AssetTagHelper
36
+ include AssetUrlHelper
39
37
  include AtomFeedHelper
40
38
  include CacheHelper
41
39
  include CaptureHelper
@@ -1,101 +1,4 @@
1
1
  "en":
2
- number:
3
- # Used in number_with_delimiter()
4
- # These are also the defaults for 'currency', 'percentage', 'precision', and 'human'
5
- format:
6
- # Sets the separator between the units, for more precision (e.g. 1.0 / 2.0 == 0.5)
7
- separator: "."
8
- # Delimits thousands (e.g. 1,000,000 is a million) (always in groups of three)
9
- delimiter: ","
10
- # Number of decimals, behind the separator (the number 1 with a precision of 2 gives: 1.00)
11
- precision: 3
12
- # If set to true, precision will mean the number of significant digits instead
13
- # of the number of decimal digits (1234 with precision 2 becomes 1200, 1.23543 becomes 1.2)
14
- significant: false
15
- # If set, the zeros after the decimal separator will always be stripped (eg.: 1.200 will be 1.2)
16
- strip_insignificant_zeros: false
17
-
18
- # Used in number_to_currency()
19
- currency:
20
- format:
21
- # Where is the currency sign? %u is the currency unit, %n the number (default: $5.00)
22
- format: "%u%n"
23
- unit: "$"
24
- # These five are to override number.format and are optional
25
- separator: "."
26
- delimiter: ","
27
- precision: 2
28
- significant: false
29
- strip_insignificant_zeros: false
30
-
31
- # Used in number_to_percentage()
32
- percentage:
33
- format:
34
- # These five are to override number.format and are optional
35
- # separator:
36
- delimiter: ""
37
- # precision:
38
- # significant: false
39
- # strip_insignificant_zeros: false
40
-
41
- # Used in number_to_precision()
42
- precision:
43
- format:
44
- # These five are to override number.format and are optional
45
- # separator:
46
- delimiter: ""
47
- # precision:
48
- # significant: false
49
- # strip_insignificant_zeros: false
50
-
51
- # Used in number_to_human_size() and number_to_human()
52
- human:
53
- format:
54
- # These five are to override number.format and are optional
55
- # separator:
56
- delimiter: ""
57
- precision: 3
58
- significant: true
59
- strip_insignificant_zeros: true
60
- # Used in number_to_human_size()
61
- storage_units:
62
- # Storage units output formatting.
63
- # %u is the storage unit, %n is the number (default: 2 MB)
64
- format: "%n %u"
65
- units:
66
- byte:
67
- one: "Byte"
68
- other: "Bytes"
69
- kb: "KB"
70
- mb: "MB"
71
- gb: "GB"
72
- tb: "TB"
73
- # Used in number_to_human()
74
- decimal_units:
75
- format: "%n %u"
76
- # Decimal units output formatting
77
- # By default we will only quantify some of the exponents
78
- # but the commented ones might be defined or overridden
79
- # by the user.
80
- units:
81
- # femto: Quadrillionth
82
- # pico: Trillionth
83
- # nano: Billionth
84
- # micro: Millionth
85
- # mili: Thousandth
86
- # centi: Hundredth
87
- # deci: Tenth
88
- unit: ""
89
- # ten:
90
- # one: Ten
91
- # other: Tens
92
- # hundred: Hundred
93
- thousand: Thousand
94
- million: Million
95
- billion: Billion
96
- trillion: Trillion
97
- quadrillion: Quadrillion
98
-
99
2
  # Used in distance_of_time_in_words(), distance_of_time_in_words_to_now(), time_ago_in_words()
100
3
  datetime:
101
4
  distance_in_words:
@@ -146,15 +49,8 @@
146
49
  # Default value for :prompt => true in FormOptionsHelper
147
50
  prompt: "Please select"
148
51
 
149
- # Default translation keys for submit FormHelper
52
+ # Default translation keys for submit and button FormHelper
150
53
  submit:
151
54
  create: 'Create %{model}'
152
55
  update: 'Update %{model}'
153
56
  submit: 'Save %{model}'
154
-
155
- # Default translation keys for button FormHelper
156
- button:
157
- create: 'Create %{model}'
158
- update: 'Update %{model}'
159
- submit: 'Save %{model}'
160
-
@@ -3,24 +3,26 @@ module ActionView
3
3
  #
4
4
  # Provides functionality so that Rails can output logs from Action View.
5
5
  class LogSubscriber < ActiveSupport::LogSubscriber
6
+ VIEWS_PATTERN = /^app\/views\//.freeze
7
+
6
8
  def render_template(event)
9
+ return unless logger.info?
7
10
  message = " Rendered #{from_rails_root(event.payload[:identifier])}"
8
11
  message << " within #{from_rails_root(event.payload[:layout])}" if event.payload[:layout]
9
- message << (" (%.1fms)" % event.duration)
12
+ message << " (#{event.duration.round(1)}ms)"
10
13
  info(message)
11
14
  end
12
15
  alias :render_partial :render_template
13
16
  alias :render_collection :render_template
14
17
 
15
- # TODO: Ideally, ActionView should have its own logger so it does not depend on AC.logger
16
18
  def logger
17
- ActionController::Base.logger if defined?(ActionController::Base)
19
+ ActionView::Base.logger
18
20
  end
19
21
 
20
22
  protected
21
23
 
22
24
  def from_rails_root(string)
23
- string.sub("#{Rails.root}/", "").sub(/^app\/views\//, "")
25
+ string.sub("#{Rails.root}/", "").sub(VIEWS_PATTERN, "")
24
26
  end
25
27
  end
26
28
  end
@@ -1,6 +1,6 @@
1
- require 'active_support/core_ext/array/wrap'
2
- require 'active_support/core_ext/object/blank'
1
+ require 'thread_safe'
3
2
  require 'active_support/core_ext/module/remove_method'
3
+ require 'active_support/core_ext/module/attribute_accessors'
4
4
 
5
5
  module ActionView
6
6
  # = Action View Lookup Context
@@ -25,11 +25,11 @@ module ActionView
25
25
  Accessors.send :define_method, :"default_#{name}", &block
26
26
  Accessors.module_eval <<-METHOD, __FILE__, __LINE__ + 1
27
27
  def #{name}
28
- @details[:#{name}]
28
+ @details.fetch(:#{name}, [])
29
29
  end
30
30
 
31
31
  def #{name}=(value)
32
- value = value.present? ? Array.wrap(value) : default_#{name}
32
+ value = value.present? ? Array(value) : default_#{name}
33
33
  _set_detail(:#{name}, value) if value != @details[:#{name}]
34
34
  end
35
35
 
@@ -51,7 +51,7 @@ module ActionView
51
51
  locales.uniq!
52
52
  locales
53
53
  end
54
- register_detail(:formats) { Mime::SET.symbols }
54
+ register_detail(:formats) { ActionView::Base.default_formats || [:html, :text, :js, :css, :xml, :json] }
55
55
  register_detail(:handlers){ Template::Handlers.extensions }
56
56
 
57
57
  class DetailsKey #:nodoc:
@@ -59,16 +59,9 @@ module ActionView
59
59
  alias :object_hash :hash
60
60
 
61
61
  attr_reader :hash
62
- @details_keys = Hash.new
62
+ @details_keys = ThreadSafe::Cache.new
63
63
 
64
64
  def self.get(details)
65
- if details[:formats]
66
- details = details.dup
67
- syms = Set.new Mime::SET.symbols
68
- details[:formats] = details[:formats].select { |v|
69
- syms.include? v
70
- }
71
- end
72
65
  @details_keys[details] ||= new
73
66
  end
74
67
 
@@ -110,12 +103,12 @@ module ActionView
110
103
 
111
104
  # Helpers related to template lookup using the lookup context information.
112
105
  module ViewPaths
113
- attr_reader :view_paths
106
+ attr_reader :view_paths, :html_fallback_for_js
114
107
 
115
108
  # Whenever setting view paths, makes a copy so we can manipulate then in
116
109
  # instance objects as we wish.
117
110
  def view_paths=(paths)
118
- @view_paths = ActionView::PathSet.new(Array.wrap(paths))
111
+ @view_paths = ActionView::PathSet.new(Array(paths))
119
112
  end
120
113
 
121
114
  def find(name, prefixes = [], partial = false, keys = [], options = {})
@@ -164,14 +157,9 @@ module ActionView
164
157
  # as well as incorrectly putting part of the path in the template
165
158
  # name instead of the prefix.
166
159
  def normalize_name(name, prefixes) #:nodoc:
167
- name = name.to_s.sub(handlers_regexp) do |match|
168
- ActiveSupport::Deprecation.warn "Passing a template handler in the template name is deprecated. " \
169
- "You can simply remove the handler name or pass render :handlers => [:#{match[1..-1]}] instead.", caller
170
- ""
171
- end
172
-
173
- prefixes = nil if prefixes.blank?
174
- parts = name.split('/')
160
+ prefixes = prefixes.presence
161
+ parts = name.to_s.split('/')
162
+ parts.shift if parts.first.empty?
175
163
  name = parts.pop
176
164
 
177
165
  return name, prefixes || [""] if parts.empty?
@@ -181,10 +169,6 @@ module ActionView
181
169
 
182
170
  return name, prefixes
183
171
  end
184
-
185
- def handlers_regexp #:nodoc:
186
- @@handlers_regexp ||= /\.(?:#{default_handlers.join('|')})$/
187
- end
188
172
  end
189
173
 
190
174
  include Accessors
@@ -207,7 +191,10 @@ module ActionView
207
191
  def formats=(values)
208
192
  if values
209
193
  values.concat(default_formats) if values.delete "*/*"
210
- values << :html if values == [:js]
194
+ if values == [:js]
195
+ values << :html
196
+ @html_fallback_for_js = true
197
+ end
211
198
  end
212
199
  super(values)
213
200
  end
@@ -0,0 +1,12 @@
1
+ module ActionView
2
+ module ModelNaming
3
+ # Converts the given object to an ActiveModel compliant one.
4
+ def convert_to_model(object)
5
+ object.respond_to?(:to_model) ? object.to_model : object
6
+ end
7
+
8
+ def model_name_from_record_or_class(record_or_class)
9
+ (record_or_class.is_a?(Class) ? record_or_class : convert_to_model(record_or_class).class).model_name
10
+ end
11
+ end
12
+ end
@@ -1,10 +1,18 @@
1
1
  module ActionView #:nodoc:
2
2
  # = Action View PathSet
3
+ #
4
+ # This class is used to store and access paths in Action View. A number of
5
+ # operations are defined so that you can search among the paths in this
6
+ # set and also perform operations on other +PathSet+ objects.
7
+ #
8
+ # A +LookupContext+ will use a +PathSet+ to store the paths in its context.
3
9
  class PathSet #:nodoc:
4
10
  include Enumerable
5
11
 
6
12
  attr_reader :paths
7
13
 
14
+ delegate :[], :include?, :pop, :size, :each, to: :paths
15
+
8
16
  def initialize(paths = [])
9
17
  @paths = typecast paths
10
18
  end
@@ -14,30 +22,10 @@ module ActionView #:nodoc:
14
22
  self
15
23
  end
16
24
 
17
- def [](i)
18
- paths[i]
19
- end
20
-
21
25
  def to_ary
22
26
  paths.dup
23
27
  end
24
28
 
25
- def include?(item)
26
- paths.include? item
27
- end
28
-
29
- def pop
30
- paths.pop
31
- end
32
-
33
- def size
34
- paths.size
35
- end
36
-
37
- def each(&block)
38
- paths.each(&block)
39
- end
40
-
41
29
  def compact
42
30
  PathSet.new paths.compact
43
31
  end
@@ -3,11 +3,11 @@ require "rails"
3
3
 
4
4
  module ActionView
5
5
  # = Action View Railtie
6
- class Railtie < Rails::Railtie
6
+ class Railtie < Rails::Railtie # :nodoc:
7
7
  config.action_view = ActiveSupport::OrderedOptions.new
8
- config.action_view.stylesheet_expansions = {}
9
- config.action_view.javascript_expansions = { :defaults => %w(jquery jquery_ujs) }
10
- config.action_view.embed_authenticity_token_in_remote_forms = true
8
+ config.action_view.embed_authenticity_token_in_remote_forms = false
9
+
10
+ config.eager_load_namespaces << ActionView
11
11
 
12
12
  initializer "action_view.embed_authenticity_token_in_remote_forms" do |app|
13
13
  ActiveSupport.on_load(:action_view) do
@@ -16,24 +16,8 @@ module ActionView
16
16
  end
17
17
  end
18
18
 
19
- initializer "action_view.cache_asset_ids" do |app|
20
- unless app.config.cache_classes
21
- ActiveSupport.on_load(:action_view) do
22
- ActionView::Helpers::AssetTagHelper::AssetPaths.cache_asset_ids = false
23
- end
24
- end
25
- end
26
-
27
- initializer "action_view.javascript_expansions" do |app|
28
- ActiveSupport.on_load(:action_view) do
29
- ActionView::Helpers::AssetTagHelper.register_javascript_expansion(
30
- app.config.action_view.delete(:javascript_expansions)
31
- )
32
-
33
- ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion(
34
- app.config.action_view.delete(:stylesheet_expansions)
35
- )
36
- end
19
+ initializer "action_view.logger" do
20
+ ActiveSupport.on_load(:action_view) { self.logger ||= Rails.logger }
37
21
  end
38
22
 
39
23
  initializer "action_view.set_configs" do |app|
@@ -0,0 +1,84 @@
1
+ require 'active_support/core_ext/module'
2
+ require 'action_view/model_naming'
3
+
4
+ module ActionView
5
+ # The record identifier encapsulates a number of naming conventions for dealing with records, like Active Records or
6
+ # pretty much any other model type that has an id. These patterns are then used to try elevate the view actions to
7
+ # a higher logical level.
8
+ #
9
+ # # routes
10
+ # resources :posts
11
+ #
12
+ # # view
13
+ # <%= div_for(post) do %> <div id="post_45" class="post">
14
+ # <%= post.body %> What a wonderful world!
15
+ # <% end %> </div>
16
+ #
17
+ # # controller
18
+ # def update
19
+ # post = Post.find(params[:id])
20
+ # post.update(params[:post])
21
+ #
22
+ # redirect_to(post) # Calls polymorphic_url(post) which in turn calls post_url(post)
23
+ # end
24
+ #
25
+ # As the example above shows, you can stop caring to a large extent what the actual id of the post is.
26
+ # You just know that one is being assigned and that the subsequent calls in redirect_to expect that
27
+ # same naming convention and allows you to write less code if you follow it.
28
+ module RecordIdentifier
29
+ extend self
30
+ extend ModelNaming
31
+
32
+ include ModelNaming
33
+
34
+ JOIN = '_'.freeze
35
+ NEW = 'new'.freeze
36
+
37
+ # The DOM class convention is to use the singular form of an object or class.
38
+ #
39
+ # dom_class(post) # => "post"
40
+ # dom_class(Person) # => "person"
41
+ #
42
+ # If you need to address multiple instances of the same class in the same view, you can prefix the dom_class:
43
+ #
44
+ # dom_class(post, :edit) # => "edit_post"
45
+ # dom_class(Person, :edit) # => "edit_person"
46
+ def dom_class(record_or_class, prefix = nil)
47
+ singular = model_name_from_record_or_class(record_or_class).param_key
48
+ prefix ? "#{prefix}#{JOIN}#{singular}" : singular
49
+ end
50
+
51
+ # The DOM id convention is to use the singular form of an object or class with the id following an underscore.
52
+ # If no id is found, prefix with "new_" instead.
53
+ #
54
+ # dom_id(Post.find(45)) # => "post_45"
55
+ # dom_id(Post.new) # => "new_post"
56
+ #
57
+ # If you need to address multiple instances of the same class in the same view, you can prefix the dom_id:
58
+ #
59
+ # dom_id(Post.find(45), :edit) # => "edit_post_45"
60
+ # dom_id(Post.new, :custom) # => "custom_post"
61
+ def dom_id(record, prefix = nil)
62
+ if record_id = record_key_for_dom_id(record)
63
+ "#{dom_class(record, prefix)}#{JOIN}#{record_id}"
64
+ else
65
+ dom_class(record, prefix || NEW)
66
+ end
67
+ end
68
+
69
+ protected
70
+
71
+ # Returns a string representation of the key attribute(s) that is suitable for use in an HTML DOM id.
72
+ # This can be overwritten to customize the default generated string representation if desired.
73
+ # If you need to read back a key from a dom_id in order to query for the underlying database record,
74
+ # you should write a helper like 'person_record_from_dom_id' that will extract the key either based
75
+ # on the default implementation (which just joins all key attributes with '_') or on your own
76
+ # overwritten version of the method. By default, this implementation passes the key string through a
77
+ # method that replaces all characters that are invalid inside DOM ids, with valid ones. You need to
78
+ # make sure yourself that your dom ids are valid, in case you overwrite this method.
79
+ def record_key_for_dom_id(record)
80
+ key = convert_to_model(record).to_key
81
+ key ? key.join('_') : key
82
+ end
83
+ end
84
+ end
@@ -1,7 +1,21 @@
1
1
  module ActionView
2
+ # This class defines the interface for a renderer. Each class that
3
+ # subclasses +AbstractRenderer+ is used by the base +Renderer+ class to
4
+ # render a specific type of object.
5
+ #
6
+ # The base +Renderer+ class uses its +render+ method to delegate to the
7
+ # renderers. These currently consist of
8
+ #
9
+ # PartialRenderer - Used for rendering partials
10
+ # TemplateRenderer - Used for rendering other types of templates
11
+ # StreamingTemplateRenderer - Used for streaming
12
+ #
13
+ # Whenever the +render+ method is called on the base +Renderer+ class, a new
14
+ # renderer object of the correct type is created, and the +render+ method on
15
+ # that new object is called in turn. This abstracts the setup and rendering
16
+ # into a separate classes for partials and templates.
2
17
  class AbstractRenderer #:nodoc:
3
- delegate :find_template, :template_exists?, :with_fallbacks, :update_details,
4
- :with_layout_format, :formats, :to => :@lookup_context
18
+ delegate :find_template, :template_exists?, :with_fallbacks, :with_layout_format, :formats, :to => :@lookup_context
5
19
 
6
20
  def initialize(lookup_context)
7
21
  @lookup_context = lookup_context
@@ -12,30 +26,22 @@ module ActionView
12
26
  end
13
27
 
14
28
  protected
15
-
29
+
16
30
  def extract_details(options)
17
- details = {}
18
- @lookup_context.registered_details.each do |key|
31
+ @lookup_context.registered_details.each_with_object({}) do |key, details|
19
32
  next unless value = options[key]
20
- details[key] = Array.wrap(value)
21
- end
22
- details
23
- end
24
-
25
- def extract_format(value, details)
26
- if value.is_a?(String) && value.sub!(formats_regexp, "")
27
- ActiveSupport::Deprecation.warn "Passing the format in the template name is deprecated. " \
28
- "Please pass render with :formats => [:#{$1}] instead.", caller
29
- details[:formats] ||= [$1.to_sym]
33
+ details[key] = Array(value)
30
34
  end
31
35
  end
32
36
 
33
- def formats_regexp
34
- @@formats_regexp ||= /\.(#{Mime::SET.symbols.join('|')})$/
35
- end
36
-
37
37
  def instrument(name, options={})
38
38
  ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
39
39
  end
40
+
41
+ def prepend_formats(formats)
42
+ formats = Array(formats)
43
+ return if formats.empty? || @lookup_context.html_fallback_for_js
44
+ @lookup_context.formats = formats | @lookup_context.formats
45
+ end
40
46
  end
41
47
  end