Skip to content
This repository was archived by the owner on Oct 26, 2018. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
29b4c32
fix CSS host regex
rsanders Nov 8, 2010
ad4dbb4
only perform cloudfront-style rewriting on assets that have not been …
rsanders Nov 8, 2010
08f711f
include base .specification file for braid's sake
rsanders Nov 8, 2010
8f1c259
update tests to match new extension methods
rsanders Nov 9, 2010
5cca223
test for runaway URL regex bugfix
rsanders Nov 9, 2010
b84456b
only use cloudfront tag helper extensions if currently enabled; don't…
rsanders Nov 9, 2010
d34c8ae
bring in rails as a dependency for the helper tests (there's probably…
rsanders Nov 9, 2010
fa9d6f4
make it easier to run a test with "ruby <filename>" from anywhere in …
rsanders Nov 9, 2010
9bac459
test for asset tag helper behavior for excluded paths
rsanders Nov 9, 2010
ff1d938
rake upload task
rsanders Nov 9, 2010
2fd6699
remove spurious .specification file
rsanders Nov 9, 2010
8be467b
add some speculative font mime types (widespread disagreement on this)
rsanders Nov 9, 2010
ee27d8b
Merge branch 'release/v1.1.0_mime'
rsanders Nov 9, 2010
3808e69
add bugs file
rsanders Nov 17, 2010
0f5b89b
ignore :cache=>true all.{js,css} files
rsanders Nov 18, 2010
2450fe2
if stylesheet or javascript include/link tags have recursive or cache…
rsanders Nov 18, 2010
ad583c1
fix bug in tests related to timestamp/asset_id caching
rsanders Nov 18, 2010
824c6de
Removed expiry header as requested by PT 27722733
May 9, 2012
7720964
Merge pull request #2 from zeevex/feature/remove_expiry_header
robertzx May 9, 2012
b3991b1
Use ERB to process paperclip.yml.
sudish Jul 5, 2012
b074994
Merge pull request #3 from zeevex/feature/use-erb-when-reading-configs
sudishzx Jul 6, 2012
9f61e59
Bumped version to z1.1.0.4
sudish Jul 6, 2012
adf1fb7
Merge branch 'release/z1.1.0.4'
sudish Jul 6, 2012
8bc8ebd
Merge branch 'release/z1.1.0.4' into develop
sudish Jul 6, 2012
ea3af99
fix case mismatch with right_aws
robertzx Aug 10, 2012
ed41905
Merge branch 'master' into develop
robertzx Aug 10, 2012
9713e70
rails3 fixes
robertzx Jul 2, 2013
36ac123
bump version
robertzx Jul 2, 2013
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions BUGS-zeevex.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
In Zeevex forked version.

**** Stylesheet link tag :cache does not work - 2010-11-17

if a construct like this is used:

<%= stylesheet_link_tag "foo", "bar", :cache => true %>

Rails will likely throw an error like this:

Errno::ENOENT: No such file or directory - /zeevex/sites/testengine/releases/20101117175544/public/testing/805270d93/stylesheets/web_app_theme.css 1 minute ago
test/purchases#index

Backtrace:

[GEM_ROOT]/gems/actionpack-2.3.10/lib/action_view/helpers/asset_tag_helper.rb:668:in `read'

[GEM_ROOT]/gems/actionpack-2.3.10/lib/action_view/helpers/asset_tag_helper.rb:668:in `join_asset_file_contents'

[GEM_ROOT]/gems/actionpack-2.3.10/lib/action_view/helpers/asset_tag_helper.rb:668:in `collect'

[GEM_ROOT]/gems/actionpack-2.3.10/lib/action_view/helpers/asset_tag_helper.rb:668:in `join_asset_file_contents'

[GEM_ROOT]/gems/actionpack-2.3.10/lib/action_view/helpers/asset_tag_helper.rb:673:in `write_asset_file_contents'

[GEM_ROOT]/gems/actionpack-2.3.10/lib/action_view/helpers/asset_tag_helper.rb:673:in `open'

[GEM_ROOT]/gems/actionpack-2.3.10/lib/action_view/helpers/asset_tag_helper.rb:673:in `write_asset_file_contents'

[GEM_ROOT]/gems/actionpack-2.3.10/lib/action_view/helpers/asset_tag_helper.rb:433:in `stylesheet_link_tag'


22 changes: 17 additions & 5 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,35 @@ PATH
GEM
remote: http://rubygems.org/
specs:
actionmailer (2.3.9)
actionpack (= 2.3.9)
actionpack (2.3.9)
activesupport (= 2.3.9)
rack (~> 1.1.0)
activerecord (2.3.9)
activesupport (= 2.3.9)
activeresource (2.3.9)
activesupport (= 2.3.9)
activesupport (2.3.9)
ansi (1.2.2)
facets (2.8.4)
mocha (0.9.8)
mocha (0.9.9)
rake
rack (1.1.0)
rails (2.3.9)
actionmailer (= 2.3.9)
actionpack (= 2.3.9)
activerecord (= 2.3.9)
activeresource (= 2.3.9)
activesupport (= 2.3.9)
rake (>= 0.8.3)
rake (0.8.7)
redgreen (1.2.2)
right_aws (2.0.0)
right_http_connection (>= 1.2.1)
right_http_connection (1.2.4)
shoulda (2.11.3)
turn (0.7.0)
ansi (>= 1.1.0)
facets (>= 2.8.0)
turn (0.8.1)
ansi (>= 1.2.2)

PLATFORMS
ruby
Expand All @@ -34,6 +45,7 @@ DEPENDENCIES
activesupport (= 2.3.9)
cloudfront_asset_host!
mocha
rails (= 2.3.9)
redgreen
right_aws
shoulda
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.1.0
z1.1.0.5
8 changes: 6 additions & 2 deletions cloudfront_asset_host.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

Gem::Specification.new do |s|
s.name = %q{cloudfront_asset_host}
s.version = "1.1.0"
s.version = "1.1.1.0"

s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.authors = ["Menno van der Sman"]
Expand Down Expand Up @@ -37,7 +37,8 @@ Gem::Specification.new do |s|
"test/cloudfront_asset_host_test.rb",
"test/css_rewriter_test.rb",
"test/test_helper.rb",
"test/uploader_test.rb"
"test/uploader_test.rb",
"test/taghelper_ext_test.rb",
]
s.homepage = %q{http://github.com/menno/cloudfront_asset_host}
s.rdoc_options = ["--charset=UTF-8"]
Expand All @@ -57,6 +58,7 @@ Gem::Specification.new do |s|

if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<right_aws>, [">= 0"])
s.add_development_dependency(%q<rails>, ["= 2.3.9"])
s.add_development_dependency(%q<activesupport>, ["= 2.3.9"])
s.add_development_dependency(%q<actionpack>, ["= 2.3.9"])
s.add_development_dependency(%q<shoulda>, [">= 0"])
Expand All @@ -65,6 +67,7 @@ Gem::Specification.new do |s|
s.add_development_dependency(%q<turn>, [">= 0"])
else
s.add_dependency(%q<right_aws>, [">= 0"])
s.add_dependency(%q<rails>, ["= 2.3.9"])
s.add_dependency(%q<activesupport>, ["= 2.3.9"])
s.add_dependency(%q<actionpack>, ["= 2.3.9"])
s.add_dependency(%q<shoulda>, [">= 0"])
Expand All @@ -74,6 +77,7 @@ Gem::Specification.new do |s|
end
else
s.add_dependency(%q<right_aws>, [">= 0"])
s.add_dependency(%q<rails>, ["= 2.3.9"])
s.add_dependency(%q<activesupport>, ["= 2.3.9"])
s.add_dependency(%q<actionpack>, ["= 2.3.9"])
s.add_dependency(%q<shoulda>, [">= 0"])
Expand Down
9 changes: 6 additions & 3 deletions lib/cloudfront_asset_host.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def configure
self.bucket = nil
self.cname = nil
self.key_prefix = ""
self.s3_config = "#{RAILS_ROOT}/config/s3.yml"
self.s3_config = "#{Rails.root}/config/s3.yml"
self.s3_logging = false
self.enabled = false

