assets_booster 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,10 @@
1
+ require 'assets_booster/mixin/css'
1
2
  require 'assets_booster/merger/base'
2
3
  module AssetsBooster
3
4
  module Merger
4
5
  class CSS < Base
6
+ include AssetsBooster::Mixin::Css
7
+
5
8
  def name
6
9
  "CSS Merger"
7
10
  end
@@ -10,7 +13,7 @@ module AssetsBooster
10
13
  target_folder = dirname(target)
11
14
  code = assets.inject("") do |code, asset|
12
15
  source_folder = dirname(asset[:source])
13
- asset[:css]= rewrite_urls(asset[:css], source_folder, target_folder)
16
+ asset[:css]= adjust_relative_urls(asset[:css], source_folder, target_folder)
14
17
  code << asset[:css]
15
18
  code << "\n"
16
19
  end.strip
@@ -43,7 +46,7 @@ module AssetsBooster
43
46
  url, quotes = unquote(url.strip)
44
47
 
45
48
  # we don't want to statically import external stylesheets
46
- next import if absolute_url?(url)
49
+ next import if external_url?(url)
47
50
 
48
51
  # recursively process the imported css
49
52
  load_source(source_folder+url)
@@ -51,40 +54,10 @@ module AssetsBooster
51
54
  end
52
55
  assets << asset
53
56
  end
54
-
55
- def rewrite_urls(css, source_folder, target_folder)
56
- url_prepend = path_difference(source_folder, target_folder)
57
- return css if url_prepend == ""
58
57
 
