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
@@ -1,10 +0,0 @@
1
- require 'active_support/testing/performance'
2
-
3
- module ActionDispatch
4
- # An integration test that runs a code profiler on your test methods.
5
- # Profiling output for combinations of each test method, measurement, and
6
- # output format are written to your tmp/performance directory.
7
- class PerformanceTest < ActionDispatch::IntegrationTest
8
- include ActiveSupport::Testing::Performance
9
- end
10
- end
@@ -1,142 +0,0 @@
1
- require 'zlib'
2
- require 'active_support/core_ext/file'
3
- require 'action_controller/metal/exceptions'
4
-
5
- module ActionView
6
- class AssetPaths #:nodoc:
7
- attr_reader :config, :controller
8
-
9
- def initialize(config, controller = nil)
10
- @config = config
11
- @controller = controller
12
- end
13
-
14
- # Add the extension +ext+ if not present. Return full or scheme-relative URLs otherwise untouched.
15
- # Prefix with <tt>/dir/</tt> if lacking a leading +/+. Account for relative URL
16
- # roots. Rewrite the asset path for cache-busting asset ids. Include
17
- # asset host, if configured, with the correct request protocol.
18
- #
19
- # When :relative (default), the protocol will be determined by the client using current protocol
20
- # When :request, the protocol will be the request protocol
21
- # Otherwise, the protocol is used (E.g. :http, :https, etc)
22
- def compute_public_path(source, dir, options = {})
23
- source = source.to_s
24
- return source if is_uri?(source)
25
-
26
- source = rewrite_extension(source, dir, options[:ext]) if options[:ext]
27
- source = rewrite_asset_path(source, dir, options)
28
- source = rewrite_relative_url_root(source, relative_url_root)
29
- source = rewrite_host_and_protocol(source, options[:protocol])
30
- source
31
- end
32
-
33
- # Return the filesystem path for the source
34
- def compute_source_path(source, dir, ext)
35
- source = rewrite_extension(source, dir, ext) if ext
36
-
37
- sources = []
38
- sources << config.assets_dir
39
- sources << dir unless source[0] == ?/
40
- sources << source
41
-
42
- File.join(sources)
43
- end
44
-
45
- def is_uri?(path)
46
- path =~ %r{^[-a-z]+://|^(?:cid|data):|^//}i
47
- end
48
-
49
- private
50
-
51
- def rewrite_extension(source, dir, ext)
52
- raise NotImplementedError
53
- end
54
-
55
- def rewrite_asset_path(source, path = nil)
56
- raise NotImplementedError
57
- end
58
-
59
- def rewrite_relative_url_root(source, relative_url_root)
60
- relative_url_root && !source.starts_with?("#{relative_url_root}/") ? "#{relative_url_root}#{source}" : source
61
- end
62
-
63
- def has_request?
64
- controller.respond_to?(:request)
65
- end
66
-
67
- def rewrite_host_and_protocol(source, protocol = nil)
68
- host = compute_asset_host(source)
69
- if host && !is_uri?(host)
70
- if (protocol || default_protocol) == :request && !has_request?
71
- host = nil
72
- else
73
- host = "#{compute_protocol(protocol)}#{host}"
74
- end
75
- end
76
- host ? "#{host}#{source}" : source
77
- end
78
-
79
- def compute_protocol(protocol)
80
- protocol ||= default_protocol
81
- case protocol
82
- when :relative
83
- "//"
84
- when :request
85
- unless @controller
86
- invalid_asset_host!("The protocol requested was :request. Consider using :relative instead.")
87
- end
88
- @controller.request.protocol
89
- else
90
- "#{protocol}://"
91
- end
92
- end
93
-
94
- def default_protocol
95
- @config.default_asset_host_protocol || (has_request? ? :request : :relative)
96
- end
97
-
98
- def invalid_asset_host!(help_message)
99
- raise ActionController::RoutingError, "This asset host cannot be computed without a request in scope. #{help_message}"
100
- end
101
-
102
- # Pick an asset host for this source. Returns +nil+ if no host is set,
103
- # the host if no wildcard is set, the host interpolated with the
104
- # numbers 0-3 if it contains <tt>%d</tt> (the number is the source hash mod 4),
105
- # or the value returned from invoking call on an object responding to call
106
- # (proc or otherwise).
107
- def compute_asset_host(source)
108
- if host = asset_host_config
109
- if host.respond_to?(:call)
110
- args = [source]
111
- arity = arity_of(host)
112
- if (arity > 1 || arity < -2) && !has_request?
113
- invalid_asset_host!("Remove the second argument to your asset_host Proc if you do not need the request, or make it optional.")
114
- end
115
- args << current_request if (arity > 1 || arity < 0) && has_request?
116
- host.call(*args)
117
- else
118
- (host =~ /%d/) ? host % (Zlib.crc32(source) % 4) : host
119
- end
120
- end
121
- end
122
-
123
- def relative_url_root
124
- config.relative_url_root
125
- end
126
-
127
- def asset_host_config
128
- config.asset_host
129
- end
130
-
131
- # Returns the current request if one exists.
132
- def current_request
133
- controller.request if has_request?
134
- end
135
-
136
- # Returns the arity of a callable
137
- def arity_of(callable)
138
- callable.respond_to?(:arity) ? callable.arity : callable.method(:call).arity
139
- end
140
-
141
- end
142
- end
@@ -1,7 +0,0 @@
1
- ActiveSupport::Deprecation.warn "ActionView::Helpers::AssetPaths is deprecated. Please use ActionView::AssetPaths instead."
2
-
3
- module ActionView
4
- module Helpers
5
- AssetPaths = ::ActionView::AssetPaths
6
- end
7
- end
@@ -1,146 +0,0 @@
1
- require 'active_support/core_ext/class/attribute'
2
- require 'active_support/core_ext/string/inflections'
3
- require 'active_support/core_ext/file'
4
- require 'action_view/helpers/tag_helper'
5
-
6
- module ActionView
7
- module Helpers
8
- module AssetTagHelper
9
-
10
- class AssetIncludeTag
11
- include TagHelper
12
-
13
- attr_reader :config, :asset_paths
14
- class_attribute :expansions
15
-
16
- def self.inherited(base)
17
- base.expansions = { }
18
- end
19
-
20
- def initialize(config, asset_paths)
21
- @config = config
22
- @asset_paths = asset_paths
23
- end
24
-
25
- def asset_name
26
- raise NotImplementedError
27
- end
28
-
29
- def extension
30
- raise NotImplementedError
31
- end
32
-
33
- def custom_dir
34
- raise NotImplementedError
35
- end
36
-
37
- def asset_tag(source, options)
38
- raise NotImplementedError
39
- end
40
-
41
- def include_tag(*sources)
42
- options = sources.extract_options!.stringify_keys
43
- concat = options.delete("concat")
44
- cache = concat || options.delete("cache")
45
- recursive = options.delete("recursive")
46
-
47
- if concat || (config.perform_caching && cache)
48
- joined_name = (cache == true ? "all" : cache) + ".#{extension}"
49
- joined_path = File.join((joined_name[/^#{File::SEPARATOR}/] ? config.assets_dir : custom_dir), joined_name)
50
- unless config.perform_caching && File.exists?(joined_path)
51
- write_asset_file_contents(joined_path, compute_paths(sources, recursive))
52
- end
53
- asset_tag(joined_name, options)
54
- else
55
- sources = expand_sources(sources, recursive)
56
- ensure_sources!(sources) if cache
57
- sources.collect { |source| asset_tag(source, options) }.join("\n").html_safe
58
- end
59
- end
60
-
61
- private
62
-
63
- def path_to_asset(source, options = {})
64
- asset_paths.compute_public_path(source, asset_name.to_s.pluralize, options.merge(:ext => extension))
65
- end
66
-
67
- def path_to_asset_source(source)
68
- asset_paths.compute_source_path(source, asset_name.to_s.pluralize, extension)
69
- end
70
-
71
- def compute_paths(*args)
72
- expand_sources(*args).collect { |source| path_to_asset_source(source) }
73
- end
74
-
75
- def expand_sources(sources, recursive)
76
- if sources.first == :all
77
- collect_asset_files(custom_dir, ('**' if recursive), "*.#{extension}")
78
- else
79
- sources.inject([]) do |list, source|
80
- determined_source = determine_source(source, expansions)
81
- update_source_list(list, determined_source)
82
- end
83
- end
84
- end
85
-
86
- def update_source_list(list, source)
87
- case source
88
- when String
89
- list.delete(source)
90
- list << source
91
- when Array
92
- updated_sources = source - list
93
- list.concat(updated_sources)
94
- end
95
- end
96
-
97
- def ensure_sources!(sources)
98
- sources.each do |source|
99
- asset_file_path!(path_to_asset_source(source))
100
- end
101
- end
102
-
103
- def collect_asset_files(*path)
104
- dir = path.first
105
-
106
- Dir[File.join(*path.compact)].collect do |file|
107
- file[-(file.size - dir.size - 1)..-1].sub(/\.\w+$/, '')
108
- end.sort
109
- end
110
-
111
- def determine_source(source, collection)
112
- case source
113
- when Symbol
114
- collection[source] || raise(ArgumentError, "No expansion found for #{source.inspect}")
115
- else
116
- source
117
- end
118
- end
119
-
120
- def join_asset_file_contents(paths)
121
- paths.collect { |path| File.read(asset_file_path!(path, true)) }.join("\n\n")
122
- end
123
-
124
- def write_asset_file_contents(joined_asset_path, asset_paths)
125
- FileUtils.mkdir_p(File.dirname(joined_asset_path))
126
- File.atomic_write(joined_asset_path) { |cache| cache.write(join_asset_file_contents(asset_paths)) }
127
-
128
- # Set mtime to the latest of the combined files to allow for
129
- # consistent ETag without a shared filesystem.
130
- mt = asset_paths.map { |p| File.mtime(asset_file_path!(p)) }.max
131
- File.utime(mt, mt, joined_asset_path)
132
- end
133
-
134
- def asset_file_path!(absolute_path, error_if_file_is_uri = false)
135
- if asset_paths.is_uri?(absolute_path)
136
- raise(Errno::ENOENT, "Asset file #{path} is uri and cannot be merged into single file") if error_if_file_is_uri
137
- else
138
- raise(Errno::ENOENT, "Asset file not found at '#{absolute_path}'" ) unless File.exist?(absolute_path)
139
- return absolute_path
140
- end
141
- end
142
- end
143
-
144
- end
145
- end
146
- end
@@ -1,93 +0,0 @@
1
- require 'thread'
2
- require 'active_support/core_ext/file'
3
- require 'active_support/core_ext/module/attribute_accessors'
4
-
5
- module ActionView
6
- module Helpers
7
- module AssetTagHelper
8
-
9
- class AssetPaths < ::ActionView::AssetPaths #:nodoc:
10
- # You can enable or disable the asset tag ids cache.
11
- # With the cache enabled, the asset tag helper methods will make fewer
12
- # expensive file system calls (the default implementation checks the file
13
- # system timestamp). However this prevents you from modifying any asset
14
- # files while the server is running.
15
- #
16
- # ActionView::Helpers::AssetTagHelper::AssetPaths.cache_asset_ids = false
17
- mattr_accessor :cache_asset_ids
18
-
19
- # Add or change an asset id in the asset id cache. This can be used
20
- # for SASS on Heroku.
21
- # :api: public
22
- def add_to_asset_ids_cache(source, asset_id)
23
- self.asset_ids_cache_guard.synchronize do
24
- self.asset_ids_cache[source] = asset_id
25
- end
26
- end
27
-
28
- private
29
-
30
- def rewrite_extension(source, dir, ext)
31
- source_ext = File.extname(source)
32
-
33
- source_with_ext = if source_ext.empty?
34
- "#{source}.#{ext}"
35
- elsif ext != source_ext[1..-1]
36
- with_ext = "#{source}.#{ext}"
37
- with_ext if File.exist?(File.join(config.assets_dir, dir, with_ext))
38
- end
39
-
40
- source_with_ext || source
41
- end
42
-
43
- # Break out the asset path rewrite in case plugins wish to put the asset id
44
- # someplace other than the query string.
45
- def rewrite_asset_path(source, dir, options = nil)
46
- source = "/#{dir}/#{source}" unless source[0] == ?/
47
- path = config.asset_path
48
-
49
- if path && path.respond_to?(:call)
50
- return path.call(source)
51
- elsif path && path.is_a?(String)
52
- return path % [source]
53
- end
54
-
55
- asset_id = rails_asset_id(source)
56
- if asset_id.empty?
57
- source
58
- else
59
- "#{source}?#{asset_id}"
60
- end
61
- end
62
-
63
- mattr_accessor :asset_ids_cache
64
- self.asset_ids_cache = {}
65
-
66
- mattr_accessor :asset_ids_cache_guard
67
- self.asset_ids_cache_guard = Mutex.new
68
-
69
- # Use the RAILS_ASSET_ID environment variable or the source's
70
- # modification time as its cache-busting asset id.
71
- def rails_asset_id(source)
72
- if asset_id = ENV["RAILS_ASSET_ID"]
73
- asset_id
74
- else
75
- if self.cache_asset_ids && (asset_id = self.asset_ids_cache[source])
76
- asset_id
77
- else
78
- path = File.join(config.assets_dir, source)
79
- asset_id = File.exist?(path) ? File.mtime(path).to_i.to_s : ''
80
-
81
- if self.cache_asset_ids
82
- add_to_asset_ids_cache(source, asset_id)
83
- end
84
-
85
- asset_id
86
- end
87
- end
88
- end
89
- end
90
-
91
- end
92
- end
93
- end
@@ -1,193 +0,0 @@
1
- require 'active_support/concern'
2
- require 'active_support/core_ext/file'
3
- require 'action_view/helpers/asset_tag_helpers/asset_include_tag'
4
-
5
- module ActionView
6
- module Helpers
7
- module AssetTagHelper
8
-
9
- class JavascriptIncludeTag < AssetIncludeTag
10
- def asset_name
11
- 'javascript'
12
- end
13
-
14
- def extension
15
- 'js'
16
- end
17
-
18
- def asset_tag(source, options)
19
- content_tag("script", "", { "type" => Mime::JS, "src" => path_to_asset(source) }.merge(options))
20
- end
21
-
22
- def custom_dir
23
- config.javascripts_dir
24
- end
25
-
26
- private
27
-
28
- def expand_sources(sources, recursive = false)
29
- if sources.include?(:all)
30
- all_asset_files = (collect_asset_files(custom_dir, ('**' if recursive), "*.#{extension}") - ['application'])
31
- add_application_js(all_asset_files, sources)
32
- ((determine_source(:defaults, expansions).dup & all_asset_files) + all_asset_files).uniq
33
- else
34
- expanded_sources = sources.inject([]) do |list, source|
35
- determined_source = determine_source(source, expansions)
36
- update_source_list(list, determined_source)
37
- end
38
- add_application_js(expanded_sources, sources)
39
- expanded_sources
40
- end
41
- end
42
-
43
- def add_application_js(expanded_sources, sources)
44
- if (sources.include?(:defaults) || sources.include?(:all)) && File.exist?(File.join(custom_dir, "application.#{extension}"))
45
- expanded_sources.delete('application')
46
- expanded_sources << "application"
47
- end
48
- end
49
- end
50
-
51
-
52
- module JavascriptTagHelpers
53
- extend ActiveSupport::Concern
54
-
55
- module ClassMethods
56
- # Register one or more javascript files to be included when <tt>symbol</tt>
57
- # is passed to <tt>javascript_include_tag</tt>. This method is typically intended
58
- # to be called from plugin initialization to register javascript files
59
- # that the plugin installed in <tt>public/javascripts</tt>.
60
- #
61
- # ActionView::Helpers::AssetTagHelper.register_javascript_expansion :monkey => ["head", "body", "tail"]
62
- #
63
- # javascript_include_tag :monkey # =>
64
- # <script type="text/javascript" src="/javascripts/head.js"></script>
65
- # <script type="text/javascript" src="/javascripts/body.js"></script>
66
- # <script type="text/javascript" src="/javascripts/tail.js"></script>
67
- def register_javascript_expansion(expansions)
68
- js_expansions = JavascriptIncludeTag.expansions
69
- expansions.each do |key, values|
70
- js_expansions[key] = (js_expansions[key] || []) | Array(values)
71
- end
72
- end
73
- end
74
-
75
- # Computes the path to a javascript asset in the public javascripts directory.
76
- # If the +source+ filename has no extension, .js will be appended (except for explicit URIs)
77
- # Full paths from the document root will be passed through.
78
- # Used internally by javascript_include_tag to build the script path.
79
- #
80
- # ==== Examples
81
- # javascript_path "xmlhr" # => /javascripts/xmlhr.js
82
- # javascript_path "dir/xmlhr.js" # => /javascripts/dir/xmlhr.js
83
- # javascript_path "/dir/xmlhr" # => /dir/xmlhr.js
84
- # javascript_path "http://www.example.com/js/xmlhr" # => http://www.example.com/js/xmlhr
85
- # javascript_path "http://www.example.com/js/xmlhr.js" # => http://www.example.com/js/xmlhr.js
86
- def javascript_path(source)
87
- asset_paths.compute_public_path(source, 'javascripts', :ext => 'js')
88
- end
89
- alias_method :path_to_javascript, :javascript_path # aliased to avoid conflicts with a javascript_path named route
90
-
91
- # Returns an HTML script tag for each of the +sources+ provided.
92
- #
93
- # Sources may be paths to JavaScript files. Relative paths are assumed to be relative
94
- # to <tt>public/javascripts</tt>, full paths are assumed to be relative to the document
95
- # root. Relative paths are idiomatic, use absolute paths only when needed.
96
- #
97
- # When passing paths, the ".js" extension is optional.
98
- #
99
- # If the application is not using the asset pipeline, to include the default JavaScript
100
- # expansion pass <tt>:defaults</tt> as source. By default, <tt>:defaults</tt> loads jQuery,
101
- # and that can be overridden in <tt>config/application.rb</tt>:
102
- #
103
- # config.action_view.javascript_expansions[:defaults] = %w(foo.js bar.js)
104
- #
105
- # When using <tt>:defaults</tt> or <tt>:all</tt>, if an <tt>application.js</tt> file exists
106
- # in <tt>public/javascripts</tt> it will be included as well at the end.
107
- #
108
- # You can modify the HTML attributes of the script tag by passing a hash as the
109
- # last argument.
110
- #
111
- # ==== Examples
112
- # javascript_include_tag "xmlhr"
113
- # # => <script type="text/javascript" src="/javascripts/xmlhr.js?1284139606"></script>
114
- #
115
- # javascript_include_tag "xmlhr.js"
116
- # # => <script type="text/javascript" src="/javascripts/xmlhr.js?1284139606"></script>
117
- #
118
- # javascript_include_tag "common.javascript", "/elsewhere/cools"
119
- # # => <script type="text/javascript" src="/javascripts/common.javascript?1284139606"></script>
120
- # # <script type="text/javascript" src="/elsewhere/cools.js?1423139606"></script>
121
- #
122
- # javascript_include_tag "http://www.example.com/xmlhr"
123
- # # => <script type="text/javascript" src="http://www.example.com/xmlhr"></script>
124
- #
125
- # javascript_include_tag "http://www.example.com/xmlhr.js"
126
- # # => <script type="text/javascript" src="http://www.example.com/xmlhr.js"></script>
127
- #
128
- # javascript_include_tag :defaults
129
- # # => <script type="text/javascript" src="/javascripts/jquery.js?1284139606"></script>
130
- # # <script type="text/javascript" src="/javascripts/rails.js?1284139606"></script>
131
- # # <script type="text/javascript" src="/javascripts/application.js?1284139606"></script>
132
- #
133
- # Note: The application.js file is only referenced if it exists
134
- #
135
- # You can also include all JavaScripts in the +javascripts+ directory using <tt>:all</tt> as the source:
136
- #
137
- # javascript_include_tag :all
138
- # # => <script type="text/javascript" src="/javascripts/jquery.js?1284139606"></script>
139
- # # <script type="text/javascript" src="/javascripts/rails.js?1284139606"></script>
140
- # # <script type="text/javascript" src="/javascripts/shop.js?1284139606"></script>
141
- # # <script type="text/javascript" src="/javascripts/checkout.js?1284139606"></script>
142
- # # <script type="text/javascript" src="/javascripts/application.js?1284139606"></script>
143
- #
144
- # Note that your defaults of choice will be included first, so they will be available to all subsequently
145
- # included files.
146
- #
147
- # If you want Rails to search in all the subdirectories under <tt>public/javascripts</tt>, you should
148
- # explicitly set <tt>:recursive</tt>:
149
- #
150
- # javascript_include_tag :all, :recursive => true
151
- #
152
- # == Caching multiple JavaScripts into one
153
- #
154
- # You can also cache multiple JavaScripts into one file, which requires less HTTP connections to download
155
- # and can better be compressed by gzip (leading to faster transfers). Caching will only happen if
156
- # <tt>config.perform_caching</tt> is set to true (which is the case by default for the Rails
157
- # production environment, but not for the development environment).
158
- #
159
- # ==== Examples
160
- #
161
- # # assuming config.perform_caching is false
162
- # javascript_include_tag :all, :cache => true
163
- # # => <script type="text/javascript" src="/javascripts/jquery.js?1284139606"></script>
164
- # # <script type="text/javascript" src="/javascripts/rails.js?1284139606"></script>
165
- # # <script type="text/javascript" src="/javascripts/shop.js?1284139606"></script>
166
- # # <script type="text/javascript" src="/javascripts/checkout.js?1284139606"></script>
167
- # # <script type="text/javascript" src="/javascripts/application.js?1284139606"></script>
168
- #
169
- # # assuming config.perform_caching is true
170
- # javascript_include_tag :all, :cache => true
171
- # # => <script type="text/javascript" src="/javascripts/all.js?1344139789"></script>
172
- #
173
- # # assuming config.perform_caching is false
174
- # javascript_include_tag "jquery", "cart", "checkout", :cache => "shop"
175
- # # => <script type="text/javascript" src="/javascripts/jquery.js?1284139606"></script>
176
- # # <script type="text/javascript" src="/javascripts/cart.js?1289139157"></script>
177
- # # <script type="text/javascript" src="/javascripts/checkout.js?1299139816"></script>
178
- #
179
- # # assuming config.perform_caching is true
180
- # javascript_include_tag "jquery", "cart", "checkout", :cache => "shop"
181
- # # => <script type="text/javascript" src="/javascripts/shop.js?1299139816"></script>
182
- #
183
- # The <tt>:recursive</tt> option is also available for caching:
184
- #
185
- # javascript_include_tag :all, :cache => true, :recursive => true
186
- def javascript_include_tag(*sources)
187
- @javascript_include ||= JavascriptIncludeTag.new(config, asset_paths)
188
- @javascript_include.include_tag(*sources)
189
- end
190
- end
191
- end
192
- end
193
- end