Expand Down Expand Up @@ -113,10 +113,13 @@ def bucket_host
end

def enable!
if enabled
ActionController::Base.asset_host = Proc.new { |source, request| CloudfrontAssetHost.asset_host(source, request) }
if enabled && !ActionView::Helpers::AssetTagHelper.private_method_defined?(:rewrite_asset_path_without_cloudfront)
ActionView::Helpers::AssetTagHelper.send(:alias_method_chain, :rewrite_asset_path, :cloudfront)
ActionView::Helpers::AssetTagHelper.send(:alias_method_chain, :rails_asset_id, :cloudfront)
ActionView::Helpers::AssetTagHelper.send(:alias_method_chain, :compute_asset_host, :cloudfront)
ActionView::Helpers::AssetTagHelper.send(:alias_method_chain, :compute_public_path, :cloudfront)
ActionView::Helpers::AssetTagHelper.send(:alias_method_chain, :stylesheet_link_tag, :cloudfront)
ActionView::Helpers::AssetTagHelper.send(:alias_method_chain, :javascript_include_tag, :cloudfront)
end
end

Expand Down
90 changes: 79 additions & 11 deletions lib/cloudfront_asset_host/asset_tag_helper_ext.rb
Original file line number Diff line number Diff line change
@@ -1,15 +1,61 @@
module ActionView
module Helpers
module AssetTagHelper
module Helpers
module AssetTagHelper