59
- css.gsub(/url\(([^)]+)\)/i) do |match|
60
- url, quotes = unquote($1.strip)
61
-
62
- # we don't want to change references to external assets
63
- next match if absolute_url?(url)
64
-
65
- "url(#{quotes}#{url_prepend}/#{url}#{quotes})"
66
- end
67
- end
68
-
69
- def unquote(quoted)
70
- (quoted[0].chr =~ /["']/) ? [quoted.slice(1, quoted.length-2), quoted[0].chr] : [quoted, ""]
71
- end
72
-
73
- def absolute_url?(url)
74
- !!(url =~ /^(\/|https?:\/\/)/i)
75
- end
76
-
77
58
  def dirname(path)
78
59
  path.include?("/") ? File.dirname(path) : ""
79
60
  end
80
-
81
- def path_difference(source, target)
82
- return source if target == ""
83
- if source[0..target.length-1] != target
84
- raise ArgumentError, "source and target to not share a common base path [#{source}, #{target}]"
85
- end
86
- source[target.length+1..-1] || ""
87
- end
88
61
  end
89
62
  end
90
63
  end
@@ -0,0 +1,38 @@
1
+ require 'assets_booster/mixin/url'
2
+ module AssetsBooster
3
+ module Mixin
4
+ module Css
5
+ include Url
6
+
7
+ def unquote(quoted)
8
+ (quoted[0].chr =~ /["']/) ? [quoted.slice(1, quoted.length-2), quoted[0].chr] : [quoted, ""]
9
+ end
10
+
11
+ def adjust_relative_urls(css, source_folder, target_folder)
12
+ url_prepend = path_difference(source_folder, target_folder)
13
+ return css if url_prepend == ""
14
+
15
+ css.gsub(/url\(([^)]+)\)/i) do |match|
16
+ url, quotes = unquote($1.strip)
17
+
18
+ # we don't want to change references to absolute & external assets
19
+ next match if absolute_url?(url) || external_url?(url)
20
+
21
+ "url(#{quotes}#{url_prepend}/#{url}#{quotes})"
22
+ end
23
+ end
24
+
25
+ def hostify_urls(base_url, css)
26
+ css.gsub(/url\(([^)]+)\)/i) do |match|
27
+ url, quotes = unquote($1.strip)
28
+
29
+ # we don't want to change references to external assets
30
+ next match if external_url?(url)
31
+
32
+ url = url[1..-1] if url[0] == "/"
33
+ "url(#{quotes}#{base_url}/#{url}#{quotes})"
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,21 @@
1
+ module AssetsBooster
2
+ module Mixin
3
+ module Url
4
+ def absolute_url?(url)
5
+ !!(url =~ %r{^/}i)
6
+ end
7
+
8
+ def external_url?(url)
9
+ !!(url =~ %r{^https?://}i)
10
+ end
11
+
12
+ def path_difference(source, target)
13
+ return source if target == ""
14
+ if source[0..target.length-1] != target
15
+ raise ArgumentError, "source and target to not share a common base path [#{source}, #{target}]"
16
+ end
17
+ source[target.length+1..-1] || ""
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,6 +1,9 @@
1
+ require 'assets_booster/mixin/css'
1
2
  module AssetsBooster
2
3
  module Package
3
4
  class Stylesheet < Base
5
+ include AssetsBooster::Mixin::Css
6
+
4
7
  def merger_class
5
8
  require "assets_booster/merger/css"
6
9
  AssetsBooster::Merger::CSS
@@ -11,9 +14,21 @@ module AssetsBooster
11
14
  path = File.join(path, name+".css") if name
12
15
  end
13
16
 
17
+ def default_asset_host
18
+ Rails.configuration.action_controller.asset_host
19
+ end
20
+
14
21
  def view_helper(view, options)
15
22
  if options[:inline]
16
- view.style_tag(read, options.except(:inline))
23
+ code = read
24
+ inline = options[:inline]
25
+ if inline.is_a?(Hash)
26
+ if inline[:hostify_urls]
27
+ base_url = (inline[:hostify_urls] == true) ? default_asset_host : inline[:hostify_urls]
28
+ code = hostify_urls(base_url, code)
29
+ end
30
+ end
31
+ view.style_tag(code, options.except(:inline))
17
32
  else
18
33
  view.stylesheet_link_tag(view_helper_sources, options)
19
34
  end
@@ -1,3 +1,3 @@
1
1
  module AssetsBooster
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
@@ -71,88 +71,6 @@ module AssetsBooster
71
71
  lambda{ subject.merge("target.css") }.should raise_error(ArgumentError)
72
72
  end
73
73
  end
74
-
75
- describe "absolute_url?" do
76
- it "should detect absolute urls" do
77
- [
78
- ["http://www.example.com", true],
79
- ["HTTP://www.example.com", true],
80
- ["https://www.example.com", true],
81
- ["/absolute.css", true],
82
- ["relative.css", false],
83
- ["another/relative.css", false],
84
- ].each do |url, result|
85
- subject.absolute_url?(url).should == result
86
- end
87
- end
88
- end
89
-
90
- describe "path_difference" do
91
- it "should return the difference" do
92
- [
93
- ["", "", ""],
94
- ["test", "", "test"],
95
- ["test", "test", ""],
96
- ["home/test", "", "home/test"],
97
- ["home/test", "home", "test"],
98
- ["/home/test", "/home", "test"],
99
- ].each do |source, target, result|
100
- subject.path_difference(source, target).should == result
101
- end
102
- end
103
- it "should raise if source and target dont share a common base path" do
104
- lambda{ subject.path_difference("/home/gucki/test", "/home/peter") }.should raise_error(ArgumentError)
105
- end
106
- end
107
-
108
- describe "rewrite_urls" do
109
- it "should rewrite url properties" do
110
- subject.rewrite_urls("{color:#f00}", "/home/test", "/home/test").should == "{color:#f00}"
111
- subject.rewrite_urls("{color:#f00; background:url(test.png)}", "nested", "").should == "{color:#f00; background:url(nested/test.png)}"
112
- source_folder = "/home/test/nested"
113
- target_folder = "/home/test"
114
- [
115
- [
116
- "{color:#f00}",
117
- "{color:#f00}",
118
- ],
119
- [
120
- "{color:#f00; background:url(test.png)}",
121
- "{color:#f00; background:url(nested/test.png)}",
122
- ],
123
- [
124
- "{color:#f00; background:url(\"test.png\")}",
125
- "{color:#f00; background:url(\"nested/test.png\")}",
126
- ],
127
- [
128
- "{color:#f00; background:url('test.png')}",
129
- "{color:#f00; background:url('nested/test.png')}",
130
- ],
131
- [
132
- "{color:#f00; background:url('test file.png')}",
133
- "{color:#f00; background:url('nested/test file.png')}",
134
- ],
135
- [
136
- "{color:#f00; background:url(../test.png)}",
137
- "{color:#f00; background:url(nested/../test.png)}",
138
- ],
139
- ].each do |input, output|
140
- subject.rewrite_urls(input, source_folder, target_folder).should == output
141
- end
142
- end
143
- end
144
-
145
- describe "unquote" do
146
- it "should return unquoted string and quotes" do
147
- [
148
- ["'test.png'", ["test.png", "'"]],
149
- ['"test.png"', ["test.png", '"']],
150
- ["test.png", ["test.png", ""]],
151
- ].each do |input, output|
152
- subject.unquote(input).should == output
153
- end
154
- end
155
- end
156
74
 
157
75
  describe "dirname" do
158
76
  it "should return the folder of the given path" do
@@ -0,0 +1,81 @@
1
+ require 'assets_booster/mixin/css'
2
+ module AssetsBooster
3
+ module Mixin
4
+ describe Css do
5
+ subject do
6
+ dummy = Class.new
7
+ dummy.extend(described_class)
8
+ end
9
+
10
+ describe "adjust_relative_urls" do
11
+ it "should adjust relative urls according to path changes of containing css file" do
12
+ subject.adjust_relative_urls("{color:#f00}", "/home/test", "/home/test").should == "{color:#f00}"
13
+ subject.adjust_relative_urls("{color:#f00; background:url(test.png)}", "nested", "").should == "{color:#f00; background:url(nested/test.png)}"
14
+ source_folder = "/home/test/nested"
15
+ target_folder = "/home/test"
16
+ [
17
+ [
18
+ "{color:#f00}",
19
+ "{color:#f00}",
20
+ ],
21
+ [
22
+ "{color:#f00; background:url(test.png)}",
23
+ "{color:#f00; background:url(nested/test.png)}",
24
+ ],
25
+ [
26
+ "{color:#f00; background:url(\"test.png\")}",
27
+ "{color:#f00; background:url(\"nested/test.png\")}",
28
+ ],
29
+ [
30
+ "{color:#f00; background:url('test.png')}",
31
+ "{color:#f00; background:url('nested/test.png')}",
32
+ ],
33
+ [
34
+ "{color:#f00; background:url('test file.png')}",
35
+ "{color:#f00; background:url('nested/test file.png')}",
36
+ ],
37
+ [
38
+ "{color:#f00; background:url(../test.png)}",
39
+ "{color:#f00; background:url(nested/../test.png)}",
40
+ ],
41
+ ].each do |input, output|
42
+ subject.adjust_relative_urls(input, source_folder, target_folder).should == output
43
+ end
44
+ end
45
+
46
+ it "should not change absolute urls" do
47
+ subject.adjust_relative_urls("{color:#f00; background:url(/test.png)}", "nested", "").should == "{color:#f00; background:url(/test.png)}"
48
+ end
49
+
50
+ it "should not change external urls" do
51
+ subject.adjust_relative_urls("{color:#f00; background:url(http://external.com/test.png)}", "nested", "").should == "{color:#f00; background:url(http://external.com/test.png)}"
52
+ end
53
+ end
54
+
55
+ describe "hostify_urls" do
56
+ it "should transform relative urls into absolute urls using the given base url" do
57
+ subject.hostify_urls("http://webcache.eu", "{color:#f00; background:url(test.png)}").should == "{color:#f00; background:url(http://webcache.eu/test.png)}"
58
+ subject.hostify_urls("http://webcache.eu", "{color:#f00; background:url(/test.png)}").should == "{color:#f00; background:url(http://webcache.eu/test.png)}"
59
+ subject.hostify_urls("http://webcache.eu", "{color:#f00; background:url(nested/test.png)}").should == "{color:#f00; background:url(http://webcache.eu/nested/test.png)}"
60
+ end
61
+
62
+ it "should not change externals urls" do
63
+ subject.hostify_urls("http://webcache.eu", "{color:#f00; background:url(http://external.com/test.png)}").should == "{color:#f00; background:url(http://external.com/test.png)}"
64
+ end
65
+ end
66
+
67
+ describe "unquote" do
68
+ it "should return unquoted string and quotes" do
69
+ [
70
+ ["'test.png'", ["test.png", "'"]],
71
+ ['"test.png"', ["test.png", '"']],
72
+ ["test.png", ["test.png", ""]],
73
+ ].each do |input, output|
74
+ subject.unquote(input).should == output
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+
@@ -0,0 +1,60 @@
1
+ require 'assets_booster/mixin/url'
2
+ module AssetsBooster
3
+ module Mixin
4
+ describe Url do
5
+ subject do
6
+ dummy = Class.new
7
+ dummy.extend(described_class)
8
+ end
9
+
10
+ describe "absolute_url?" do
11
+ it "should only detect absolute urls" do
12
+ [
13
+ ["http://www.example.com", false],
14
+ ["HTTP://www.example.com", false],
15
+ ["https://www.example.com", false],
16
+ ["/absolute.css", true],
17
+ ["relative.css", false],
18
+ ["another/relative.css", false],
19
+ ].each do |url, result|
20
+ subject.absolute_url?(url).should == result
21
+ end
22
+ end
23
+ end
24
+
25
+ describe "external_url?" do
26
+ it "should only detect absolute urls" do
27
+ [
28
+ ["http://www.example.com", true],
29
+ ["HTTP://www.example.com", true],
30
+ ["https://www.example.com", true],
31
+ ["/absolute.css", false],
32
+ ["relative.css", false],
33
+ ["another/relative.css", false],
34
+ ].each do |url, result|
35
+ subject.external_url?(url).should == result
36
+ end
37
+ end
38
+ end
39
+
40
+ describe "path_difference" do
41
+ it "should return the difference" do
42
+ [
43
+ ["", "", ""],
44
+ ["test", "", "test"],
45
+ ["test", "test", ""],
46
+ ["home/test", "", "home/test"],
47
+ ["home/test", "home", "test"],
48
+ ["/home/test", "/home", "test"],
49
+ ].each do |source, target, result|
50
+ subject.path_difference(source, target).should == result
51
+ end
52
+ end
53
+ it "should raise if source and target dont share a common base path" do
54
+ lambda{ subject.path_difference("/home/gucki/test", "/home/peter") }.should raise_error(ArgumentError)
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+
@@ -10,6 +10,13 @@ module AssetsBooster
10
10
  end
11
11
  end
12
12
 
13
+ describe "default_asset_host" do
14
+ it "should return Rails.configuratrion.action_controller.asset_host" do
15
+ Rails.stub_chain(:configuration, :action_controller, :asset_host).and_return(:test)
16
+ subject.default_asset_host.should == :test
17
+ end
18
+ end
19
+
13
20
  describe "view_helper" do
14
21
  before do
15
22
  @view = double("View")
@@ -31,6 +38,31 @@ module AssetsBooster
31
38
  @view.should_receive(:style_tag).with("css code", @options.except(:inline))
32
39
  subject.view_helper(@view, @options)
33
40
  end
41
+
42
+ describe "and the hositfy_urls option set to true" do
43
+ before do
44
+ @options[:inline] = {:hostify_urls => true}
45
+ end
46
+
47
+ it "should return a style tag with inline css whose urls have been hostified with the default asset host" do
48
+ subject.should_receive(:default_asset_host).and_return("http://webcache.eu")
49
+ subject.should_receive(:read).and_return("<style>body{background-image:url(test.png)}</style>")
50
+ @view.should_receive(:style_tag).with("<style>body{background-image:url(http://webcache.eu/test.png)}</style>", @options.except(:inline))
51
+ subject.view_helper(@view, @options)
52
+ end
53
+ end
54
+
55
+ describe "and the hositfy_urls option set to a string" do
56
+ before do
57
+ @options[:inline] = {:hostify_urls => "http://myhost.eu"}
58
+ end
59
+
60
+ it "should return a style tag with inline css whose urls have been hostified with the specified host" do
61
+ subject.should_receive(:read).and_return("<style>body{background-image:url(test.png)}</style>")
62
+ @view.should_receive(:style_tag).with("<style>body{background-image:url(http://myhost.eu/test.png)}</style>", @options.except(:inline))
63
+ subject.view_helper(@view, @options)
64
+ end
65
+ end
34
66
  end
35
67
 
36
68
  describe "with no special options" do
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: assets_booster
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.10
5
+ version: 0.0.11
6
6
  platform: ruby
7
7
  authors:
8
8
  - Corin Langosch
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-04-13 00:00:00 Z
13
+ date: 2011-04-14 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
@@ -98,6 +98,8 @@ files:
98
98
  - lib/assets_booster/merger/base.rb
99
99
  - lib/assets_booster/merger/css.rb
100
100
  - lib/assets_booster/merger/simple.rb
101
+ - lib/assets_booster/mixin/css.rb
102
+ - lib/assets_booster/mixin/url.rb
101
103
  - lib/assets_booster/package/base.rb
102
104
  - lib/assets_booster/package/javascript.rb
103
105
  - lib/assets_booster/package/stylesheet.rb
@@ -117,6 +119,8 @@ files:
117
119
  - spec/merger/base.rb
118
120
  - spec/merger/css_spec.rb
119
121
  - spec/merger/simple_spec.rb
122
+ - spec/mixin/css_spec.rb
123
+ - spec/mixin/url_spec.rb
120
124
  - spec/package/base.rb
121
125
  - spec/package/javascript_spec.rb
122
126
  - spec/package/stylesheet_spec.rb