actionpack 3.2.19 → 4.2.11.3

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 (244) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +412 -503
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +11 -294
  5. data/lib/abstract_controller/asset_paths.rb +2 -2
  6. data/lib/abstract_controller/base.rb +52 -18
  7. data/lib/abstract_controller/callbacks.rb +87 -89
  8. data/lib/abstract_controller/collector.rb +17 -3
  9. data/lib/abstract_controller/helpers.rb +41 -14
  10. data/lib/abstract_controller/logger.rb +1 -2
  11. data/lib/abstract_controller/railties/routes_helpers.rb +3 -3
  12. data/lib/abstract_controller/rendering.rb +65 -118
  13. data/lib/abstract_controller/translation.rb +16 -1
  14. data/lib/abstract_controller/url_for.rb +7 -7
  15. data/lib/abstract_controller.rb +2 -10
  16. data/lib/action_controller/base.rb +61 -28
  17. data/lib/action_controller/caching/fragments.rb +30 -54
  18. data/lib/action_controller/caching.rb +38 -35
  19. data/lib/action_controller/log_subscriber.rb +35 -18
  20. data/lib/action_controller/metal/conditional_get.rb +103 -34
  21. data/lib/action_controller/metal/data_streaming.rb +20 -26
  22. data/lib/action_controller/metal/etag_with_template_digest.rb +50 -0
  23. data/lib/action_controller/metal/exceptions.rb +19 -6
  24. data/lib/action_controller/metal/flash.rb +41 -9
  25. data/lib/action_controller/metal/force_ssl.rb +70 -12
  26. data/lib/action_controller/metal/head.rb +30 -7
  27. data/lib/action_controller/metal/helpers.rb +11 -11
  28. data/lib/action_controller/metal/hide_actions.rb +0 -1
  29. data/lib/action_controller/metal/http_authentication.rb +140 -94
  30. data/lib/action_controller/metal/implicit_render.rb +1 -1
  31. data/lib/action_controller/metal/instrumentation.rb +11 -7
  32. data/lib/action_controller/metal/live.rb +328 -0
  33. data/lib/action_controller/metal/mime_responds.rb +161 -152
  34. data/lib/action_controller/metal/params_wrapper.rb +126 -81
  35. data/lib/action_controller/metal/rack_delegation.rb +10 -4
  36. data/lib/action_controller/metal/redirecting.rb +44 -41
  37. data/lib/action_controller/metal/renderers.rb +48 -19
  38. data/lib/action_controller/metal/rendering.rb +46 -11
  39. data/lib/action_controller/metal/request_forgery_protection.rb +250 -29
  40. data/lib/action_controller/metal/streaming.rb +30 -38
  41. data/lib/action_controller/metal/strong_parameters.rb +669 -0
  42. data/lib/action_controller/metal/testing.rb +12 -18
  43. data/lib/action_controller/metal/url_for.rb +31 -29
  44. data/lib/action_controller/metal.rb +31 -40
  45. data/lib/action_controller/model_naming.rb +12 -0
  46. data/lib/action_controller/railtie.rb +38 -18
  47. data/lib/action_controller/railties/helpers.rb +22 -0
  48. data/lib/action_controller/test_case.rb +359 -173
  49. data/lib/action_controller.rb +9 -16
  50. data/lib/action_dispatch/http/cache.rb +64 -11
  51. data/lib/action_dispatch/http/filter_parameters.rb +20 -10
  52. data/lib/action_dispatch/http/filter_redirect.rb +38 -0
  53. data/lib/action_dispatch/http/headers.rb +85 -17
  54. data/lib/action_dispatch/http/mime_negotiation.rb +55 -5
  55. data/lib/action_dispatch/http/mime_type.rb +167 -114
  56. data/lib/action_dispatch/http/mime_types.rb +2 -1
  57. data/lib/action_dispatch/http/parameter_filter.rb +44 -46
  58. data/lib/action_dispatch/http/parameters.rb +30 -46
  59. data/lib/action_dispatch/http/rack_cache.rb +2 -3
  60. data/lib/action_dispatch/http/request.rb +108 -45
  61. data/lib/action_dispatch/http/response.rb +247 -48
  62. data/lib/action_dispatch/http/upload.rb +60 -29
  63. data/lib/action_dispatch/http/url.rb +135 -45
  64. data/lib/action_dispatch/journey/backwards.rb +5 -0
  65. data/lib/action_dispatch/journey/formatter.rb +166 -0
  66. data/lib/action_dispatch/journey/gtg/builder.rb +162 -0
  67. data/lib/action_dispatch/journey/gtg/simulator.rb +47 -0
  68. data/lib/action_dispatch/journey/gtg/transition_table.rb +157 -0
  69. data/lib/action_dispatch/journey/nfa/builder.rb +76 -0
  70. data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
  71. data/lib/action_dispatch/journey/nfa/simulator.rb +47 -0
  72. data/lib/action_dispatch/journey/nfa/transition_table.rb +163 -0
  73. data/lib/action_dispatch/journey/nodes/node.rb +128 -0
  74. data/lib/action_dispatch/journey/parser.rb +198 -0
  75. data/lib/action_dispatch/journey/parser.y +49 -0
  76. data/lib/action_dispatch/journey/parser_extras.rb +23 -0
  77. data/lib/action_dispatch/journey/path/pattern.rb +193 -0
  78. data/lib/action_dispatch/journey/route.rb +125 -0
  79. data/lib/action_dispatch/journey/router/strexp.rb +27 -0
  80. data/lib/action_dispatch/journey/router/utils.rb +93 -0
  81. data/lib/action_dispatch/journey/router.rb +144 -0
  82. data/lib/action_dispatch/journey/routes.rb +80 -0
  83. data/lib/action_dispatch/journey/scanner.rb +61 -0
  84. data/lib/action_dispatch/journey/visitors.rb +221 -0
  85. data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
  86. data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
  87. data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
  88. data/lib/action_dispatch/journey.rb +5 -0
  89. data/lib/action_dispatch/middleware/callbacks.rb +16 -11
  90. data/lib/action_dispatch/middleware/cookies.rb +346 -125
  91. data/lib/action_dispatch/middleware/debug_exceptions.rb +52 -24
  92. data/lib/action_dispatch/middleware/exception_wrapper.rb +75 -9
  93. data/lib/action_dispatch/middleware/flash.rb +85 -72
  94. data/lib/action_dispatch/middleware/params_parser.rb +16 -31
  95. data/lib/action_dispatch/middleware/public_exceptions.rb +39 -14
  96. data/lib/action_dispatch/middleware/reloader.rb +16 -7
  97. data/lib/action_dispatch/middleware/remote_ip.rb +132 -40
  98. data/lib/action_dispatch/middleware/request_id.rb +3 -7
  99. data/lib/action_dispatch/middleware/session/abstract_store.rb +22 -20
  100. data/lib/action_dispatch/middleware/session/cache_store.rb +3 -3
  101. data/lib/action_dispatch/middleware/session/cookie_store.rb +84 -29
  102. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +8 -3
  103. data/lib/action_dispatch/middleware/show_exceptions.rb +15 -44
  104. data/lib/action_dispatch/middleware/ssl.rb +72 -0
  105. data/lib/action_dispatch/middleware/stack.rb +6 -1
  106. data/lib/action_dispatch/middleware/static.rb +80 -23
  107. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +34 -0
  108. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
  109. data/lib/action_dispatch/middleware/templates/rescues/_source.erb +27 -0
  110. data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
  111. data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
  112. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
  113. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
  114. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +133 -5
  115. data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
  116. data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
  117. data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
  118. data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
  119. data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
  120. data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
  121. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
  122. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
  123. data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
  124. data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
  125. data/lib/action_dispatch/railtie.rb +19 -6
  126. data/lib/action_dispatch/request/session.rb +193 -0
  127. data/lib/action_dispatch/request/utils.rb +35 -0
  128. data/lib/action_dispatch/routing/endpoint.rb +10 -0
  129. data/lib/action_dispatch/routing/inspector.rb +234 -0
  130. data/lib/action_dispatch/routing/mapper.rb +897 -436
  131. data/lib/action_dispatch/routing/polymorphic_routes.rb +213 -92
  132. data/lib/action_dispatch/routing/redirection.rb +97 -37
  133. data/lib/action_dispatch/routing/route_set.rb +432 -239
  134. data/lib/action_dispatch/routing/routes_proxy.rb +7 -4
  135. data/lib/action_dispatch/routing/url_for.rb +63 -34
  136. data/lib/action_dispatch/routing.rb +57 -89
  137. data/lib/action_dispatch/testing/assertions/dom.rb +2 -36
  138. data/lib/action_dispatch/testing/assertions/response.rb +24 -38
  139. data/lib/action_dispatch/testing/assertions/routing.rb +55 -54
  140. data/lib/action_dispatch/testing/assertions/selector.rb +2 -434
  141. data/lib/action_dispatch/testing/assertions/tag.rb +2 -137
  142. data/lib/action_dispatch/testing/assertions.rb +11 -7
  143. data/lib/action_dispatch/testing/integration.rb +88 -72
  144. data/lib/action_dispatch/testing/test_process.rb +9 -6
  145. data/lib/action_dispatch/testing/test_request.rb +13 -9
  146. data/lib/action_dispatch/testing/test_response.rb +1 -5
  147. data/lib/action_dispatch.rb +24 -21
  148. data/lib/action_pack/gem_version.rb +15 -0
  149. data/lib/action_pack/version.rb +5 -7
  150. data/lib/action_pack.rb +1 -1
  151. metadata +181 -292
  152. data/lib/abstract_controller/layouts.rb +0 -423
  153. data/lib/abstract_controller/view_paths.rb +0 -96
  154. data/lib/action_controller/caching/actions.rb +0 -185
  155. data/lib/action_controller/caching/pages.rb +0 -187
  156. data/lib/action_controller/caching/sweeping.rb +0 -97
  157. data/lib/action_controller/deprecated/integration_test.rb +0 -2
  158. data/lib/action_controller/deprecated/performance_test.rb +0 -1
  159. data/lib/action_controller/deprecated.rb +0 -3
  160. data/lib/action_controller/metal/compatibility.rb +0 -65
  161. data/lib/action_controller/metal/responder.rb +0 -286
  162. data/lib/action_controller/metal/session_management.rb +0 -14
  163. data/lib/action_controller/railties/paths.rb +0 -25
  164. data/lib/action_controller/record_identifier.rb +0 -85
  165. data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
  166. data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
  167. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
  168. data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
  169. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
  170. data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
  171. data/lib/action_controller/vendor/html-scanner.rb +0 -20
  172. data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
  173. data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
  174. data/lib/action_dispatch/middleware/head.rb +0 -18
  175. data/lib/action_dispatch/middleware/rescue.rb +0 -26
  176. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
  177. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
  178. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
  179. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
  180. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
  181. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
  182. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
  183. data/lib/action_dispatch/testing/performance_test.rb +0 -10
  184. data/lib/action_view/asset_paths.rb +0 -142
  185. data/lib/action_view/base.rb +0 -220
  186. data/lib/action_view/buffers.rb +0 -43
  187. data/lib/action_view/context.rb +0 -36
  188. data/lib/action_view/flows.rb +0 -79
  189. data/lib/action_view/helpers/active_model_helper.rb +0 -50
  190. data/lib/action_view/helpers/asset_paths.rb +0 -7
  191. data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
  192. data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
  193. data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
  194. data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
  195. data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
  196. data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
  197. data/lib/action_view/helpers/cache_helper.rb +0 -64
  198. data/lib/action_view/helpers/capture_helper.rb +0 -203
  199. data/lib/action_view/helpers/controller_helper.rb +0 -25
  200. data/lib/action_view/helpers/csrf_helper.rb +0 -32
  201. data/lib/action_view/helpers/date_helper.rb +0 -1062
  202. data/lib/action_view/helpers/debug_helper.rb +0 -40
  203. data/lib/action_view/helpers/form_helper.rb +0 -1486
  204. data/lib/action_view/helpers/form_options_helper.rb +0 -658
  205. data/lib/action_view/helpers/form_tag_helper.rb +0 -685
  206. data/lib/action_view/helpers/javascript_helper.rb +0 -110
  207. data/lib/action_view/helpers/number_helper.rb +0 -622
  208. data/lib/action_view/helpers/output_safety_helper.rb +0 -38
  209. data/lib/action_view/helpers/record_tag_helper.rb +0 -111
  210. data/lib/action_view/helpers/rendering_helper.rb +0 -90
  211. data/lib/action_view/helpers/sanitize_helper.rb +0 -259
  212. data/lib/action_view/helpers/tag_helper.rb +0 -160
  213. data/lib/action_view/helpers/text_helper.rb +0 -426
  214. data/lib/action_view/helpers/translation_helper.rb +0 -91
  215. data/lib/action_view/helpers/url_helper.rb +0 -693
  216. data/lib/action_view/helpers.rb +0 -60
  217. data/lib/action_view/locale/en.yml +0 -160
  218. data/lib/action_view/log_subscriber.rb +0 -28
  219. data/lib/action_view/lookup_context.rb +0 -254
  220. data/lib/action_view/path_set.rb +0 -89
  221. data/lib/action_view/railtie.rb +0 -55
  222. data/lib/action_view/renderer/abstract_renderer.rb +0 -41
  223. data/lib/action_view/renderer/partial_renderer.rb +0 -415
  224. data/lib/action_view/renderer/renderer.rb +0 -54
  225. data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
  226. data/lib/action_view/renderer/template_renderer.rb +0 -94
  227. data/lib/action_view/template/error.rb +0 -128
  228. data/lib/action_view/template/handlers/builder.rb +0 -26
  229. data/lib/action_view/template/handlers/erb.rb +0 -125
  230. data/lib/action_view/template/handlers.rb +0 -50
  231. data/lib/action_view/template/resolver.rb +0 -272
  232. data/lib/action_view/template/text.rb +0 -30
  233. data/lib/action_view/template.rb +0 -337
  234. data/lib/action_view/test_case.rb +0 -245
  235. data/lib/action_view/testing/resolvers.rb +0 -50
  236. data/lib/action_view.rb +0 -84
  237. data/lib/sprockets/assets.rake +0 -99
  238. data/lib/sprockets/bootstrap.rb +0 -37
  239. data/lib/sprockets/compressors.rb +0 -83
  240. data/lib/sprockets/helpers/isolated_helper.rb +0 -13
  241. data/lib/sprockets/helpers/rails_helper.rb +0 -182
  242. data/lib/sprockets/helpers.rb +0 -6
  243. data/lib/sprockets/railtie.rb +0 -62
  244. data/lib/sprockets/static_compiler.rb +0 -56