def javascript_include_tag_with_cloudfront(*sources)
if sources.last.is_a?(::Hash) && (sources.last[:cache] || sources.last[:recursive])
without_cloudfront do
javascript_include_tag_without_cloudfront(*sources)
end
else
javascript_include_tag_without_cloudfront(*sources)
end
end

def stylesheet_link_tag_with_cloudfront(*sources)
if sources.last.is_a?(::Hash) && (sources.last[:cache] || sources.last[:recursive])
without_cloudfront do
stylesheet_link_tag_without_cloudfront(*sources)
end
else
stylesheet_link_tag_without_cloudfront(*sources)
end
end

private

def compute_asset_host_with_cloudfront(source)
if !CloudfrontAssetHost.enabled || CloudfrontAssetHost.disable_cdn_for_source?(source)
compute_asset_host_without_cloudfront(source)
else
request = controller.respond_to?(:request) && controller.request
CloudfrontAssetHost.asset_host(source, request)
end
end

def rewrite_host_and_protocol_with_cloudfront(source, has_request)
if !CloudfrontAssetHost.enabled || CloudfrontAssetHost.disable_cdn_for_source?(source)
rewrite_host_and_protocol_without_cloudfront(source, has_request)
else
host = CloudfrontAssetHost.asset_host(source, has_request)
if has_request && host.present? && !is_uri?(host)
host = "#{controller.request.protocol}#{host}"
end
"#{host}#{source}"
end
end

# Override asset_id so it calculates the key by md5 instead of modified-time
def rails_asset_id_with_cloudfront(source)
def rails_asset_id_with_cloudfront(source, *rails3args)
if !CloudfrontAssetHost.enabled || CloudfrontAssetHost.disable_cdn_for_source?(source)
return rails_asset_id_without_cloudfront(source, *rails3args)
end

if @@cache_asset_timestamps && (asset_id = @@asset_timestamps_cache[source])
asset_id
else
path = File.join(ASSETS_DIR, source)
path = File.join(Rails.configuration.assets_dir, source)
rewrite_path = File.exist?(path) && !CloudfrontAssetHost.disable_cdn_for_source?(source)
asset_id = rewrite_path ? CloudfrontAssetHost.key_for_path(path) : ''

Expand All @@ -24,15 +70,37 @@ def rails_asset_id_with_cloudfront(source)
end

# Override asset_path so it prepends the asset_id
def rewrite_asset_path_with_cloudfront(source)
asset_id = rails_asset_id(source)
if asset_id.blank?
source
def rewrite_asset_path_with_cloudfront(source, *rails3args)
if !CloudfrontAssetHost.enabled || CloudfrontAssetHost.disable_cdn_for_source?(source)
rewrite_asset_path_without_cloudfront(source, *rails3args)
else
"/#{asset_id}#{source}"
asset_id = rails_asset_id_with_cloudfront(source, *rails3args)
if asset_id.blank?
source
else
"/#{asset_id}#{source}"
end
end
end

