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
@@ -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,5 +1,4 @@
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'
4
3
 
5
4
  module ActionView
@@ -25,11 +24,11 @@ module ActionView
25
24
  Accessors.send :define_method, :"default_#{name}", &block
26
25
  Accessors.module_eval <<-METHOD, __FILE__, __LINE__ + 1
27
26
  def #{name}
28
- @details[:#{name}]
27
+ @details.fetch(:#{name}, [])
29
28
  end
30
29
 
31
30
  def #{name}=(value)
32
- value = value.present? ? Array.wrap(value) : default_#{name}
31
+ value = value.present? ? Array(value) : default_#{name}
33
32
  _set_detail(:#{name}, value) if value != @details[:#{name}]
34
33
  end
35
34
 
@@ -44,14 +43,8 @@ module ActionView
44
43
  module Accessors #:nodoc:
45
44
  end
46
45
 
47
- register_detail(:locale) do
48
- locales = [I18n.locale]
49
- locales.concat(I18n.fallbacks[I18n.locale]) if I18n.respond_to? :fallbacks
50
- locales << I18n.default_locale
51
- locales.uniq!
52
- locales
53
- end
54
- register_detail(:formats) { Mime::SET.symbols }
46
+ register_detail(:locale) { [I18n.locale, I18n.default_locale].uniq }
47
+ register_detail(:formats) { ActionView::Base.default_formats || [:html, :text, :js, :css, :xml, :json] }
55
48
  register_detail(:handlers){ Template::Handlers.extensions }
56
49
 
57
50
  class DetailsKey #:nodoc:
@@ -59,16 +52,9 @@ module ActionView
59
52
  alias :object_hash :hash
60
53
 
61
54
  attr_reader :hash
62
- @details_keys = Hash.new
55
+ @details_keys = ThreadSafe::Cache.new
63
56
 
64
57
  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
58
  @details_keys[details] ||= new
73
59
  end
74
60
 
@@ -110,12 +96,12 @@ module ActionView
110
96
 
111
97
  # Helpers related to template lookup using the lookup context information.
112
98
  module ViewPaths
113
- attr_reader :view_paths
99
+ attr_reader :view_paths, :html_fallback_for_js
114
100
 
115
101
  # Whenever setting view paths, makes a copy so we can manipulate then in
116
102
  # instance objects as we wish.
117
103
  def view_paths=(paths)
118
- @view_paths = ActionView::PathSet.new(Array.wrap(paths))
104
+ @view_paths = ActionView::PathSet.new(Array(paths))
119
105
  end
120
106
 
121
107
  def find(name, prefixes = [], partial = false, keys = [], options = {})
@@ -127,10 +113,6 @@ module ActionView
127
113
  @view_paths.find_all(*args_for_lookup(name, prefixes, partial, keys, options))
128
114
  end
129
115
 
130
- def find_file(name, prefixes = [], partial = false, keys = [], options = {})
131
- @view_paths.find_file(*args_for_lookup(name, prefixes, partial, keys, options))
132
- end
133
-
134
116
  def exists?(name, prefixes = [], partial = false, keys = [], options = {})
135
117
  @view_paths.exists?(*args_for_lookup(name, prefixes, partial, keys, options))
136
118
  end
@@ -168,14 +150,9 @@ module ActionView
168
150
  # as well as incorrectly putting part of the path in the template
169
151
  # name instead of the prefix.
170
152
  def normalize_name(name, prefixes) #:nodoc:
171
- name = name.to_s.sub(handlers_regexp) do |match|
172
- ActiveSupport::Deprecation.warn "Passing a template handler in the template name is deprecated. " \
173
- "You can simply remove the handler name or pass render :handlers => [:#{match[1..-1]}] instead.", caller
174
- ""
175
- end
176
-
177
- prefixes = nil if prefixes.blank?
178
- parts = name.split('/')
153
+ prefixes = prefixes.presence
154
+ parts = name.to_s.split('/')
155
+ parts.shift if parts.first.empty?
179
156
  name = parts.pop
180
157
 
181
158
  return name, prefixes || [""] if parts.empty?
@@ -185,10 +162,6 @@ module ActionView
185
162
 
186
163
  return name, prefixes
187
164
  end
188
-
189
- def handlers_regexp #:nodoc:
190
- @@handlers_regexp ||= /\.(?:#{default_handlers.join('|')})$/
191
- end
192
165
  end
193
166
 
194
167
  include Accessors
@@ -211,7 +184,10 @@ module ActionView
211
184
  def formats=(values)
212
185
  if values
213
186
  values.concat(default_formats) if values.delete "*/*"
214
- values << :html if values == [:js]
187
+ if values == [:js]
188
+ values << :html
189
+ @html_fallback_for_js = true
190
+ end
215
191
  end
216
192
  super(values)
217
193
  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
@@ -5,6 +5,8 @@ module ActionView #:nodoc:
5
5
 
6
6
  attr_reader :paths
7
7
 
8
+ delegate :[], :include?, :pop, :size, :each, to: :paths
9
+
8
10
  def initialize(paths = [])
9
11
  @paths = typecast paths
10
12
  end
@@ -14,30 +16,10 @@ module ActionView #:nodoc:
14
16
  self
15
17
  end
16
18
 
17
- def [](i)
18
- paths[i]
19
- end
20
-
21
19
  def to_ary
22
20
  paths.dup
23
21
  end
24
22
 
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
23
  def compact
42
24
  PathSet.new paths.compact
43
25
  end
@@ -58,35 +40,23 @@ module ActionView #:nodoc:
58
40
  find_all(*args).first || raise(MissingTemplate.new(self, *args))
59
41
  end
60
42
 
61
- def find_file(path, prefixes = [], *args)
62
- _find_all(path, prefixes, args, true).first || raise(MissingTemplate.new(self, path, prefixes, *args))
63
- end
64
-
65
43
  def find_all(path, prefixes = [], *args)
66
- _find_all path, prefixes, args, false
67
- end
68
-
69
- def exists?(path, prefixes, *args)
70
- find_all(path, prefixes, *args).any?
71
- end
72
-
73
- private
74
-
75
- def _find_all(path, prefixes, args, outside_app)
76
44
  prefixes = [prefixes] if String === prefixes
77
45
  prefixes.each do |prefix|
78
46
  paths.each do |resolver|
79
- if outside_app
80
- templates = resolver.find_all_anywhere(path, prefix, *args)
81
- else
82
- templates = resolver.find_all(path, prefix, *args)
83
- end
47
+ templates = resolver.find_all(path, prefix, *args)
84
48
  return templates unless templates.empty?
85
49
  end
86
50
  end
87
51
  []
88
52
  end
89
53
 
54
+ def exists?(path, prefixes, *args)
55
+ find_all(path, prefixes, *args).any?
56
+ end
57
+
58
+ private
59
+
90
60
  def typecast(paths)
91
61
  paths.map do |path|
92
62
  case path
@@ -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