assets_booster 0.0.1 → 0.0.2
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.
- data/.rspec +2 -0
- data/Rakefile +4 -0
- data/asset_booster.gemspec +6 -1
- data/lib/assets_booster/compiler/closure.rb +8 -6
- data/lib/assets_booster/compiler/dummy.rb +2 -5
- data/lib/assets_booster/compiler/jsmin.rb +138 -148
- data/lib/assets_booster/compiler/rainpress.rb +3 -3
- data/lib/assets_booster/compiler/uglify.rb +6 -4
- data/lib/assets_booster/merger/base.rb +26 -0
- data/lib/assets_booster/merger/css.rb +38 -43
- data/lib/assets_booster/merger/simple.rb +7 -11
- data/lib/assets_booster/package/base.rb +24 -14
- data/lib/assets_booster/package/javascript.rb +3 -7
- data/lib/assets_booster/package/stylesheet.rb +3 -7
- data/lib/assets_booster/packager.rb +102 -11
- data/lib/assets_booster/railtie.rb +5 -3
- data/lib/assets_booster/tasks/tasks.rake +9 -11
- data/lib/assets_booster/version.rb +1 -1
- data/lib/assets_booster/view_helper.rb +3 -6
- data/spec/compiler/base.rb +15 -0
- data/spec/compiler/closure_spec.rb +16 -0
- data/spec/compiler/dummy_spec.rb +16 -0
- data/spec/compiler/jsmin_spec.rb +16 -0
- data/spec/compiler/rainpress_spec.rb +16 -0
- data/spec/compiler/uglify_spec.rb +16 -0
- data/spec/merger/base.rb +31 -0
- data/spec/merger/css_spec.rb +138 -0
- data/spec/merger/simple_spec.rb +18 -0
- data/spec/package/base.rb +26 -0
- data/spec/package/javascript_spec.rb +16 -0
- data/spec/package/stylesheet_spec.rb +16 -0
- data/spec/packager_spec.rb +87 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/view_helper_spec.rb +12 -0
- metadata +69 -7
- data/lib/assets_booster/configuration.rb +0 -104
@@ -1,29 +1,27 @@
|
|
1
|
-
require "assets_booster/configuration"
|
2
1
|
require "assets_booster/packager"
|
3
|
-
|
4
2
|
namespace :assets_booster do
|
5
3
|
desc 'Merge assets'
|
6
4
|
task :merge do
|
7
|
-
AssetsBooster::Packager.
|
8
|
-
|
5
|
+
packager = AssetsBooster::Packager.new
|
6
|
+
packager.merge_all
|
9
7
|
end
|
10
8
|
|
11
9
|
desc 'Merge and compile assets'
|
12
10
|
task :compile do
|
13
|
-
AssetsBooster::Packager.
|
14
|
-
|
11
|
+
packager = AssetsBooster::Packager.new
|
12
|
+
packager.compile_all
|
15
13
|
end
|
16
14
|
|
17
15
|
desc 'Delete all asset builds'
|
18
16
|
task :delete do
|
19
|
-
AssetsBooster::Packager.
|
20
|
-
|
17
|
+
packager = AssetsBooster::Packager.new
|
18
|
+
packager.delete_all
|
21
19
|
end
|
22
20
|
|
23
|
-
desc 'Generate
|
21
|
+
desc 'Generate a configuration file for existing assets'
|
24
22
|
task :setup do
|
25
|
-
AssetsBooster::Packager.
|
26
|
-
|
23
|
+
packager = AssetsBooster::Packager.new
|
24
|
+
packager.create_configuration
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
@@ -1,14 +1,11 @@
|
|
1
1
|
module AssetsBooster
|
2
2
|
module ViewHelper
|
3
|
-
def should_merge?
|
4
|
-
AssetPackage.merge_environments.include?(Rails.env)
|
5
|
-
end
|
6
|
-
|
7
3
|
def assets_booster_tag(type, *names)
|
8
4
|
options = names.extract_options!
|
9
|
-
|
5
|
+
packager = AssetsBooster::Railtie.packager
|
6
|
+
packages = packager.packages[type]
|
10
7
|
html = names.map do |name|
|
11
|
-
methode, sources = packages[name].view_helper
|
8
|
+
methode, sources = packages[name].view_helper(packager)
|
12
9
|
send(methode, sources, options)
|
13
10
|
end*"\n"
|
14
11
|
html.html_safe
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
module AssetsBooster
|
3
|
+
module Compiler
|
4
|
+
shared_examples_for "a compiler" do
|
5
|
+
subject{ described_class.new }
|
6
|
+
|
7
|
+
describe "name" do
|
8
|
+
it "should return a string" do
|
9
|
+
subject.name.should_not be_empty
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'compiler/base'
|
2
|
+
require 'assets_booster/compiler/closure'
|
3
|
+
module AssetsBooster
|
4
|
+
module Compiler
|
5
|
+
describe Closure do
|
6
|
+
it_behaves_like "a compiler" do
|
7
|
+
describe "compile" do
|
8
|
+
it "should compile the source file" do
|
9
|
+
subject.compile("var a = 'test'; alert(a);").should == 'var a="test";alert(a);'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'compiler/base'
|
2
|
+
require 'assets_booster/compiler/dummy'
|
3
|
+
module AssetsBooster
|
4
|
+
module Compiler
|
5
|
+
describe Dummy do
|
6
|
+
it_behaves_like "a compiler" do
|
7
|
+
describe "compile" do
|
8
|
+
it "should compile the source file" do
|
9
|
+
subject.compile("var a = 'test'; alert(a);").should == "var a = 'test'; alert(a);"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'compiler/base'
|
2
|
+
require 'assets_booster/compiler/jsmin'
|
3
|
+
module AssetsBooster
|
4
|
+
module Compiler
|
5
|
+
describe JSMin do
|
6
|
+
it_behaves_like "a compiler" do
|
7
|
+
describe "compile" do
|
8
|
+
it "should compile the source file" do
|
9
|
+
subject.compile("var a = 'test'; alert(a);").should == "var a='test';alert(a);"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'compiler/base'
|
2
|
+
require 'assets_booster/compiler/rainpress'
|
3
|
+
module AssetsBooster
|
4
|
+
module Compiler
|
5
|
+
describe Rainpress do
|
6
|
+
it_behaves_like "a compiler" do
|
7
|
+
describe "compile" do
|
8
|
+
it "should compile the source file" do
|
9
|
+
subject.compile("{ color: #ff0000; }").should == "{color:red}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'compiler/base'
|
2
|
+
require 'assets_booster/compiler/uglify'
|
3
|
+
module AssetsBooster
|
4
|
+
module Compiler
|
5
|
+
describe Uglify do
|
6
|
+
it_behaves_like "a compiler" do
|
7
|
+
describe "compile" do
|
8
|
+
it "should compile the source file" do
|
9
|
+
subject.compile("var a = 'test'; alert(a);").should == 'var a="test";alert(a)'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
data/spec/merger/base.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'assets_booster/merger/base'
|
3
|
+
module AssetsBooster
|
4
|
+
module Merger
|
5
|
+
shared_examples_for "a merger" do
|
6
|
+
subject{ described_class.new([]) }
|
7
|
+
|
8
|
+
describe "name" do
|
9
|
+
it "should return a string" do
|
10
|
+
subject.name.should_not be_empty
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "mtime" do
|
15
|
+
subject{ described_class.new(['a', 'b', 'c']) }
|
16
|
+
it "should return the last modification time of all sources" do
|
17
|
+
File.stub(:read){ "" }
|
18
|
+
File.stub(:mtime) do |asset|
|
19
|
+
case asset
|
20
|
+
when 'a' then 1
|
21
|
+
when 'b' then 3
|
22
|
+
when 'c' then 2
|
23
|
+
end
|
24
|
+
end
|
25
|
+
subject.mtime.should == 3
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'merger/base'
|
2
|
+
require 'assets_booster/merger/css'
|
3
|
+
module AssetsBooster
|
4
|
+
module Merger
|
5
|
+
describe CSS do
|
6
|
+
it_behaves_like "a merger" do
|
7
|
+
describe "merge" do
|
8
|
+
subject{ described_class.new(['a.css', 'nested/b.css', 'c.css']) }
|
9
|
+
|
10
|
+
it "should merge sources and rewrite urls" do
|
11
|
+
File.stub(:read) do |source|
|
12
|
+
case source
|
13
|
+
when 'a.css'
|
14
|
+
"{background:url(gucki.png)}"
|
15
|
+
when 'nested/b.css'
|
16
|
+
"{background:url(gucki.png)}"
|
17
|
+
when 'c.css'
|
18
|
+
"{background:url(http://www.example.com/gucki.png)}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
subject.merge("target.css").should == "{background:url(gucki.png)}\n{background:url(nested/gucki.png)}\n{background:url(http://www.example.com/gucki.png)}"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should merge sources and respect import directives" do
|
25
|
+
File.stub(:read) do |source|
|
26
|
+
case source
|
27
|
+
when 'a.css'
|
28
|
+
"@import d.css"
|
29
|
+
when 'nested/b.css'
|
30
|
+
"@import url(http://www.example.com/test.css)"
|
31
|
+
when 'c.css'
|
32
|
+
"{color:#fff;}"
|
33
|
+
when 'd.css'
|
34
|
+
"{color:#f00;}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
subject.merge("target.css").should == "{color:#f00;}\n\n@import url(http://www.example.com/test.css)\n{color:#fff;}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "absolute_url?" do
|
42
|
+
it "should detect absolute urls" do
|
43
|
+
[
|
44
|
+
["http://www.example.com", true],
|
45
|
+
["HTTP://www.example.com", true],
|
46
|
+
["https://www.example.com", true],
|
47
|
+
["/absolute.css", true],
|
48
|
+
["relative.css", false],
|
49
|
+
["another/relative.css", false],
|
50
|
+
].each do |url, result|
|
51
|
+
subject.absolute_url?(url).should == result
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "path_difference" do
|
57
|
+
it "should return the difference" do
|
58
|
+
[
|
59
|
+
["", "", ""],
|
60
|
+
["test", "", "test"],
|
61
|
+
["test", "test", ""],
|
62
|
+
["home/test", "", "home/test"],
|
63
|
+
["home/test", "home", "test"],
|
64
|
+
["/home/test", "/home", "test"],
|
65
|
+
].each do |source, target, result|
|
66
|
+
subject.path_difference(source, target).should == result
|
67
|
+
end
|
68
|
+
end
|
69
|
+
it "should raise if source and target dont share a common base path" do
|
70
|
+
lambda{ subject.path_difference("/home/gucki/test", "/home/peter") }.should raise_error(ArgumentError)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "rewrite_urls" do
|
75
|
+
it "should rewrite url properties" do
|
76
|
+
subject.rewrite_urls("{color:#f00}", "/home/test", "/home/test").should == "{color:#f00}"
|
77
|
+
subject.rewrite_urls("{color:#f00; background:url(test.png)}", "nested", "").should == "{color:#f00; background:url(nested/test.png)}"
|
78
|
+
source_folder = "/home/test/nested"
|
79
|
+
target_folder = "/home/test"
|
80
|
+
[
|
81
|
+
[
|
82
|
+
"{color:#f00}",
|
83
|
+
"{color:#f00}",
|
84
|
+
],
|
85
|
+
[
|
86
|
+
"{color:#f00; background:url(test.png)}",
|
87
|
+
"{color:#f00; background:url(nested/test.png)}",
|
88
|
+
],
|
89
|
+
[
|
90
|
+
"{color:#f00; background:url(\"test.png\")}",
|
91
|
+
"{color:#f00; background:url(\"nested/test.png\")}",
|
92
|
+
],
|
93
|
+
[
|
94
|
+
"{color:#f00; background:url('test.png')}",
|
95
|
+
"{color:#f00; background:url('nested/test.png')}",
|
96
|
+
],
|
97
|
+
[
|
98
|
+
"{color:#f00; background:url('test file.png')}",
|
99
|
+
"{color:#f00; background:url('nested/test file.png')}",
|
100
|
+
],
|
101
|
+
[
|
102
|
+
"{color:#f00; background:url(../test.png)}",
|
103
|
+
"{color:#f00; background:url(nested/../test.png)}",
|
104
|
+
],
|
105
|
+
].each do |input, output|
|
106
|
+
subject.rewrite_urls(input, source_folder, target_folder).should == output
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "extract_url" do
|
112
|
+
it "should extract urls" do
|
113
|
+
[
|
114
|
+
["'test.png'", ["test.png", "'"]],
|
115
|
+
['"test.png"', ["test.png", '"']],
|
116
|
+
["test.png", ["test.png", ""]],
|
117
|
+
].each do |input, output|
|
118
|
+
subject.extract_url(input).should == output
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "dirname" do
|
124
|
+
it "should return the folder of the given path" do
|
125
|
+
[
|
126
|
+
["test.png", ""],
|
127
|
+
["test/test.png", "test"],
|
128
|
+
["/test/nested/test.png", "/test/nested"],
|
129
|
+
].each do |input, output|
|
130
|
+
subject.dirname(input).should == output
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'merger/base'
|
2
|
+
require 'assets_booster/merger/simple'
|
3
|
+
module AssetsBooster
|
4
|
+
module Merger
|
5
|
+
describe Simple do
|
6
|
+
it_behaves_like "a merger" do
|
7
|
+
describe "merge" do
|
8
|
+
subject{ described_class.new(['a', 'b', 'c']) }
|
9
|
+
it "should merge source files" do
|
10
|
+
File.stub(:read){ |source| source }
|
11
|
+
subject.merge("target.css").should == "a\nb\nc"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'assets_booster/package/base'
|
3
|
+
module AssetsBooster
|
4
|
+
module Package
|
5
|
+
shared_examples_for "a package" do
|
6
|
+
subject{ described_class.new("test", []) }
|
7
|
+
|
8
|
+
before do
|
9
|
+
Rails.stub(:root){ "/rails" }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "name" do
|
13
|
+
it "should return a string" do
|
14
|
+
subject.name.should_not be_empty
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "view_helper_method" do
|
19
|
+
it "should return a symbol" do
|
20
|
+
subject.view_helper_method.should be_an_instance_of(Symbol)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'package/base'
|
2
|
+
require 'assets_booster/package/javascript'
|
3
|
+
module AssetsBooster
|
4
|
+
module Package
|
5
|
+
describe Javascript do
|
6
|
+
it_behaves_like "a package" do
|
7
|
+
describe "asset_path" do
|
8
|
+
it "should return a javascript filename" do
|
9
|
+
subject.asset_path("lala").should match(/javascripts\/lala\.js/)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'package/base'
|
2
|
+
require 'assets_booster/package/stylesheet'
|
3
|
+
module AssetsBooster
|
4
|
+
module Package
|
5
|
+
describe Stylesheet do
|
6
|
+
it_behaves_like "a package" do
|
7
|
+
describe "asset_path" do
|
8
|
+
it "should return a stylesheet filename" do
|
9
|
+
subject.asset_path("lala").should match(/stylesheets\/lala\.css/)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'assets_booster/packager'
|
3
|
+
module AssetsBooster
|
4
|
+
describe Packager do
|
5
|
+
before do
|
6
|
+
Rails.stub(:root){ "/rails" }
|
7
|
+
@messages = []
|
8
|
+
AssetsBooster.stub(:log){ |message| @messages << message }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "create_configuration" do
|
12
|
+
it "should abort if a configuration file already exists" do
|
13
|
+
File.should_receive(:exists?).with(subject.configuration_filename).and_return(true)
|
14
|
+
File.should_not_receive(:open).with(subject.configuration_filename, "w")
|
15
|
+
subject.create_configuration
|
16
|
+
@messages[0].should match(/already exists/)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should create a configration file from current assets" do
|
20
|
+
Dir.should_receive(:[]).with("/rails/public/javascripts/*.js").and_return(%w(/rails/public/javascripts/jquery.js /rails/public/javascripts/rails.js))
|
21
|
+
Dir.should_receive(:[]).with("/rails/public/stylesheets/*.css").and_return(%w(/rails/public/stylesheets/screen.css))
|
22
|
+
File.should_receive(:open).with(subject.configuration_filename, "w").and_yield(nil)
|
23
|
+
YAML.should_receive(:dump) do |config, file|
|
24
|
+
config['packages']['javascript']['base'].size.should == 2
|
25
|
+
config['packages']['stylesheet']['base'].size.should == 1
|
26
|
+
end
|
27
|
+
subject.create_configuration
|
28
|
+
@messages[0].should match(/created/)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "compile_all" do
|
33
|
+
it "should compile all assets of all packages" do
|
34
|
+
YAML.should_receive(:load_file).with(subject.configuration_filename).and_return(
|
35
|
+
'packages' => {
|
36
|
+
'javascript' => {
|
37
|
+
'base' => %w(jquery rails),
|
38
|
+
},
|
39
|
+
'stylesheet' => {
|
40
|
+
'base' => %w(screen),
|
41
|
+
},
|
42
|
+
},
|
43
|
+
'options' => {
|
44
|
+
'javascript' => {
|
45
|
+
'compiler' => "uglify",
|
46
|
+
},
|
47
|
+
'stylesheet' => {
|
48
|
+
'compiler' => "rainpress",
|
49
|
+
},
|
50
|
+
'environments' => %w(test),
|
51
|
+
}
|
52
|
+
)
|
53
|
+
|
54
|
+
# merging css
|
55
|
+
File.should_receive(:read).with("/rails/public/stylesheets/screen.css").once.and_return("html { color: #f00; }")
|
56
|
+
file = double("File")
|
57
|
+
file.should_receive(:write).with("html { color: #f00; }").once
|
58
|
+
File.should_receive(:open).with("/rails/public/stylesheets/base_packaged.css", "w").twice.and_yield(file)
|
59
|
+
File.should_receive(:mtime).with("/rails/public/stylesheets/screen.css").once.and_return(13)
|
60
|
+
File.should_receive(:utime).with(13, 13, "/rails/public/stylesheets/base_packaged.css").twice
|
61
|
+
|
62
|
+
# compiling css
|
63
|
+
file.should_receive(:write).with("html{color:red}").once
|
64
|
+
|
65
|
+
# merging js
|
66
|
+
File.should_receive(:read).with("/rails/public/javascripts/jquery.js").once.and_return("var action = 'jquery'; alert('jquery')")
|
67
|
+
File.should_receive(:read).with("/rails/public/javascripts/rails.js").once.and_return("action = 4*3; alert('rails')")
|
68
|
+
file = double("File")
|
69
|
+
file.should_receive(:write).with("var action = 'jquery'; alert('jquery')\naction = 4*3; alert('rails')").once
|
70
|
+
File.should_receive(:open).with("/rails/public/javascripts/base_packaged.js", "w").twice.and_yield(file)
|
71
|
+
File.should_receive(:mtime).with("/rails/public/javascripts/jquery.js").once.and_return(13)
|
72
|
+
File.should_receive(:mtime).with("/rails/public/javascripts/rails.js").once.and_return(14)
|
73
|
+
File.should_receive(:utime).with(14, 14, "/rails/public/javascripts/base_packaged.js").twice
|
74
|
+
|
75
|
+
# compiling js
|
76
|
+
file.should_receive(:write).with("var action=\"jquery\";alert(\"jquery\"),action=12,alert(\"rails\")").once
|
77
|
+
|
78
|
+
subject.compile_all
|
79
|
+
@messages[0].should match(/Merging assets.*CSS Merger/)
|
80
|
+
@messages[1].should match(/Compiling.*Rainpress/)
|
81
|
+
@messages[3].should match(/Merging assets.*Simple Merger/)
|
82
|
+
@messages[4].should match(/Compiling.*UglifyJS/)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|