def compute_public_path_with_cloudfront(source, dir, ext = nil, include_host = true)
if source =~ %r{^([-a-z]+:)?//}
return source
else
compute_public_path_without_cloudfront(source, dir, ext, include_host)
end
end

def without_cloudfront
begin
old = CloudfrontAssetHost.enabled
CloudfrontAssetHost.enabled = false
yield
ensure
CloudfrontAssetHost.enabled = old
end
end

end
end
end
end
end
2 changes: 1 addition & 1 deletion lib/cloudfront_asset_host/css_rewriter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ module CssRewriter

class << self
# matches optional quoted url(<path>)
ReplaceRexeg = /url\(["']?([^\)\?"']+)(\?[^"']*)?["']?\)/i
ReplaceRexeg = /url\(["']?([^\)\?"']+)(\?[^"'\)]*)?["']?\)/i

# Returns the path to the temporary file that contains the
# rewritten stylesheet
Expand Down
9 changes: 9 additions & 0 deletions lib/cloudfront_asset_host/mime_types.yml
Original file line number Diff line number Diff line change
Expand Up @@ -149,3 +149,12 @@
- php
- config
- txt
"application/vnd.ms-fontobject":
- eot
"font/woff":
- woff
"font/truetype":
- ttf
"font/opentype":
- otf

9 changes: 4 additions & 5 deletions lib/cloudfront_asset_host/uploader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -108,11 +108,10 @@ def current_paths
def headers_for_path(extension, gzip = false)
mime = ext_to_mime[extension] || 'application/octet-stream'
headers = {
'Content-Type' => mime,
'Cache-Control' => "max-age=#{10.years.to_i}",
'Expires' => 1.year.from_now.utc.to_s
'content-type' => mime,
'cache-control' => "max-age=#{10.years.to_i}",
}
headers['Content-Encoding'] = 'gzip' if gzip
headers['content-encoding'] = 'gzip' if gzip

headers
end
Expand All @@ -135,7 +134,7 @@ def s3

def config
@config ||= begin
config = YAML::load_file(CloudfrontAssetHost.s3_config)
config = YAML::load(ERB.new(IO.read(CloudfrontAssetHost.s3_config)).result)
config.has_key?(Rails.env) ? config[Rails.env] : config
end
end
Expand Down
14 changes: 14 additions & 0 deletions lib/tasks/cloudfront_asset_host.rake
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
namespace :cloudfront do
desc <<-DESC
Upload assets to Cloudfront CDN.

Set VERBOSE=true for detailed output
FORCE=true to force upload of unchanged assets
DRYRUN=true to simulate an upload'
DESC
task :upload => :environment do
CloudfrontAssetHost::Uploader.upload!(:verbose => ENV["VERBOSE"] == "true",
:dryrun => ENV["DRYRUN"] == "true",
:force_write => ENV["FORCE"] == "true")
end
end
1 change: 1 addition & 0 deletions test/app/public/javascripts/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
all.js
1 change: 1 addition & 0 deletions test/app/public/stylesheets/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
all.css
13 changes: 7 additions & 6 deletions test/app/public/stylesheets/style.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 8 additions & 3 deletions test/cloudfront_asset_host_test.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
require 'test_helper'
require File.join(File.dirname(__FILE__), 'test_helper')

class CloudfrontAssetHostTest < Test::Unit::TestCase

Expand All @@ -15,6 +15,9 @@ class CloudfrontAssetHostTest < Test::Unit::TestCase
should "add methods to asset-tag-helper" do
assert ActionView::Helpers::AssetTagHelper.private_method_defined?('rails_asset_id_with_cloudfront')
assert ActionView::Helpers::AssetTagHelper.private_method_defined?('rewrite_asset_path_with_cloudfront')
assert ActionView::Helpers::AssetTagHelper.private_method_defined?('compute_asset_host_with_cloudfront')
assert ActionView::Helpers::AssetTagHelper.public_method_defined?('stylesheet_link_tag_with_cloudfront')
assert ActionView::Helpers::AssetTagHelper.public_method_defined?('javascript_include_tag_with_cloudfront')
end

should "not enable itself by default" do
Expand Down Expand Up @@ -108,15 +111,17 @@ class CloudfrontAssetHostTest < Test::Unit::TestCase
end
end

should "set the asset_host" do
assert ActionController::Base.asset_host.is_a?(Proc)
should "not set the asset_host" do
assert !ActionController::Base.asset_host.is_a?(Proc)
end

should "alias methods in asset-tag-helper" do
assert ActionView::Helpers::AssetTagHelper.private_method_defined?('rails_asset_id_without_cloudfront')
assert ActionView::Helpers::AssetTagHelper.private_method_defined?('rewrite_asset_path_without_cloudfront')
assert ActionView::Helpers::AssetTagHelper.private_method_defined?('compute_asset_host_without_cloudfront')
assert ActionView::Helpers::AssetTagHelper.private_method_defined?('rails_asset_id')
assert ActionView::Helpers::AssetTagHelper.private_method_defined?('rewrite_asset_path')
assert ActionView::Helpers::AssetTagHelper.private_method_defined?('compute_asset_host')
end
end

Expand Down
5 changes: 2 additions & 3 deletions test/css_rewriter_test.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
require 'test_helper'
require File.join(File.dirname(__FILE__), 'test_helper')

class CssRewriterTest < Test::Unit::TestCase

Expand All @@ -19,10 +19,9 @@ class CssRewriterTest < Test::Unit::TestCase
tmp = CloudfrontAssetHost::CssRewriter.rewrite_stylesheet(@stylesheet_path)
contents = File.read(tmp.path)
contents.split("\n").each do |line|
assert_equal "body { background-image: url(http://assethost.com/d41d8cd98/images/image.png); }", line
assert_match Regexp.new('body \{ background: url\(http://assethost.com/d41d8cd98/images/image.png\) repeat-x;.*\}$'), line
end
end

end

end
Loading