rake-minify 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +30 -2
- data/Rakefile +4 -0
- data/VERSION +1 -1
- data/features/coffeescript.feature +15 -0
- data/features/js-expected/c-a.min.js +1 -0
- data/features/js-sources/c-a.coffee +2 -0
- data/features/js-sources/c-a.js +1 -0
- data/features/minify.feature +16 -0
- data/features/step_definitions/rake-minify_steps.rb +5 -2
- data/features/support/generate_rakefiles.rb +17 -6
- data/lib/rake/minify.rb +13 -5
- data/lib/rake/minify/group.rb +4 -0
- data/lib/rake/minify/source.rb +20 -2
- data/rake-minify.gemspec +9 -2
- data/spec/rake/minify/group_spec.rb +5 -0
- data/spec/rake/minify/source_spec.rb +10 -0
- data/spec/rake/minify_spec.rb +49 -1
- metadata +25 -5
data/README.rdoc
CHANGED
@@ -23,19 +23,24 @@ Open your Rakefile and add:
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
This task minify the file "path/to/your/dir/source.js" into the file "output.js".
|
27
|
+
|
26
28
|
== Minify multiple JavaScript files
|
27
29
|
|
28
30
|
Open your Rakefile and add:
|
29
31
|
|
30
32
|
Rake::Minify.new(:minify_multiple) do
|
31
33
|
dir("path/to/your/dir") do # we specify only the source directory
|
32
|
-
group("output-multi.js") do
|
33
|
-
add("first.js")
|
34
|
+
group("output-multi.js") do # the output file name is full path
|
35
|
+
add("first.js")
|
34
36
|
add("second.js")
|
35
37
|
end
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
41
|
+
This task packs and minify the files "path/to/your/dir/first.js" and
|
42
|
+
"path/to/your/dir/second.js" into the file "output-multi.js".
|
43
|
+
|
39
44
|
== Combine only multiple JavaScript files
|
40
45
|
|
41
46
|
Open your Rakefile and add:
|
@@ -49,6 +54,29 @@ Open your Rakefile and add:
|
|
49
54
|
end
|
50
55
|
end
|
51
56
|
|
57
|
+
== CoffeeScript support
|
58
|
+
|
59
|
+
The rake-minify gem now supports even CoffeeScript files to be compiled,
|
60
|
+
minified and bundled, just include them like javascript files.
|
61
|
+
|
62
|
+
CoffeeScript support requires the coffe-script gem, so install the gem:
|
63
|
+
|
64
|
+
gem install coffee-script
|
65
|
+
|
66
|
+
Or if your are using Bundler:
|
67
|
+
|
68
|
+
echo "gem 'coffee-script'" >> Gemfile
|
69
|
+
bundle install
|
70
|
+
|
71
|
+
Then open your Rakefile and add:
|
72
|
+
|
73
|
+
Rake::Minify.new(:minify_single) do
|
74
|
+
dir("path/to/your/dir") do # we specify only the source directory
|
75
|
+
add("output.js", "source.coffee") # the coffee file is compiled and minified
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
|
52
80
|
== Contributing to rake-minify
|
53
81
|
|
54
82
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
data/Rakefile
CHANGED
@@ -22,6 +22,7 @@ Jeweler::Tasks.new do |gem|
|
|
22
22
|
gem.add_development_dependency 'test_notifier', '~> 0.3.6'
|
23
23
|
gem.add_development_dependency 'autotest', '~> 4.4'
|
24
24
|
gem.add_development_dependency "rcov", ">= 0"
|
25
|
+
gem.add_development_dependency "coffee-script", ">= 2.2.0"
|
25
26
|
end
|
26
27
|
Jeweler::RubygemsDotOrgTasks.new
|
27
28
|
|
@@ -34,6 +35,9 @@ end
|
|
34
35
|
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
35
36
|
spec.pattern = 'spec/**/*_spec.rb'
|
36
37
|
spec.rcov = true
|
38
|
+
spec.rcov_opts = ["--text-summary", "--exclude","lib\/rspec,bin\/rspec,lib\/rcov," +
|
39
|
+
"spec,diff-lcs,lib\/cucumber,lib\/gherkin,cucumber,features,rake-0,coffee,json,execjs,jsmin"]
|
40
|
+
|
37
41
|
end
|
38
42
|
|
39
43
|
require 'cucumber/rake/task'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Feature: Compile minify and bundle CoffeeScript files
|
2
|
+
In order to build awesome javascript applications
|
3
|
+
A ruby programmer
|
4
|
+
Wants to minify its coffeescripts using rake
|
5
|
+
|
6
|
+
Scenario: Minify single javascript
|
7
|
+
Given we want to minify the js file "c-a.coffee" into "c-a.min.js"
|
8
|
+
When I run rake minify
|
9
|
+
Then "c-a.min.js" should be minified
|
10
|
+
|
11
|
+
Scenario: Combine multiple javascripts into a single file
|
12
|
+
Given we want to combine the js file "c-a.coffee" into "app.js"
|
13
|
+
And we want to combine the js file "b.js" into "app.js"
|
14
|
+
When I run rake minify
|
15
|
+
Then "app.js" should include "c-a.js" and "b.js"
|
@@ -0,0 +1 @@
|
|
1
|
+
alert("hello a");
|
@@ -0,0 +1 @@
|
|
1
|
+
alert("hello a");
|
data/features/minify.feature
CHANGED
@@ -46,3 +46,19 @@ Feature: Minify Javascripts
|
|
46
46
|
And we want to minify the js file "b.js" into "app.min.js"
|
47
47
|
When I run rake minify
|
48
48
|
Then "app.min.js" should include "a.min.js" and "b.min.js"
|
49
|
+
|
50
|
+
Scenario: Minify multiple javascripts with an inner directory
|
51
|
+
Given the inner directory "public"
|
52
|
+
And we want to minify the js file "a.js" into "app.min.js"
|
53
|
+
And we want to minify the js file "b.js" into "app.min.js"
|
54
|
+
When I run rake minify
|
55
|
+
Then "app.min.js" should include "a.min.js" and "b.min.js"
|
56
|
+
|
57
|
+
@wip
|
58
|
+
Scenario: Minify multiple javascripts with a basedir and an inner directory
|
59
|
+
Given the basedir "base"
|
60
|
+
And the inner directory "in"
|
61
|
+
And we want to minify the js file "a.js" into "app.min.js"
|
62
|
+
And we want to minify the js file "b.js" into "app.min.js"
|
63
|
+
When I run rake minify
|
64
|
+
Then "app.min.js" should include "a.min.js" and "b.min.js"
|
@@ -11,7 +11,7 @@ When /^I run rake minify$/ do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
Then /^"([^"]*)" should be minified$/ do |file|
|
14
|
-
open(File.join(@dir,
|
14
|
+
open(File.join(@dir, file)) do |result|
|
15
15
|
open(File.join(File.dirname(__FILE__), "..", "js-expected", file)) do |expected|
|
16
16
|
(result.read + "\n").should == expected.read
|
17
17
|
end
|
@@ -34,7 +34,7 @@ Then /^"([^"]*)" should include "([^"]*)" and "([^"]*)"$/ do |result, source1, s
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
open(File.join(@dir,
|
37
|
+
open(File.join(@dir, result)) do |result|
|
38
38
|
content = result.read
|
39
39
|
sources.each { |s| content.should include(s.gsub(/\n$/,'')) } # this is unfortunate :/
|
40
40
|
end
|
@@ -56,3 +56,6 @@ Given /^I have a "([^"]*)" rake task$/ do |arg1|
|
|
56
56
|
pre << "task #{arg1} "
|
57
57
|
end
|
58
58
|
|
59
|
+
Given /^the inner directory "([^"]*)"$/ do |dir|
|
60
|
+
indir(dir)
|
61
|
+
end
|
@@ -31,21 +31,27 @@ def generate_rakefile
|
|
31
31
|
<%= pre.join("\n") %>
|
32
32
|
|
33
33
|
Rake::Minify.new(<%= @name_for_generation %>) do
|
34
|
-
<% if basedir
|
35
|
-
dir(
|
34
|
+
<% if basedir %>
|
35
|
+
dir(<%= basedir.inspect %>) do
|
36
36
|
<% end %>
|
37
37
|
<% groups.values.each do |group| %>
|
38
38
|
<% if group.sources.size == 1 %>
|
39
39
|
add(<%= group.output.inspect %>, <%= group.sources.first.source.inspect %>)
|
40
40
|
<% else %>
|
41
41
|
group(<%= group.output.inspect %>) do |group|
|
42
|
+
<% if indir %>
|
43
|
+
dir(<%= indir.inspect %>) do
|
44
|
+
<% end %>
|
42
45
|
<% group.sources.each do |element| %>
|
43
46
|
add(<%= element.source.inspect %>, :minify => <%= element.minify %>)
|
44
47
|
<% end %>
|
48
|
+
<% if indir %>
|
49
|
+
end
|
50
|
+
<% end %>
|
45
51
|
end
|
46
52
|
<% end %>
|
47
53
|
<% end %>
|
48
|
-
<% if basedir
|
54
|
+
<% if basedir %>
|
49
55
|
end
|
50
56
|
<% end %>
|
51
57
|
end
|
@@ -54,15 +60,20 @@ EOF
|
|
54
60
|
erb.result(binding)
|
55
61
|
end
|
56
62
|
|
57
|
-
def basedir(dir=
|
63
|
+
def basedir(dir=nil)
|
58
64
|
@basedir ||= dir
|
59
65
|
end
|
60
66
|
|
67
|
+
def indir(dir=nil)
|
68
|
+
@indir ||= dir
|
69
|
+
end
|
70
|
+
|
61
71
|
def run_task(task_name="minify")
|
62
72
|
@dir = Dir.mktmpdir
|
63
|
-
|
73
|
+
dest_dir = File.join(*([basedir, indir, ""].select { |e| e }))
|
74
|
+
FileUtils.mkdir_p File.join(@dir, dest_dir) if dest_dir.size > 0
|
64
75
|
Dir.glob(File.join(File.dirname(__FILE__), "..", "js-sources", "*")) do |file|
|
65
|
-
FileUtils.cp(file, File.join(@dir,
|
76
|
+
FileUtils.cp(file, File.join(@dir, dest_dir))
|
66
77
|
end
|
67
78
|
rakefile = File.join(@dir, "Rakefile")
|
68
79
|
open(rakefile, "w") { |io| io << generate_rakefile }
|
data/lib/rake/minify.rb
CHANGED
@@ -11,6 +11,7 @@ class Rake::Minify < Rake::TaskLib
|
|
11
11
|
@sources = {}
|
12
12
|
@dir = nil
|
13
13
|
@config = block
|
14
|
+
@dir_stack = []
|
14
15
|
|
15
16
|
desc "Minifies the specified javascripts" unless Rake.application.last_comment
|
16
17
|
task name do
|
@@ -19,17 +20,19 @@ class Rake::Minify < Rake::TaskLib
|
|
19
20
|
end
|
20
21
|
|
21
22
|
def add(output, source, opts = { :minify => true })
|
22
|
-
|
23
|
+
add_source(output, Source.new(build_path(source), opts[:minify]))
|
23
24
|
end
|
24
25
|
|
25
26
|
def group(output, &block)
|
26
|
-
|
27
|
+
add_source(output, Group.new(self, &block))
|
27
28
|
end
|
28
29
|
|
29
30
|
def dir(dir, &block)
|
30
|
-
@
|
31
|
-
|
32
|
-
@dir
|
31
|
+
@dir_stack << dir
|
32
|
+
@dir = File.join(@dir_stack)
|
33
|
+
block.call #FIXME @dir should be a stack
|
34
|
+
@dir_stack.pop
|
35
|
+
@dir = File.join(@dir_stack)
|
33
36
|
end
|
34
37
|
|
35
38
|
def invoke
|
@@ -45,4 +48,9 @@ class Rake::Minify < Rake::TaskLib
|
|
45
48
|
def build_path(file)
|
46
49
|
@dir.nil? && file || File.join(@dir, file)
|
47
50
|
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def add_source(output, source)
|
54
|
+
@sources[output] = source
|
55
|
+
end
|
48
56
|
end
|
data/lib/rake/minify/group.rb
CHANGED
data/lib/rake/minify/source.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
class Rake::Minify::Source
|
3
2
|
attr_reader :source, :minify
|
4
3
|
|
@@ -8,8 +7,27 @@ class Rake::Minify::Source
|
|
8
7
|
end
|
9
8
|
|
10
9
|
def build
|
10
|
+
coffee_script! if coffee?
|
11
|
+
|
11
12
|
Kernel.open(source) do |input|
|
12
|
-
|
13
|
+
output = input.read
|
14
|
+
output = CoffeeScript.compile(output, :bare => true) if coffee? #TODO make bare configurable
|
15
|
+
output = JSMin.minify(output).strip if minify
|
16
|
+
output
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def coffee?
|
21
|
+
source =~ /\.coffee$/
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def coffee_script!
|
26
|
+
begin
|
27
|
+
require 'coffee-script'
|
28
|
+
rescue
|
29
|
+
raise "Missing coffee-script gem"
|
30
|
+
exit 1
|
13
31
|
end
|
14
32
|
end
|
15
33
|
end
|
data/rake-minify.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rake-minify}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Matteo Collina"]
|
12
|
-
s.date = %q{2011-04-
|
12
|
+
s.date = %q{2011-04-17}
|
13
13
|
s.description = %q{A rake task to minify javascripts}
|
14
14
|
s.email = %q{matteo.collina@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -25,10 +25,14 @@ Gem::Specification.new do |s|
|
|
25
25
|
"README.rdoc",
|
26
26
|
"Rakefile",
|
27
27
|
"VERSION",
|
28
|
+
"features/coffeescript.feature",
|
28
29
|
"features/js-expected/a.min.js",
|
29
30
|
"features/js-expected/b.min.js",
|
31
|
+
"features/js-expected/c-a.min.js",
|
30
32
|
"features/js-sources/a.js",
|
31
33
|
"features/js-sources/b.js",
|
34
|
+
"features/js-sources/c-a.coffee",
|
35
|
+
"features/js-sources/c-a.js",
|
32
36
|
"features/minify.feature",
|
33
37
|
"features/rake-interface.feature",
|
34
38
|
"features/step_definitions/rake-minify_steps.rb",
|
@@ -67,6 +71,7 @@ Gem::Specification.new do |s|
|
|
67
71
|
s.add_development_dependency(%q<test_notifier>, ["~> 0.3.6"])
|
68
72
|
s.add_development_dependency(%q<autotest>, ["~> 4.4"])
|
69
73
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
74
|
+
s.add_development_dependency(%q<coffee-script>, [">= 2.2.0"])
|
70
75
|
else
|
71
76
|
s.add_dependency(%q<jsmin>, ["~> 1.0.1"])
|
72
77
|
s.add_dependency(%q<rspec>, ["~> 2.5.0"])
|
@@ -75,6 +80,7 @@ Gem::Specification.new do |s|
|
|
75
80
|
s.add_dependency(%q<test_notifier>, ["~> 0.3.6"])
|
76
81
|
s.add_dependency(%q<autotest>, ["~> 4.4"])
|
77
82
|
s.add_dependency(%q<rcov>, [">= 0"])
|
83
|
+
s.add_dependency(%q<coffee-script>, [">= 2.2.0"])
|
78
84
|
end
|
79
85
|
else
|
80
86
|
s.add_dependency(%q<jsmin>, ["~> 1.0.1"])
|
@@ -84,6 +90,7 @@ Gem::Specification.new do |s|
|
|
84
90
|
s.add_dependency(%q<test_notifier>, ["~> 0.3.6"])
|
85
91
|
s.add_dependency(%q<autotest>, ["~> 4.4"])
|
86
92
|
s.add_dependency(%q<rcov>, [">= 0"])
|
93
|
+
s.add_dependency(%q<coffee-script>, [">= 2.2.0"])
|
87
94
|
end
|
88
95
|
end
|
89
96
|
|
@@ -53,5 +53,10 @@ class Rake::Minify
|
|
53
53
|
|
54
54
|
subject.build.should == "aaaa"
|
55
55
|
end
|
56
|
+
|
57
|
+
it "should expose its parent dir method" do
|
58
|
+
parent.should_receive(:dir).with("a_dir").and_yield("hello world")
|
59
|
+
(subject.dir("a_dir") { |a| a }).should == "hello world" #weird method to test this
|
60
|
+
end
|
56
61
|
end
|
57
62
|
end
|
@@ -22,5 +22,15 @@ class Rake::Minify
|
|
22
22
|
subject.build.should == ' var a = "b" ;'
|
23
23
|
end
|
24
24
|
end
|
25
|
+
|
26
|
+
context "compile a coffeescript file" do
|
27
|
+
subject { Source.new("a_source.coffee", true) }
|
28
|
+
|
29
|
+
it "should open and minify the file" do
|
30
|
+
input = StringIO.new(' a = "b" ')
|
31
|
+
Kernel.stub!(:open).with("a_source.coffee").and_yield(input)
|
32
|
+
subject.build.should == "var a;a=\"b\";"
|
33
|
+
end
|
34
|
+
end
|
25
35
|
end
|
26
36
|
end
|
data/spec/rake/minify_spec.rb
CHANGED
@@ -84,7 +84,29 @@ describe Rake::Minify do
|
|
84
84
|
|
85
85
|
before :each do
|
86
86
|
stub_open("the_dir/source",' var a = "b" ;')
|
87
|
-
@output = stub_open("
|
87
|
+
@output = stub_open("output","", "w")
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should minify the input file when invoked" do
|
91
|
+
do_invoke
|
92
|
+
@output.string.should == "var a=\"b\";"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
context "configured to minify a file in a deep directory" do
|
97
|
+
subject do
|
98
|
+
Rake::Minify.new do
|
99
|
+
dir("the_dir") do
|
100
|
+
dir("another_dir") do
|
101
|
+
add("output", "source")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
before :each do
|
108
|
+
stub_open("the_dir/another_dir/source",' var a = "b" ;')
|
109
|
+
@output = stub_open("output","", "w")
|
88
110
|
end
|
89
111
|
|
90
112
|
it "should minify the input file when invoked" do
|
@@ -93,6 +115,32 @@ describe Rake::Minify do
|
|
93
115
|
end
|
94
116
|
end
|
95
117
|
|
118
|
+
context "configured to minify multiple files in a deep directory" do
|
119
|
+
subject do
|
120
|
+
Rake::Minify.new do
|
121
|
+
dir("the_dir") do
|
122
|
+
group("output") do
|
123
|
+
dir("another_dir") do
|
124
|
+
add("a")
|
125
|
+
end
|
126
|
+
add("b")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
before :each do
|
133
|
+
stub_open("the_dir/another_dir/a",' var a = "hello" ;')
|
134
|
+
stub_open("the_dir/b",' var b = "hello2" ;')
|
135
|
+
@output = stub_open("output","", "w")
|
136
|
+
end
|
137
|
+
|
138
|
+
it "should minify the input file when invoked" do
|
139
|
+
do_invoke
|
140
|
+
@output.string.should == "var a=\"hello\";\nvar b=\"hello2\";"
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
96
144
|
it "should accepts arguments" do
|
97
145
|
Rake::Task.should_receive(:define_task).with(:a_task)
|
98
146
|
Rake::Minify.new(:a_task) do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rake-minify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Matteo Collina
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-04-
|
18
|
+
date: 2011-04-17 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -125,6 +125,22 @@ dependencies:
|
|
125
125
|
version: "0"
|
126
126
|
type: :development
|
127
127
|
version_requirements: *id007
|
128
|
+
- !ruby/object:Gem::Dependency
|
129
|
+
name: coffee-script
|
130
|
+
prerelease: false
|
131
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
132
|
+
none: false
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
hash: 7
|
137
|
+
segments:
|
138
|
+
- 2
|
139
|
+
- 2
|
140
|
+
- 0
|
141
|
+
version: 2.2.0
|
142
|
+
type: :development
|
143
|
+
version_requirements: *id008
|
128
144
|
description: A rake task to minify javascripts
|
129
145
|
email: matteo.collina@gmail.com
|
130
146
|
executables: []
|
@@ -143,10 +159,14 @@ files:
|
|
143
159
|
- README.rdoc
|
144
160
|
- Rakefile
|
145
161
|
- VERSION
|
162
|
+
- features/coffeescript.feature
|
146
163
|
- features/js-expected/a.min.js
|
147
164
|
- features/js-expected/b.min.js
|
165
|
+
- features/js-expected/c-a.min.js
|
148
166
|
- features/js-sources/a.js
|
149
167
|
- features/js-sources/b.js
|
168
|
+
- features/js-sources/c-a.coffee
|
169
|
+
- features/js-sources/c-a.js
|
150
170
|
- features/minify.feature
|
151
171
|
- features/rake-interface.feature
|
152
172
|
- features/step_definitions/rake-minify_steps.rb
|