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,148 +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 StylesheetIncludeTag < AssetIncludeTag
10
- def asset_name
11
- 'stylesheet'
12
- end
13
-
14
- def extension
15
- 'css'
16
- end
17
-
18
- def asset_tag(source, options)
19
- # We force the :request protocol here to avoid a double-download bug in IE7 and IE8
20
- tag("link", { "rel" => "stylesheet", "type" => Mime::CSS, "media" => "screen", "href" => path_to_asset(source, :protocol => :request) }.merge(options))
21
- end
22
-
23
- def custom_dir
24
- config.stylesheets_dir
25
- end
26
- end
27
-
28
-
29
- module StylesheetTagHelpers
30
- extend ActiveSupport::Concern
31
-
32
- module ClassMethods
33
- # Register one or more stylesheet files to be included when <tt>symbol</tt>
34
- # is passed to <tt>stylesheet_link_tag</tt>. This method is typically intended
35
- # to be called from plugin initialization to register stylesheet files
36
- # that the plugin installed in <tt>public/stylesheets</tt>.
37
- #
38
- # ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion :monkey => ["head", "body", "tail"]
39
- #
40
- # stylesheet_link_tag :monkey # =>
41
- # <link href="/stylesheets/head.css" media="screen" rel="stylesheet" type="text/css" />
42
- # <link href="/stylesheets/body.css" media="screen" rel="stylesheet" type="text/css" />
43
- # <link href="/stylesheets/tail.css" media="screen" rel="stylesheet" type="text/css" />
44
- def register_stylesheet_expansion(expansions)
45
- style_expansions = StylesheetIncludeTag.expansions
46
- expansions.each do |key, values|
47
- style_expansions[key] = (style_expansions[key] || []) | Array(values)
48
- end
49
- end
50
- end
51
-
52
- # Computes the path to a stylesheet asset in the public stylesheets directory.
53
- # If the +source+ filename has no extension, <tt>.css</tt> will be appended (except for explicit URIs).
54
- # Full paths from the document root will be passed through.
55
- # Used internally by +stylesheet_link_tag+ to build the stylesheet path.
56
- #
57
- # ==== Examples
58
- # stylesheet_path "style" # => /stylesheets/style.css
59
- # stylesheet_path "dir/style.css" # => /stylesheets/dir/style.css
60
- # stylesheet_path "/dir/style.css" # => /dir/style.css
61
- # stylesheet_path "http://www.example.com/css/style" # => http://www.example.com/css/style
62
- # stylesheet_path "http://www.example.com/css/style.css" # => http://www.example.com/css/style.css
63
- def stylesheet_path(source)
64
- asset_paths.compute_public_path(source, 'stylesheets', :ext => 'css', :protocol => :request)
65
- end
66
- alias_method :path_to_stylesheet, :stylesheet_path # aliased to avoid conflicts with a stylesheet_path named route
67
-
68
- # Returns a stylesheet link tag for the sources specified as arguments. If
69
- # you don't specify an extension, <tt>.css</tt> will be appended automatically.
70
- # You can modify the link attributes by passing a hash as the last argument.
71
- # For historical reasons, the 'media' attribute will always be present and defaults
72
- # to "screen", so you must explicitely set it to "all" for the stylesheet(s) to
73
- # apply to all media types.
74
- #
75
- # ==== Examples
76
- # stylesheet_link_tag "style" # =>
77
- # <link href="/stylesheets/style.css" media="screen" rel="stylesheet" type="text/css" />
78
- #
79
- # stylesheet_link_tag "style.css" # =>
80
- # <link href="/stylesheets/style.css" media="screen" rel="stylesheet" type="text/css" />
81
- #
82
- # stylesheet_link_tag "http://www.example.com/style.css" # =>
83
- # <link href="http://www.example.com/style.css" media="screen" rel="stylesheet" type="text/css" />
84
- #
85
- # stylesheet_link_tag "style", :media => "all" # =>
86
- # <link href="/stylesheets/style.css" media="all" rel="stylesheet" type="text/css" />
87
- #
88
- # stylesheet_link_tag "style", :media => "print" # =>
89
- # <link href="/stylesheets/style.css" media="print" rel="stylesheet" type="text/css" />
90
- #
91
- # stylesheet_link_tag "random.styles", "/css/stylish" # =>
92
- # <link href="/stylesheets/random.styles" media="screen" rel="stylesheet" type="text/css" />
93
- # <link href="/css/stylish.css" media="screen" rel="stylesheet" type="text/css" />
94
- #
95
- # You can also include all styles in the stylesheets directory using <tt>:all</tt> as the source:
96
- #
97
- # stylesheet_link_tag :all # =>
98
- # <link href="/stylesheets/style1.css" media="screen" rel="stylesheet" type="text/css" />
99
- # <link href="/stylesheets/styleB.css" media="screen" rel="stylesheet" type="text/css" />
100
- # <link href="/stylesheets/styleX2.css" media="screen" rel="stylesheet" type="text/css" />
101
- #
102
- # If you want Rails to search in all the subdirectories under stylesheets, you should explicitly set <tt>:recursive</tt>:
103
- #
104
- # stylesheet_link_tag :all, :recursive => true
105
- #
106
- # == Caching multiple stylesheets into one
107
- #
108
- # You can also cache multiple stylesheets into one file, which requires less HTTP connections and can better be
109
- # compressed by gzip (leading to faster transfers). Caching will only happen if config.perform_caching
110
- # is set to true (which is the case by default for the Rails production environment, but not for the development
111
- # environment). Examples:
112
- #
113
- # ==== Examples
114
- # stylesheet_link_tag :all, :cache => true # when config.perform_caching is false =>
115
- # <link href="/stylesheets/style1.css" media="screen" rel="stylesheet" type="text/css" />
116
- # <link href="/stylesheets/styleB.css" media="screen" rel="stylesheet" type="text/css" />
117
- # <link href="/stylesheets/styleX2.css" media="screen" rel="stylesheet" type="text/css" />
118
- #
119
- # stylesheet_link_tag :all, :cache => true # when config.perform_caching is true =>
120
- # <link href="/stylesheets/all.css" media="screen" rel="stylesheet" type="text/css" />
121
- #
122
- # stylesheet_link_tag "shop", "cart", "checkout", :cache => "payment" # when config.perform_caching is false =>
123
- # <link href="/stylesheets/shop.css" media="screen" rel="stylesheet" type="text/css" />
124
- # <link href="/stylesheets/cart.css" media="screen" rel="stylesheet" type="text/css" />
125
- # <link href="/stylesheets/checkout.css" media="screen" rel="stylesheet" type="text/css" />
126
- #
127
- # stylesheet_link_tag "shop", "cart", "checkout", :cache => "payment" # when config.perform_caching is true =>
128
- # <link href="/stylesheets/payment.css" media="screen" rel="stylesheet" type="text/css" />
129
- #
130
- # The <tt>:recursive</tt> option is also available for caching:
131
- #
132
- # stylesheet_link_tag :all, :cache => true, :recursive => true
133
- #
134
- # To force concatenation (even in development mode) set <tt>:concat</tt> to true. This is useful if
135
- # you have too many stylesheets for IE to load.
136
- #
137
- # stylesheet_link_tag :all, :concat => true
138
- #
139
- def stylesheet_link_tag(*sources)
140
- @stylesheet_include ||= StylesheetIncludeTag.new(config, asset_paths)
141
- @stylesheet_include.include_tag(*sources)
142
- end
143
-
144
- end
145
-
146
- end
147
- end
148
- end
@@ -1,99 +0,0 @@
1
- require "fileutils"
2
-
3
- namespace :assets do
4
- def ruby_rake_task(task, fork = true)
5
- env = ENV['RAILS_ENV'] || 'production'
6
- groups = ENV['RAILS_GROUPS'] || 'assets'
7
- args = [$0, task,"RAILS_ENV=#{env}","RAILS_GROUPS=#{groups}"]
8
- args << "--trace" if Rake.application.options.trace
9
- if $0 =~ /rake\.bat\Z/i
10
- Kernel.exec $0, *args
11
- else
12
- fork ? ruby(*args) : Kernel.exec(FileUtils::RUBY, *args)
13
- end
14
- end
15
-
16
- # We are currently running with no explicit bundler group
17
- # and/or no explicit environment - we have to reinvoke rake to
18
- # execute this task.
19
- def invoke_or_reboot_rake_task(task)
20
- if ENV['RAILS_GROUPS'].to_s.empty? || ENV['RAILS_ENV'].to_s.empty?
21
- ruby_rake_task task
22
- else
23
- Rake::Task[task].invoke
24
- end
25
- end
26
-
27
- desc "Compile all the assets named in config.assets.precompile"
28
- task :precompile do
29
- invoke_or_reboot_rake_task "assets:precompile:all"
30
- end
31
-
32
- namespace :precompile do
33
- def internal_precompile(digest=nil)
34
- unless Rails.application.config.assets.enabled
35
- warn "Cannot precompile assets if sprockets is disabled. Please set config.assets.enabled to true"
36
- exit
37
- end
38
-
39
- # Ensure that action view is loaded and the appropriate
40
- # sprockets hooks get executed
41
- _ = ActionView::Base
42
-
43
- config = Rails.application.config
44
- config.assets.compile = true
45
- config.assets.digest = digest unless digest.nil?
46
- config.assets.digests = {}
47
-
48
- env = Rails.application.assets
49
- target = File.join(Rails.public_path, config.assets.prefix)
50
- compiler = Sprockets::StaticCompiler.new(env,
51
- target,
52
- config.assets.precompile,
53
- :manifest_path => config.assets.manifest,
54
- :digest => config.assets.digest,
55
- :manifest => digest.nil?)
56
- compiler.compile
57
- end
58
-
59
- task :all do
60
- Rake::Task["assets:precompile:primary"].invoke
61
- # We need to reinvoke in order to run the secondary digestless
62
- # asset compilation run - a fresh Sprockets environment is
63
- # required in order to compile digestless assets as the
64
- # environment has already cached the assets on the primary
65
- # run.
66
- ruby_rake_task("assets:precompile:nondigest", false) if Rails.application.config.assets.digest
67
- end
68
-
69
- task :primary => ["assets:environment", "tmp:cache:clear"] do
70
- internal_precompile
71
- end
72
-
73
- task :nondigest => ["assets:environment", "tmp:cache:clear"] do
74
- internal_precompile(false)
75
- end
76
- end
77
-
78
- desc "Remove compiled assets"
79
- task :clean do
80
- invoke_or_reboot_rake_task "assets:clean:all"
81
- end
82
-
83
- namespace :clean do
84
- task :all => ["assets:environment", "tmp:cache:clear"] do
85
- config = Rails.application.config
86
- public_asset_path = File.join(Rails.public_path, config.assets.prefix)
87
- rm_rf public_asset_path, :secure => true
88
- end
89
- end
90
-
91
- task :environment do
92
- if Rails.application.config.assets.initialize_on_precompile
93
- Rake::Task["environment"].invoke
94
- else
95
- Rails.application.initialize!(:assets)
96
- Sprockets::Bootstrap.new(Rails.application).run
97
- end
98
- end
99
- end
@@ -1,37 +0,0 @@
1
- module Sprockets
2
- class Bootstrap
3
- def initialize(app)
4
- @app = app
5
- end
6
-
7
- # TODO: Get rid of config.assets.enabled
8
- def run
9
- app, config = @app, @app.config
10
- return unless app.assets
11
-
12
- config.assets.paths.each { |path| app.assets.append_path(path) }
13
-
14
- if config.assets.compress
15
- # temporarily hardcode default JS compressor to uglify. Soon, it will work
16
- # the same as SCSS, where a default plugin sets the default.
17
- unless config.assets.js_compressor == false
18
- app.assets.js_compressor = LazyCompressor.new { Sprockets::Compressors.registered_js_compressor(config.assets.js_compressor || :uglifier) }
19
- end
20
-
21
- unless config.assets.css_compressor == false
22
- app.assets.css_compressor = LazyCompressor.new { Sprockets::Compressors.registered_css_compressor(config.assets.css_compressor) }
23
- end
24
- end
25
-
26
- if config.assets.compile
27
- app.routes.prepend do
28
- mount app.assets => config.assets.prefix
29
- end
30
- end
31
-
32
- if config.assets.digest
33
- app.assets = app.assets.index
34
- end
35
- end
36
- end
37
- end
@@ -1,83 +0,0 @@
1
- module Sprockets
2
- module Compressors
3
- @@css_compressors = {}
4
- @@js_compressors = {}
5
- @@default_css_compressor = nil
6
- @@default_js_compressor = nil
7
-
8
- def self.register_css_compressor(name, klass, options = {})
9
- @@default_css_compressor = name.to_sym if options[:default] || @@default_css_compressor.nil?
10
- @@css_compressors[name.to_sym] = {:klass => klass.to_s, :require => options[:require]}
11
- end
12
-
13
- def self.register_js_compressor(name, klass, options = {})
14
- @@default_js_compressor = name.to_sym if options[:default] || @@default_js_compressor.nil?
15
- @@js_compressors[name.to_sym] = {:klass => klass.to_s, :require => options[:require]}
16
- end
17
-
18
- def self.registered_css_compressor(name)
19
- if name.respond_to?(:to_sym)
20
- compressor = @@css_compressors[name.to_sym] || @@css_compressors[@@default_css_compressor]
21
- require compressor[:require] if compressor[:require]
22
- compressor[:klass].constantize.new
23
- else
24
- name
25
- end
26
- end
27
-
28
- def self.registered_js_compressor(name)
29
- if name.respond_to?(:to_sym)
30
- compressor = @@js_compressors[name.to_sym] || @@js_compressors[@@default_js_compressor]
31
- require compressor[:require] if compressor[:require]
32
- compressor[:klass].constantize.new
33
- else
34
- name
35
- end
36
- end
37
-
38
- # The default compressors must be registered in default plugins (ex. Sass-Rails)
39
- register_css_compressor(:scss, 'Sass::Rails::Compressor', :require => 'sass/rails/compressor', :default => true)
40
- register_js_compressor(:uglifier, 'Uglifier', :require => 'uglifier', :default => true)
41
-
42
- # Automaticaly register some compressors
43
- register_css_compressor(:yui, 'YUI::CssCompressor', :require => 'yui/compressor')
44
- register_js_compressor(:closure, 'Closure::Compiler', :require => 'closure-compiler')
45
- register_js_compressor(:yui, 'YUI::JavaScriptCompressor', :require => 'yui/compressor')
46
- end
47
-
48
- # An asset compressor which does nothing.
49
- #
50
- # This compressor simply returns the asset as-is, without any compression
51
- # whatsoever. It is useful in development mode, when compression isn't
52
- # needed but using the same asset pipeline as production is desired.
53
- class NullCompressor #:nodoc:
54
- def compress(content)
55
- content
56
- end
57
- end
58
-
59
- # An asset compressor which only initializes the underlying compression
60
- # engine when needed.
61
- #
62
- # This postpones the initialization of the compressor until
63
- # <code>#compress</code> is called the first time.
64
- class LazyCompressor #:nodoc:
65
- # Initializes a new LazyCompressor.
66
- #
67
- # The block should return a compressor when called, i.e. an object
68
- # which responds to <code>#compress</code>.
69
- def initialize(&block)
70
- @block = block
71
- end
72
-
73
- def compress(content)
74
- compressor.compress(content)
75
- end
76
-
77
- private
78
-
79
- def compressor
80
- @compressor ||= (@block.call || NullCompressor.new)
81
- end
82
- end
83
- end
@@ -1,13 +0,0 @@
1
- module Sprockets
2
- module Helpers
3
- module IsolatedHelper
4
- def controller
5
- nil
6
- end
7
-
8
- def config
9
- Rails.application.config.action_controller
10
- end
11
- end
12
- end
13
- end
@@ -1,182 +0,0 @@
1
- require "action_view"
2
-
3
- module Sprockets
4
- module Helpers
5
- module RailsHelper
6
- extend ActiveSupport::Concern
7
- include ActionView::Helpers::AssetTagHelper
8
-
9
- def asset_paths
10
- @asset_paths ||= begin
11
- paths = RailsHelper::AssetPaths.new(config, controller)
12
- paths.asset_environment = asset_environment
13
- paths.asset_digests = asset_digests
14
- paths.compile_assets = compile_assets?
15
- paths.digest_assets = digest_assets?
16
- paths
17
- end
18
- end
19
-
20
- def javascript_include_tag(*sources)
21
- options = sources.extract_options!
22
- debug = options.key?(:debug) ? options.delete(:debug) : debug_assets?
23
- body = options.key?(:body) ? options.delete(:body) : false
24
- digest = options.key?(:digest) ? options.delete(:digest) : digest_assets?
25
-
26
- sources.collect do |source|
27
- if debug && asset = asset_paths.asset_for(source, 'js')
28
- asset.to_a.map { |dep|
29
- super(dep.pathname.to_s, { :src => path_to_asset(dep, :ext => 'js', :body => true, :digest => digest) }.merge!(options))
30
- }
31
- else
32
- super(source.to_s, { :src => path_to_asset(source, :ext => 'js', :body => body, :digest => digest) }.merge!(options))
33
- end
34
- end.flatten.uniq.join("\n").html_safe
35
- end
36
-
37
- def stylesheet_link_tag(*sources)
38
- options = sources.extract_options!
39
- debug = options.key?(:debug) ? options.delete(:debug) : debug_assets?
40
- body = options.key?(:body) ? options.delete(:body) : false
41
- digest = options.key?(:digest) ? options.delete(:digest) : digest_assets?
42
-
43
- sources.collect do |source|
44
- if debug && asset = asset_paths.asset_for(source, 'css')
45
- asset.to_a.map { |dep|
46
- super(dep.pathname.to_s, { :href => path_to_asset(dep, :ext => 'css', :body => true, :protocol => :request, :digest => digest) }.merge!(options))
47
- }
48
- else
49
- super(source.to_s, { :href => path_to_asset(source, :ext => 'css', :body => body, :protocol => :request, :digest => digest) }.merge!(options))
50
- end
51
- end.flatten.uniq.join("\n").html_safe
52
- end
53
-
54
- def asset_path(source, options = {})
55
- source = source.logical_path if source.respond_to?(:logical_path)
56
- path = asset_paths.compute_public_path(source, asset_prefix, options.merge(:body => true))
57
- options[:body] ? "#{path}?body=1" : path
58
- end
59
- alias_method :path_to_asset, :asset_path # aliased to avoid conflicts with an asset_path named route
60
-
61
- def image_path(source)
62
- path_to_asset(source)
63
- end
64
- alias_method :path_to_image, :image_path # aliased to avoid conflicts with an image_path named route
65
-
66
- def font_path(source)
67
- path_to_asset(source)
68
- end
69
- alias_method :path_to_font, :font_path # aliased to avoid conflicts with an font_path named route
70
-
71
- def javascript_path(source)
72
- path_to_asset(source, :ext => 'js')
73
- end
74
- alias_method :path_to_javascript, :javascript_path # aliased to avoid conflicts with an javascript_path named route
75
-
76
- def stylesheet_path(source)
77
- path_to_asset(source, :ext => 'css')
78
- end
79
- alias_method :path_to_stylesheet, :stylesheet_path # aliased to avoid conflicts with an stylesheet_path named route
80
-
81
- private
82
- def debug_assets?
83
- compile_assets? && (Rails.application.config.assets.debug || params[:debug_assets])
84
- rescue NameError
85
- false
86
- end
87
-
88
- # Override to specify an alternative prefix for asset path generation.
89
- # When combined with a custom +asset_environment+, this can be used to
90
- # implement themes that can take advantage of the asset pipeline.
91
- #
92
- # If you only want to change where the assets are mounted, refer to
93
- # +config.assets.prefix+ instead.
94
- def asset_prefix
95
- Rails.application.config.assets.prefix
96
- end
97
-
98
- def asset_digests
99
- Rails.application.config.assets.digests
100
- end
101
-
102
- def compile_assets?
103
- Rails.application.config.assets.compile
104
- end
105
-
106
- def digest_assets?
107
- Rails.application.config.assets.digest
108
- end
109
-
110
- # Override to specify an alternative asset environment for asset
111
- # path generation. The environment should already have been mounted
112
- # at the prefix returned by +asset_prefix+.
113
- def asset_environment
114
- Rails.application.assets
115
- end
116
-
117
- class AssetPaths < ::ActionView::AssetPaths #:nodoc:
118
- attr_accessor :asset_environment, :asset_prefix, :asset_digests, :compile_assets, :digest_assets
119
-
120
- class AssetNotPrecompiledError < StandardError; end
121
-
122
- def asset_for(source, ext)
123
- source = source.to_s
124
- return nil if is_uri?(source)
125
- source = rewrite_extension(source, nil, ext)
126
- asset_environment[source]
127
- rescue Sprockets::FileOutsidePaths
128
- nil
129
- end
130
-
131
- def digest_for(logical_path)
132
- if digest_assets && asset_digests && (digest = asset_digests[logical_path])
133
- return digest
134
- end
135
-
136
- if compile_assets
137
- if digest_assets && asset = asset_environment[logical_path]
138
- return asset.digest_path
139
- end
140
- return logical_path
141
- else
142
- raise AssetNotPrecompiledError.new("#{logical_path} isn't precompiled")
143
- end
144
- end
145
-
146
- def rewrite_asset_path(source, dir, options = {})
147
- if source[0] == ?/
148
- source
149
- else
150
- if digest_assets && options[:digest] != false
151
- source = digest_for(source)
152
- end
153
- source = File.join(dir, source)
154
- source = "/#{source}" unless source =~ /^\//
155
- source
156
- end
157
- end
158
-
159
- def rewrite_extension(source, dir, ext)
160
- source_ext = File.extname(source)[1..-1]
161
-
162
- if !ext || ext == source_ext
163
- source
164
- elsif source_ext.blank?
165
- "#{source}.#{ext}"
166
- elsif File.exists?(source) || exact_match_present?(source)
167
- source
168
- else
169
- "#{source}.#{ext}"
170
- end
171
- end
172
-
173
- def exact_match_present?(source)
174
- pathname = asset_environment.resolve(source)
175
- pathname.to_s =~ /#{Regexp.escape(source)}\Z/
176
- rescue Sprockets::FileNotFound
177
- false
178
- end
179
- end
180
- end
181
- end
182
- end
@@ -1,6 +0,0 @@
1
- module Sprockets
2
- module Helpers
3
- autoload :RailsHelper, "sprockets/helpers/rails_helper"
4
- autoload :IsolatedHelper, "sprockets/helpers/isolated_helper"
5
- end
6
- end
@@ -1,62 +0,0 @@
1
- require "action_controller/railtie"
2
-
3
- module Sprockets
4
- autoload :Bootstrap, "sprockets/bootstrap"
5
- autoload :Helpers, "sprockets/helpers"
6
- autoload :Compressors, "sprockets/compressors"
7
- autoload :LazyCompressor, "sprockets/compressors"
8
- autoload :NullCompressor, "sprockets/compressors"
9
- autoload :StaticCompiler, "sprockets/static_compiler"
10
-
11
- # TODO: Get rid of config.assets.enabled
12
- class Railtie < ::Rails::Railtie
13
- rake_tasks do
14
- load "sprockets/assets.rake"
15
- end
16
-
17
- initializer "sprockets.environment", :group => :all do |app|
18
- config = app.config
19
- next unless config.assets.enabled
20
-
21
- require 'sprockets'
22
-
23
- app.assets = Sprockets::Environment.new(app.root.to_s) do |env|
24
- env.version = ::Rails.env + "-#{config.assets.version}"
25
-
26
- if config.assets.logger != false
27
- env.logger = config.assets.logger || ::Rails.logger
28
- end
29
-
30
- if config.assets.cache_store != false
31
- env.cache = ActiveSupport::Cache.lookup_store(config.assets.cache_store) || ::Rails.cache
32
- end
33
- end
34
-
35
- if config.assets.manifest
36
- path = File.join(config.assets.manifest, "manifest.yml")
37
- else
38
- path = File.join(Rails.public_path, config.assets.prefix, "manifest.yml")
39
- end
40
-
41
- if File.exist?(path)
42
- config.assets.digests = YAML.load_file(path)
43
- end
44
-
45
- ActiveSupport.on_load(:action_view) do
46
- include ::Sprockets::Helpers::RailsHelper
47
- app.assets.context_class.instance_eval do
48
- include ::Sprockets::Helpers::IsolatedHelper
49
- include ::Sprockets::Helpers::RailsHelper
50
- end
51
- end
52
- end
53
-
54
- # We need to configure this after initialization to ensure we collect
55
- # paths from all engines. This hook is invoked exactly before routes
56
- # are compiled, and so that other Railties have an opportunity to
57
- # register compressors.
58
- config.after_initialize do |app|
59
- Sprockets::Bootstrap.new(app).run
60
- end
61
- end
62
- end