actionpack 3.2.22.5 → 5.2.4
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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +279 -603
- data/MIT-LICENSE +1 -1
- data/README.rdoc +13 -297
- data/lib/abstract_controller/asset_paths.rb +4 -2
- data/lib/abstract_controller/base.rb +82 -52
- data/lib/abstract_controller/caching/fragments.rb +166 -0
- data/lib/abstract_controller/caching.rb +66 -0
- data/lib/abstract_controller/callbacks.rb +117 -103
- data/lib/abstract_controller/collector.rb +18 -7
- data/lib/abstract_controller/error.rb +6 -0
- data/lib/abstract_controller/helpers.rb +65 -38
- data/lib/abstract_controller/logger.rb +3 -2
- data/lib/abstract_controller/railties/routes_helpers.rb +5 -3
- data/lib/abstract_controller/rendering.rb +77 -129
- data/lib/abstract_controller/translation.rb +21 -3
- data/lib/abstract_controller/url_for.rb +9 -7
- data/lib/abstract_controller.rb +12 -13
- data/lib/action_controller/api/api_rendering.rb +16 -0
- data/lib/action_controller/api.rb +149 -0
- data/lib/action_controller/base.rb +81 -40
- data/lib/action_controller/caching.rb +22 -62
- data/lib/action_controller/form_builder.rb +50 -0
- data/lib/action_controller/log_subscriber.rb +30 -18
- data/lib/action_controller/metal/basic_implicit_render.rb +13 -0
- data/lib/action_controller/metal/conditional_get.rb +190 -47
- data/lib/action_controller/metal/content_security_policy.rb +52 -0
- data/lib/action_controller/metal/cookies.rb +3 -3
- data/lib/action_controller/metal/data_streaming.rb +40 -65
- data/lib/action_controller/metal/etag_with_flash.rb +18 -0
- data/lib/action_controller/metal/etag_with_template_digest.rb +57 -0
- data/lib/action_controller/metal/exceptions.rb +19 -12
- data/lib/action_controller/metal/flash.rb +42 -9
- data/lib/action_controller/metal/force_ssl.rb +79 -19
- data/lib/action_controller/metal/head.rb +35 -10
- data/lib/action_controller/metal/helpers.rb +31 -21
- data/lib/action_controller/metal/http_authentication.rb +182 -134
- data/lib/action_controller/metal/implicit_render.rb +62 -8
- data/lib/action_controller/metal/instrumentation.rb +28 -26
- data/lib/action_controller/metal/live.rb +312 -0
- data/lib/action_controller/metal/mime_responds.rb +159 -163
- data/lib/action_controller/metal/parameter_encoding.rb +51 -0
- data/lib/action_controller/metal/params_wrapper.rb +146 -93
- data/lib/action_controller/metal/redirecting.rb +80 -56
- data/lib/action_controller/metal/renderers.rb +119 -47
- data/lib/action_controller/metal/rendering.rb +89 -32
- data/lib/action_controller/metal/request_forgery_protection.rb +373 -41
- data/lib/action_controller/metal/rescue.rb +9 -16
- data/lib/action_controller/metal/streaming.rb +39 -45
- data/lib/action_controller/metal/strong_parameters.rb +1086 -0
- data/lib/action_controller/metal/testing.rb +8 -29
- data/lib/action_controller/metal/url_for.rb +43 -32
- data/lib/action_controller/metal.rb +112 -106
- data/lib/action_controller/railtie.rb +56 -18
- data/lib/action_controller/railties/helpers.rb +24 -0
- data/lib/action_controller/renderer.rb +117 -0
- data/lib/action_controller/template_assertions.rb +11 -0
- data/lib/action_controller/test_case.rb +402 -347
- data/lib/action_controller.rb +31 -30
- data/lib/action_dispatch/http/cache.rb +133 -34
- data/lib/action_dispatch/http/content_security_policy.rb +272 -0
- data/lib/action_dispatch/http/filter_parameters.rb +40 -24
- data/lib/action_dispatch/http/filter_redirect.rb +37 -0
- data/lib/action_dispatch/http/headers.rb +117 -16
- data/lib/action_dispatch/http/mime_negotiation.rb +98 -33
- data/lib/action_dispatch/http/mime_type.rb +198 -146
- data/lib/action_dispatch/http/mime_types.rb +22 -7
- data/lib/action_dispatch/http/parameter_filter.rb +61 -49
- data/lib/action_dispatch/http/parameters.rb +94 -51
- data/lib/action_dispatch/http/rack_cache.rb +4 -3
- data/lib/action_dispatch/http/request.rb +262 -117
- data/lib/action_dispatch/http/response.rb +400 -86
- data/lib/action_dispatch/http/upload.rb +66 -29
- data/lib/action_dispatch/http/url.rb +232 -60
- data/lib/action_dispatch/journey/formatter.rb +189 -0
- data/lib/action_dispatch/journey/gtg/builder.rb +164 -0
- data/lib/action_dispatch/journey/gtg/simulator.rb +41 -0
- data/lib/action_dispatch/journey/gtg/transition_table.rb +158 -0
- data/lib/action_dispatch/journey/nfa/builder.rb +78 -0
- data/lib/action_dispatch/journey/nfa/dot.rb +36 -0
- data/lib/action_dispatch/journey/nfa/simulator.rb +49 -0
- data/lib/action_dispatch/journey/nfa/transition_table.rb +120 -0
- data/lib/action_dispatch/journey/nodes/node.rb +140 -0
- data/lib/action_dispatch/journey/parser.rb +199 -0
- data/lib/action_dispatch/journey/parser.y +50 -0
- data/lib/action_dispatch/journey/parser_extras.rb +31 -0
- data/lib/action_dispatch/journey/path/pattern.rb +199 -0
- data/lib/action_dispatch/journey/route.rb +203 -0
- data/lib/action_dispatch/journey/router/utils.rb +102 -0
- data/lib/action_dispatch/journey/router.rb +156 -0
- data/lib/action_dispatch/journey/routes.rb +82 -0
- data/lib/action_dispatch/journey/scanner.rb +64 -0
- data/lib/action_dispatch/journey/visitors.rb +268 -0
- data/lib/action_dispatch/journey/visualizer/fsm.css +30 -0
- data/lib/action_dispatch/journey/visualizer/fsm.js +134 -0
- data/lib/action_dispatch/journey/visualizer/index.html.erb +52 -0
- data/lib/action_dispatch/journey.rb +7 -0
- data/lib/action_dispatch/middleware/callbacks.rb +17 -13
- data/lib/action_dispatch/middleware/cookies.rb +494 -162
- data/lib/action_dispatch/middleware/debug_exceptions.rb +176 -53
- data/lib/action_dispatch/middleware/debug_locks.rb +124 -0
- data/lib/action_dispatch/middleware/exception_wrapper.rb +103 -38
- data/lib/action_dispatch/middleware/executor.rb +21 -0
- data/lib/action_dispatch/middleware/flash.rb +128 -91
- data/lib/action_dispatch/middleware/public_exceptions.rb +43 -16
- data/lib/action_dispatch/middleware/reloader.rb +6 -83
- data/lib/action_dispatch/middleware/remote_ip.rb +151 -49
- data/lib/action_dispatch/middleware/request_id.rb +19 -15
- data/lib/action_dispatch/middleware/session/abstract_store.rb +38 -34
- data/lib/action_dispatch/middleware/session/cache_store.rb +14 -9
- data/lib/action_dispatch/middleware/session/cookie_store.rb +94 -44
- data/lib/action_dispatch/middleware/session/mem_cache_store.rb +15 -4
- data/lib/action_dispatch/middleware/show_exceptions.rb +36 -61
- data/lib/action_dispatch/middleware/ssl.rb +150 -0
- data/lib/action_dispatch/middleware/stack.rb +33 -41
- data/lib/action_dispatch/middleware/static.rb +92 -48
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb +22 -0
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb +23 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.html.erb +27 -0
- data/lib/action_dispatch/middleware/templates/rescues/_source.text.erb +8 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb +52 -0
- data/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb +9 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.html.erb +21 -0
- data/lib/action_dispatch/middleware/templates/rescues/invalid_statement.text.erb +13 -0
- data/lib/action_dispatch/middleware/templates/rescues/layout.erb +134 -5
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.html.erb +32 -0
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.text.erb +11 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb +20 -0
- data/lib/action_dispatch/middleware/templates/rescues/template_error.text.erb +7 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.html.erb +6 -0
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.text.erb +3 -0
- data/lib/action_dispatch/middleware/templates/routes/_route.html.erb +16 -0
- data/lib/action_dispatch/middleware/templates/routes/_table.html.erb +200 -0
- data/lib/action_dispatch/railtie.rb +29 -8
- data/lib/action_dispatch/request/session.rb +234 -0
- data/lib/action_dispatch/request/utils.rb +78 -0
- data/lib/action_dispatch/routing/endpoint.rb +17 -0
- data/lib/action_dispatch/routing/inspector.rb +225 -0
- data/lib/action_dispatch/routing/mapper.rb +1329 -582
- data/lib/action_dispatch/routing/polymorphic_routes.rb +237 -94
- data/lib/action_dispatch/routing/redirection.rb +120 -50
- data/lib/action_dispatch/routing/route_set.rb +545 -322
- data/lib/action_dispatch/routing/routes_proxy.rb +37 -7
- data/lib/action_dispatch/routing/url_for.rb +103 -34
- data/lib/action_dispatch/routing.rb +66 -99
- data/lib/action_dispatch/system_test_case.rb +147 -0
- data/lib/action_dispatch/system_testing/browser.rb +49 -0
- data/lib/action_dispatch/system_testing/driver.rb +59 -0
- data/lib/action_dispatch/system_testing/server.rb +31 -0
- data/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb +96 -0
- data/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb +31 -0
- data/lib/action_dispatch/system_testing/test_helpers/undef_methods.rb +26 -0
- data/lib/action_dispatch/testing/assertion_response.rb +47 -0
- data/lib/action_dispatch/testing/assertions/response.rb +53 -42
- data/lib/action_dispatch/testing/assertions/routing.rb +79 -74
- data/lib/action_dispatch/testing/assertions.rb +15 -9
- data/lib/action_dispatch/testing/integration.rb +361 -207
- data/lib/action_dispatch/testing/request_encoder.rb +55 -0
- data/lib/action_dispatch/testing/test_process.rb +28 -19
- data/lib/action_dispatch/testing/test_request.rb +30 -33
- data/lib/action_dispatch/testing/test_response.rb +35 -11
- data/lib/action_dispatch.rb +42 -32
- data/lib/action_pack/gem_version.rb +17 -0
- data/lib/action_pack/version.rb +7 -7
- data/lib/action_pack.rb +4 -2
- metadata +116 -175
- data/lib/abstract_controller/layouts.rb +0 -423
- data/lib/abstract_controller/view_paths.rb +0 -96
- data/lib/action_controller/caching/actions.rb +0 -185
- data/lib/action_controller/caching/fragments.rb +0 -127
- data/lib/action_controller/caching/pages.rb +0 -187
- data/lib/action_controller/caching/sweeping.rb +0 -97
- data/lib/action_controller/deprecated/integration_test.rb +0 -2
- data/lib/action_controller/deprecated/performance_test.rb +0 -1
- data/lib/action_controller/deprecated.rb +0 -3
- data/lib/action_controller/metal/compatibility.rb +0 -65
- data/lib/action_controller/metal/hide_actions.rb +0 -41
- data/lib/action_controller/metal/rack_delegation.rb +0 -26
- data/lib/action_controller/metal/responder.rb +0 -286
- data/lib/action_controller/metal/session_management.rb +0 -14
- data/lib/action_controller/middleware.rb +0 -39
- data/lib/action_controller/railties/paths.rb +0 -25
- data/lib/action_controller/record_identifier.rb +0 -85
- data/lib/action_controller/vendor/html-scanner/html/document.rb +0 -68
- data/lib/action_controller/vendor/html-scanner/html/node.rb +0 -532
- data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +0 -177
- data/lib/action_controller/vendor/html-scanner/html/selector.rb +0 -830
- data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +0 -107
- data/lib/action_controller/vendor/html-scanner/html/version.rb +0 -11
- data/lib/action_controller/vendor/html-scanner.rb +0 -20
- data/lib/action_dispatch/middleware/best_standards_support.rb +0 -30
- data/lib/action_dispatch/middleware/body_proxy.rb +0 -30
- data/lib/action_dispatch/middleware/head.rb +0 -18
- data/lib/action_dispatch/middleware/params_parser.rb +0 -75
- data/lib/action_dispatch/middleware/rescue.rb +0 -26
- data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +0 -31
- data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +0 -26
- data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +0 -10
- data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +0 -2
- data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +0 -15
- data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +0 -17
- data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +0 -2
- data/lib/action_dispatch/testing/assertions/dom.rb +0 -37
- data/lib/action_dispatch/testing/assertions/selector.rb +0 -435
- data/lib/action_dispatch/testing/assertions/tag.rb +0 -138
- data/lib/action_dispatch/testing/performance_test.rb +0 -10
- data/lib/action_view/asset_paths.rb +0 -142
- data/lib/action_view/base.rb +0 -220
- data/lib/action_view/buffers.rb +0 -43
- data/lib/action_view/context.rb +0 -36
- data/lib/action_view/flows.rb +0 -79
- data/lib/action_view/helpers/active_model_helper.rb +0 -50
- data/lib/action_view/helpers/asset_paths.rb +0 -7
- data/lib/action_view/helpers/asset_tag_helper.rb +0 -457
- data/lib/action_view/helpers/asset_tag_helpers/asset_include_tag.rb +0 -146
- data/lib/action_view/helpers/asset_tag_helpers/asset_paths.rb +0 -93
- data/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb +0 -193
- data/lib/action_view/helpers/asset_tag_helpers/stylesheet_tag_helpers.rb +0 -148
- data/lib/action_view/helpers/atom_feed_helper.rb +0 -200
- data/lib/action_view/helpers/cache_helper.rb +0 -64
- data/lib/action_view/helpers/capture_helper.rb +0 -203
- data/lib/action_view/helpers/controller_helper.rb +0 -25
- data/lib/action_view/helpers/csrf_helper.rb +0 -32
- data/lib/action_view/helpers/date_helper.rb +0 -1062
- data/lib/action_view/helpers/debug_helper.rb +0 -40
- data/lib/action_view/helpers/form_helper.rb +0 -1486
- data/lib/action_view/helpers/form_options_helper.rb +0 -658
- data/lib/action_view/helpers/form_tag_helper.rb +0 -685
- data/lib/action_view/helpers/javascript_helper.rb +0 -110
- data/lib/action_view/helpers/number_helper.rb +0 -622
- data/lib/action_view/helpers/output_safety_helper.rb +0 -38
- data/lib/action_view/helpers/record_tag_helper.rb +0 -111
- data/lib/action_view/helpers/rendering_helper.rb +0 -92
- data/lib/action_view/helpers/sanitize_helper.rb +0 -259
- data/lib/action_view/helpers/tag_helper.rb +0 -167
- data/lib/action_view/helpers/text_helper.rb +0 -426
- data/lib/action_view/helpers/translation_helper.rb +0 -91
- data/lib/action_view/helpers/url_helper.rb +0 -693
- data/lib/action_view/helpers.rb +0 -60
- data/lib/action_view/locale/en.yml +0 -160
- data/lib/action_view/log_subscriber.rb +0 -28
- data/lib/action_view/lookup_context.rb +0 -258
- data/lib/action_view/path_set.rb +0 -101
- data/lib/action_view/railtie.rb +0 -55
- data/lib/action_view/renderer/abstract_renderer.rb +0 -41
- data/lib/action_view/renderer/partial_renderer.rb +0 -415
- data/lib/action_view/renderer/renderer.rb +0 -61
- data/lib/action_view/renderer/streaming_template_renderer.rb +0 -106
- data/lib/action_view/renderer/template_renderer.rb +0 -95
- data/lib/action_view/template/error.rb +0 -128
- data/lib/action_view/template/handlers/builder.rb +0 -26
- data/lib/action_view/template/handlers/erb.rb +0 -125
- data/lib/action_view/template/handlers.rb +0 -50
- data/lib/action_view/template/resolver.rb +0 -298
- data/lib/action_view/template/text.rb +0 -30
- data/lib/action_view/template.rb +0 -337
- data/lib/action_view/test_case.rb +0 -246
- data/lib/action_view/testing/resolvers.rb +0 -49
- data/lib/action_view.rb +0 -84
- data/lib/sprockets/assets.rake +0 -99
- data/lib/sprockets/bootstrap.rb +0 -37
- data/lib/sprockets/compressors.rb +0 -83
- data/lib/sprockets/helpers/isolated_helper.rb +0 -13
- data/lib/sprockets/helpers/rails_helper.rb +0 -182
- data/lib/sprockets/helpers.rb +0 -6
- data/lib/sprockets/railtie.rb +0 -62
- 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
|