@@ -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
@@ -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,200 +0,0 @@
1
- require 'set'
2
-
3
- module ActionView
4
- # = Action View Atom Feed Helpers
5
- module Helpers #:nodoc:
6
- module AtomFeedHelper
7
- # Adds easy defaults to writing Atom feeds with the Builder template engine (this does not work on ERB or any other
8
- # template languages).
9
- #
10
- # Full usage example:
11
- #
12
- # config/routes.rb:
13
- # Basecamp::Application.routes.draw do
14
- # resources :posts
15
- # root :to => "posts#index"
16
- # end
17
- #
18
- # app/controllers/posts_controller.rb:
19
- # class PostsController < ApplicationController::Base
20
- # # GET /posts.html
21
- # # GET /posts.atom
22
- # def index
23
- # @posts = Post.all
24
- #
25
- # respond_to do |format|
26
- # format.html
27
- # format.atom
28
- # end
29
- # end
30
- # end
31
- #
32
- # app/views/posts/index.atom.builder:
33
- # atom_feed do |feed|
34
- # feed.title("My great blog!")
35
- # feed.updated(@posts[0].created_at) if @posts.length > 0
36
- #
37
- # @posts.each do |post|
38
- # feed.entry(post) do |entry|
39
- # entry.title(post.title)
40
- # entry.content(post.body, :type => 'html')
41
- #
42
- # entry.author do |author|
43
- # author.name("DHH")
44
- # end
45
- # end
46
- # end
47
- # end
48
- #
49
- # The options for atom_feed are:
50
- #
51
- # * <tt>:language</tt>: Defaults to "en-US".
52
- # * <tt>:root_url</tt>: The HTML alternative that this feed is doubling for. Defaults to / on the current host.
53
- # * <tt>:url</tt>: The URL for this feed. Defaults to the current URL.
54
- # * <tt>:id</tt>: The id for this feed. Defaults to "tag:#{request.host},#{options[:schema_date]}:#{request.fullpath.split(".")[0]}"
55
- # * <tt>:schema_date</tt>: The date at which the tag scheme for the feed was first used. A good default is the year you
56
- # created the feed. See http://feedvalidator.org/docs/error/InvalidTAG.html for more information. If not specified,
57
- # 2005 is used (as an "I don't care" value).
58
- # * <tt>:instruct</tt>: Hash of XML processing instructions in the form {target => {attribute => value, }} or {target => [{attribute => value, }, ]}
59
- #
60
- # Other namespaces can be added to the root element:
61
- #
62
- # app/views/posts/index.atom.builder:
63
- # atom_feed({'xmlns:app' => 'http://www.w3.org/2007/app',
64
- # 'xmlns:openSearch' => 'http://a9.com/-/spec/opensearch/1.1/'}) do |feed|
65
- # feed.title("My great blog!")
66
- # feed.updated((@posts.first.created_at))
67
- # feed.tag!(openSearch:totalResults, 10)
68
- #
69
- # @posts.each do |post|
70
- # feed.entry(post) do |entry|
71
- # entry.title(post.title)
72
- # entry.content(post.body, :type => 'html')
73
- # entry.tag!('app:edited', Time.now)
74
- #
75
- # entry.author do |author|
76
- # author.name("DHH")
77
- # end
78
- # end
79
- # end
80
- # end
81
- #
82
- # The Atom spec defines five elements (content rights title subtitle
83
- # summary) which may directly contain xhtml content if :type => 'xhtml'
84
- # is specified as an attribute. If so, this helper will take care of
85
- # the enclosing div and xhtml namespace declaration. Example usage:
86
- #
87
- # entry.summary :type => 'xhtml' do |xhtml|
88
- # xhtml.p pluralize(order.line_items.count, "line item")
89
- # xhtml.p "Shipped to #{order.address}"
90
- # xhtml.p "Paid by #{order.pay_type}"
91
- # end
92
- #
93
- #
94
- # <tt>atom_feed</tt> yields an +AtomFeedBuilder+ instance. Nested elements yield
95
- # an +AtomBuilder+ instance.
96
- def atom_feed(options = {}, &block)
97
- if options[:schema_date]
98
- options[:schema_date] = options[:schema_date].strftime("%Y-%m-%d") if options[:schema_date].respond_to?(:strftime)
99
- else
100
- options[:schema_date] = "2005" # The Atom spec copyright date
101
- end
102
-
103
- xml = options.delete(:xml) || eval("xml", block.binding)
104
- xml.instruct!
105
- if options[:instruct]
106
- options[:instruct].each do |target,attrs|
107
- if attrs.respond_to?(:keys)
108
- xml.instruct!(target, attrs)
109
- elsif attrs.respond_to?(:each)
110
- attrs.each { |attr_group| xml.instruct!(target, attr_group) }
111
- end
112
- end
113
- end
114
-
115
- feed_opts = {"xml:lang" => options[:language] || "en-US", "xmlns" => 'http://www.w3.org/2005/Atom'}
116
- feed_opts.merge!(options).reject!{|k,v| !k.to_s.match(/^xml/)}
117
-
118
- xml.feed(feed_opts) do
119
- xml.id(options[:id] || "tag:#{request.host},#{options[:schema_date]}:#{request.fullpath.split(".")[0]}")
120
- xml.link(:rel => 'alternate', :type => 'text/html', :href => options[:root_url] || (request.protocol + request.host_with_port))
121
- xml.link(:rel => 'self', :type => 'application/atom+xml', :href => options[:url] || request.url)
122
-
123
- yield AtomFeedBuilder.new(xml, self, options)
124
- end
125
- end
126
-
127
- class AtomBuilder
128
- XHTML_TAG_NAMES = %w(content rights title subtitle summary).to_set
129
-
130
- def initialize(xml)
131
- @xml = xml
132
- end
133
-
134
- private
135
- # Delegate to xml builder, first wrapping the element in a xhtml
136
- # namespaced div element if the method and arguments indicate
137
- # that an xhtml_block? is desired.
138
- def method_missing(method, *arguments, &block)
139
- if xhtml_block?(method, arguments)
140
- @xml.__send__(method, *arguments) do
141
- @xml.div(:xmlns => 'http://www.w3.org/1999/xhtml') do |xhtml|
142
- block.call(xhtml)
143
- end
144
- end
145
- else
146
- @xml.__send__(method, *arguments, &block)
147
- end
148
- end
149
-
150
- # True if the method name matches one of the five elements defined
151
- # in the Atom spec as potentially containing XHTML content and
152
- # if :type => 'xhtml' is, in fact, specified.
153
- def xhtml_block?(method, arguments)
154
- if XHTML_TAG_NAMES.include?(method.to_s)
155
- last = arguments.last
156
- last.is_a?(Hash) && last[:type].to_s == 'xhtml'
157
- end
158
- end
159
- end
160
-
161
- class AtomFeedBuilder < AtomBuilder
162
- def initialize(xml, view, feed_options = {})
163
- @xml, @view, @feed_options = xml, view, feed_options
164
- end
165
-
166
- # Accepts a Date or Time object and inserts it in the proper format. If nil is passed, current time in UTC is used.
167
- def updated(date_or_time = nil)
168
- @xml.updated((date_or_time || Time.now.utc).xmlschema)
169
- end
170
-
171
- # Creates an entry tag for a specific record and prefills the id using class and id.
172
- #
173
- # Options:
174
- #
175
- # * <tt>:published</tt>: Time first published. Defaults to the created_at attribute on the record if one such exists.
176
- # * <tt>:updated</tt>: Time of update. Defaults to the updated_at attribute on the record if one such exists.
177
- # * <tt>:url</tt>: The URL for this entry. Defaults to the polymorphic_url for the record.
178
- # * <tt>:id</tt>: The ID for this entry. Defaults to "tag:#{@view.request.host},#{@feed_options[:schema_date]}:#{record.class}/#{record.id}"
179
- def entry(record, options = {})
180
- @xml.entry do
181
- @xml.id(options[:id] || "tag:#{@view.request.host},#{@feed_options[:schema_date]}:#{record.class}/#{record.id}")
182
-
183
- if options[:published] || (record.respond_to?(:created_at) && record.created_at)
184
- @xml.published((options[:published] || record.created_at).xmlschema)
185
- end
186
-
187
- if options[:updated] || (record.respond_to?(:updated_at) && record.updated_at)
188
- @xml.updated((options[:updated] || record.updated_at).xmlschema)
189
- end
190
-
191
- @xml.link(:rel => 'alternate', :type => 'text/html', :href => options[:url] || @view.polymorphic_url(record))
192
-
193
- yield AtomBuilder.new(@xml)
194
- end
195
- end
196
- end
197
-
198
- end
199
- end
200
- end