rake-pipeline-web-filters 0.5.0 → 0.7.0

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.
Files changed (47) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +1 -0
  3. data/Rakefile +8 -0
  4. data/lib/rake-pipeline-web-filters.rb +17 -3
  5. data/lib/rake-pipeline-web-filters/cache_buster_filter.rb +42 -0
  6. data/lib/rake-pipeline-web-filters/chained_filter.rb +116 -0
  7. data/lib/rake-pipeline-web-filters/coffee_script_filter.rb +41 -0
  8. data/lib/rake-pipeline-web-filters/filter_with_dependencies.rb +27 -0
  9. data/lib/rake-pipeline-web-filters/gzip_filter.rb +59 -0
  10. data/lib/rake-pipeline-web-filters/handlebars_filter.rb +62 -0
  11. data/lib/rake-pipeline-web-filters/helpers.rb +100 -18
  12. data/lib/rake-pipeline-web-filters/iife_filter.rb +38 -0
  13. data/lib/rake-pipeline-web-filters/less_filter.rb +55 -0
  14. data/lib/rake-pipeline-web-filters/markdown_filter.rb +70 -0
  15. data/lib/rake-pipeline-web-filters/minispade_filter.rb +21 -5
  16. data/lib/rake-pipeline-web-filters/neuter_filter.rb +110 -0
  17. data/lib/rake-pipeline-web-filters/sass_filter.rb +87 -0
  18. data/lib/rake-pipeline-web-filters/stylus_filter.rb +59 -0
  19. data/lib/rake-pipeline-web-filters/tilt_filter.rb +16 -3
  20. data/lib/rake-pipeline-web-filters/uglify_filter.rb +66 -0
  21. data/lib/rake-pipeline-web-filters/version.rb +1 -1
  22. data/lib/rake-pipeline-web-filters/yui_css_filter.rb +70 -0
  23. data/lib/rake-pipeline-web-filters/yui_javascript_filter.rb +59 -0
  24. data/rake-pipeline-web-filters.gemspec +10 -1
  25. data/spec/cache_buster_filter_spec.rb +105 -0
  26. data/spec/chained_filter_spec.rb +76 -0
  27. data/spec/coffee_script_filter_spec.rb +110 -0
  28. data/spec/gzip_filter_spec.rb +49 -0
  29. data/spec/handlebars_filter_spec.rb +70 -0
  30. data/spec/helpers_spec.rb +112 -18
  31. data/spec/iife_filter_spec.rb +55 -0
  32. data/spec/less_filter_spec.rb +59 -0
  33. data/spec/markdown_filter_spec.rb +86 -0
  34. data/spec/minispade_filter_spec.rb +47 -15
  35. data/spec/neuter_filter_spec.rb +204 -0
  36. data/spec/sass_filter_spec.rb +147 -0
  37. data/spec/spec_helper.rb +10 -1
  38. data/spec/stylus_filter_spec.rb +69 -0
  39. data/spec/tilt_filter_spec.rb +25 -1
  40. data/spec/uglify_filter_spec.rb +82 -0
  41. data/spec/yui_css_filter_spec.rb +88 -0
  42. data/spec/yui_javascript_filter_spec.rb +68 -0
  43. metadata +225 -19
  44. data/lib/rake-pipeline-web-filters/ordering_concat_filter.rb +0 -38
  45. data/lib/rake-pipeline-web-filters/sass_compiler.rb +0 -53
  46. data/spec/ordering_concat_filter_spec.rb +0 -39
  47. data/spec/sass_compiler_spec.rb +0 -89
@@ -0,0 +1,110 @@
1
+ describe "CoffeeScriptFilter" do
2
+ CoffeeScriptFilter ||= Rake::Pipeline::Web::Filters::CoffeeScriptFilter
3
+ MemoryFileWrapper ||= Rake::Pipeline::SpecHelpers::MemoryFileWrapper
4
+
5
+ let(:coffee_input) { <<-COFFEE }
6
+ x = 1;
7
+
8
+ y = ->
9
+ x += 1
10
+ COFFEE
11
+
12
+ let(:expected_coffee_output) { <<-HTML }
13
+ (function() {
14
+ var x, y;
15
+
16
+ x = 1;
17
+
18
+ y = function() {
19
+ return x += 1;
20
+ };
21
+
22
+ }).call(this);
23
+ HTML
24
+
25
+ let(:expected_unwrapped_coffee_output) { <<-HTML }
26
+ var x, y;
27
+
28
+ x = 1;
29
+
30
+ y = function() {
31
+ return x += 1;
32
+ };
33
+ HTML
34
+
35
+ def input_file(name, content)
36
+ MemoryFileWrapper.new("/path/to/input", name, "UTF-8", content)
37
+ end
38
+
39
+ def output_file(name)
40
+ MemoryFileWrapper.new("/path/to/output", name, "UTF-8")
41
+ end
42
+
43
+ def should_match(expected, output)
44
+ "#{expected}\n".gsub(/\n+/, "\n").should == "#{output}\n".gsub(/\n+/, "\n")
45
+ end
46
+
47
+ def setup_filter(filter)
48
+ filter.file_wrapper_class = MemoryFileWrapper
49
+ filter.input_files = [input_file("input.coffee", coffee_input)]
50
+ filter.output_root = "/path/to/output"
51
+ filter.rake_application = Rake::Application.new
52
+ filter
53
+ end
54
+
55
+ it "generates output" do
56
+ filter = setup_filter CoffeeScriptFilter.new
57
+
58
+ filter.output_files.should == [output_file("input.js")]
59
+
60
+ tasks = filter.generate_rake_tasks
61
+ tasks.each(&:invoke)
62
+
63
+ file = MemoryFileWrapper.files["/path/to/output/input.js"]
64
+ should_match file.body, expected_coffee_output
65
+ file.encoding.should == "UTF-8"
66
+ end
67
+
68
+ it "generates unwrapped output" do
69
+ filter = setup_filter CoffeeScriptFilter.new(:no_wrap => true)
70
+
71
+ filter.output_files.should == [output_file("input.js")]
72
+
73
+ tasks = filter.generate_rake_tasks
74
+ tasks.each(&:invoke)
75
+
76
+ file = MemoryFileWrapper.files["/path/to/output/input.js"]
77
+ should_match file.body, expected_unwrapped_coffee_output
78
+ file.encoding.should == "UTF-8"
79
+ end
80
+
81
+ describe "naming output files" do
82
+ it "translates .coffee extensions to .js by default" do
83
+ filter = setup_filter CoffeeScriptFilter.new
84
+ filter.output_files.first.path.should == "input.js"
85
+ end
86
+
87
+ it "accepts a block to customize output file names" do
88
+ filter = setup_filter(CoffeeScriptFilter.new { |input| "octopus" })
89
+ filter.output_files.first.path.should == "octopus"
90
+ end
91
+ end
92
+
93
+ describe "invalid input" do
94
+ let(:coffee_input) { <<-COFFEE }
95
+ y = function(){
96
+ return "whoops there javascript in here!"
97
+ }
98
+ COFFEE
99
+
100
+ it "has a useful error message including the input file name" do
101
+ filter = setup_filter CoffeeScriptFilter.new
102
+ tasks = filter.generate_rake_tasks
103
+ lambda {
104
+ tasks.each(&:invoke)
105
+ }.should raise_error(ExecJS::RuntimeError, /Error compiling input.coffee.+line 1/i)
106
+ end
107
+ end
108
+
109
+ end
110
+
@@ -0,0 +1,49 @@
1
+ require 'base64'
2
+ require 'stringio'
3
+ require 'zlib'
4
+
5
+ describe "GzipFilter" do
6
+ GzipFilter ||= Rake::Pipeline::Web::Filters::GzipFilter
7
+ MemoryFileWrapper ||= Rake::Pipeline::SpecHelpers::MemoryFileWrapper
8
+
9
+ let(:input) { "(function(){console.log('gzip me')})();" }
10
+
11
+ def input_file(name, content)
12
+ MemoryFileWrapper.new("/path/to/input", name, "UTF-8", content)
13
+ end
14
+
15
+ def output_file(name)
16
+ MemoryFileWrapper.new("/path/to/output", name, "BINARY")
17
+ end
18
+
19
+ def setup_filter(filter)
20
+ filter.file_wrapper_class = MemoryFileWrapper
21
+ filter.input_files = [input_file("test.js", input)]
22
+ filter.output_root = "/path/to/output"
23
+ filter.rake_application = Rake::Application.new
24
+ filter
25
+ end
26
+
27
+ it "generates output" do
28
+ filter = setup_filter GzipFilter.new
29
+ filter.output_files.should == [output_file("test.js.gz")]
30
+ tasks = filter.generate_rake_tasks
31
+ tasks.each(&:invoke)
32
+ file = MemoryFileWrapper.files["/path/to/output/test.js.gz"]
33
+ Zlib::GzipReader.new(StringIO.new(file.body)).read.should == input
34
+ end
35
+
36
+ describe "naming output files" do
37
+ it "translates extensions to .*.gz by default" do
38
+ filter = setup_filter GzipFilter.new
39
+ filter.output_files.first.path.should == "test.js.gz"
40
+ end
41
+
42
+ it "accepts a block to customize output file names" do
43
+ filter = setup_filter(GzipFilter.new { |input| "octopus" })
44
+ filter.output_files.first.path.should == "octopus"
45
+ end
46
+ end
47
+
48
+ end
49
+
@@ -0,0 +1,70 @@
1
+ describe "HandlebarsFilter" do
2
+ HandlebarsFilter ||= Rake::Pipeline::Web::Filters::HandlebarsFilter
3
+ MemoryFileWrapper ||= Rake::Pipeline::SpecHelpers::MemoryFileWrapper
4
+
5
+ let(:handlebars_input) {
6
+ '<h1 class="title">{{title}}</h1>'
7
+ }
8
+
9
+ let(:expected_output) {
10
+ "Ember.TEMPLATES['test']=Ember.Handlebars.compile(\"<h1 class=\\\"title\\\">{{title}}</h1>\");"
11
+ }
12
+
13
+ def input_file(name, content)
14
+ MemoryFileWrapper.new("/path/to/input", name, "UTF-8", content)
15
+ end
16
+
17
+ def output_file(name)
18
+ MemoryFileWrapper.new("/path/to/output", name, "UTF-8")
19
+ end
20
+
21
+ def setup_filter(filter, input_filename = "test.handlebars")
22
+ filter.file_wrapper_class = MemoryFileWrapper
23
+ filter.input_files = [input_file(input_filename, handlebars_input)]
24
+ filter.output_root = "/path/to/output"
25
+ filter.rake_application = Rake::Application.new
26
+ filter
27
+ end
28
+
29
+ it "generates output" do
30
+ filter = setup_filter HandlebarsFilter.new
31
+
32
+ filter.output_files.should == [output_file("test.js")]
33
+
34
+ tasks = filter.generate_rake_tasks
35
+ tasks.each(&:invoke)
36
+
37
+ file = MemoryFileWrapper.files["/path/to/output/test.js"]
38
+ file.body.should == expected_output
39
+ file.encoding.should == "UTF-8"
40
+ end
41
+
42
+ describe "naming output files" do
43
+ it "translates .handlebars extensions to .js by default" do
44
+ filter = setup_filter HandlebarsFilter.new, "test.handlebars"
45
+ filter.output_files.first.path.should == "test.js"
46
+ end
47
+
48
+ it "translates .hbs extensions to .js by default" do
49
+ filter = setup_filter HandlebarsFilter.new, "test.hbs"
50
+ filter.output_files.first.path.should == "test.js"
51
+ end
52
+
53
+ it "accepts a block to customize output file names" do
54
+ filter = setup_filter(HandlebarsFilter.new { |input| "squid" })
55
+ filter.output_files.first.path.should == "squid"
56
+ end
57
+ end
58
+
59
+ describe "options" do
60
+ it "should allow an option to name the key" do
61
+ filter = setup_filter(HandlebarsFilter.new(:key_name_proc => proc { |input| "new_name_key" }))
62
+
63
+ tasks = filter.generate_rake_tasks
64
+ tasks.each(&:invoke)
65
+
66
+ file = MemoryFileWrapper.files["/path/to/output/test.js"]
67
+ file.body.should =~ /^Ember\.TEMPLATES\['new_name_key'\]/
68
+ end
69
+ end
70
+ end
@@ -1,32 +1,17 @@
1
1
  require "rake-pipeline-web-filters/helpers"
2
2
 
3
3
  describe "Helpers" do
4
-
5
4
  let(:pipeline) { Rake::Pipeline.new }
6
- let(:dsl) { Rake::Pipeline::DSL.new(pipeline) }
5
+ let(:dsl) { Rake::Pipeline::DSL::PipelineDSL.new(pipeline) }
7
6
 
8
7
  before do
9
- pipeline.input_root = "."
8
+ pipeline.add_input '.'
10
9
  end
11
10
 
12
11
  def filter
13
12
  pipeline.filters.last
14
13
  end
15
14
 
16
- describe "#concat" do
17
- it "creates a ConcatFilter" do
18
- dsl.concat "octopus"
19
- filter.should be_kind_of(Rake::Pipeline::ConcatFilter)
20
- end
21
-
22
- context "passed an Array first argument" do
23
- it "creates an OrderingConcatFilter" do
24
- dsl.concat ["octopus"]
25
- filter.should be_kind_of(Rake::Pipeline::Web::Filters::OrderingConcatFilter)
26
- end
27
- end
28
- end
29
-
30
15
  describe "#minispade" do
31
16
  it "creates a MinispadeFilter" do
32
17
  dsl.minispade
@@ -37,7 +22,14 @@ describe "Helpers" do
37
22
  describe "#sass" do
38
23
  it "creates a SassCompiler" do
39
24
  dsl.sass
40
- filter.should be_kind_of(Rake::Pipeline::Web::Filters::SassCompiler)
25
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::SassFilter)
26
+ end
27
+ end
28
+
29
+ describe "#stylus" do
30
+ it "creates a StylusCompiler" do
31
+ dsl.stylus
32
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::StylusFilter)
41
33
  end
42
34
  end
43
35
 
@@ -47,4 +39,106 @@ describe "Helpers" do
47
39
  filter.should be_kind_of(Rake::Pipeline::Web::Filters::TiltFilter)
48
40
  end
49
41
  end
42
+
43
+ describe "#markdown" do
44
+ it "creates a MarkdownCompiler" do
45
+ dsl.markdown
46
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::MarkdownFilter)
47
+ end
48
+ end
49
+
50
+ describe "#cache_buster" do
51
+ it "creates a CacheBuster" do
52
+ dsl.cache_buster
53
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::CacheBusterFilter)
54
+ end
55
+ end
56
+
57
+ describe "#coffee_script" do
58
+ it "creates a CoffeeScriptCompiler" do
59
+ dsl.coffee_script
60
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::CoffeeScriptFilter)
61
+ end
62
+ end
63
+
64
+ describe "#yui_javascript" do
65
+ it "creates a YUIJavaScriptCompressor" do
66
+ dsl.yui_javascript
67
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::YUIJavaScriptFilter)
68
+ end
69
+ end
70
+
71
+ describe "#yui_css" do
72
+ it "creates a YUICssCompressor" do
73
+ dsl.yui_css
74
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::YUICssFilter)
75
+ end
76
+ end
77
+
78
+ describe "#uglify" do
79
+ it "creates an UglifyFilter" do
80
+ dsl.uglify
81
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::UglifyFilter)
82
+ end
83
+ end
84
+
85
+ describe "#less" do
86
+ it "creates a LessFilter" do
87
+ dsl.less
88
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::LessFilter)
89
+ end
90
+ end
91
+
92
+ describe "#gzip" do
93
+ it "creates a GzipFilter" do
94
+ dsl.gzip
95
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::GzipFilter)
96
+ end
97
+ end
98
+
99
+ describe "#handlebars" do
100
+ it "creates a HandlebarsFilter" do
101
+ dsl.handlebars
102
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::HandlebarsFilter)
103
+ end
104
+ end
105
+
106
+ describe "#iffe" do
107
+ it "creates a IifeFilter" do
108
+ dsl.iife
109
+ filter.should be_kind_of(Rake::Pipeline::Web::Filters::IifeFilter)
110
+ end
111
+ end
112
+ end
113
+
114
+ describe "ProjectHelpers" do
115
+ def project
116
+ @project ||= Rake::Pipeline::Project.new
117
+ end
118
+
119
+ def dsl
120
+ @dsl ||= Rake::Pipeline::DSL::ProjectDSL.new(project)
121
+ end
122
+
123
+ describe "register" do
124
+ it "registers filters per file name" do
125
+ dsl.register :coffee, Rake::Pipeline::Web::Filters::CoffeeScriptFilter
126
+ dsl.register :handlebars, Rake::Pipeline::Web::Filters::HandlebarsFilter
127
+
128
+ dsl.input "lib" do
129
+ concat "lib.js"
130
+ end
131
+
132
+ dsl.input "tests" do
133
+ concat "tests.js"
134
+ end
135
+
136
+ project.pipelines.size.should == 2
137
+
138
+ project.pipelines.each do |pipeline|
139
+ pipeline.filters.first.should be_kind_of Rake::Pipeline::Web::Filters::ChainedFilter
140
+ pipeline.filters.first.filters.keys.should == [:coffee, :handlebars]
141
+ end
142
+ end
143
+ end
50
144
  end
@@ -0,0 +1,55 @@
1
+ describe "IifeFilter" do
2
+ IifeFilter ||= Rake::Pipeline::Web::Filters::IifeFilter
3
+ MemoryFileWrapper ||= Rake::Pipeline::SpecHelpers::MemoryFileWrapper
4
+
5
+ let(:js_input) { <<-HERE }
6
+ var name = "Truckasaurus Gates";
7
+ HERE
8
+
9
+ let(:expected_js_output) { <<-HERE }
10
+ (function() {
11
+ var name = "Truckasaurus Gates";
12
+ })();
13
+ HERE
14
+
15
+ def input_file(name, content)
16
+ MemoryFileWrapper.new("/path/to/input", name, "UTF-8", content)
17
+ end
18
+
19
+ def output_file(name)
20
+ MemoryFileWrapper.new("/path/to/output", name, "UTF-8")
21
+ end
22
+
23
+ def setup_filter(filter)
24
+ filter.file_wrapper_class = MemoryFileWrapper
25
+ filter.input_files = [input_file("name.js", js_input)]
26
+ filter.output_root = "/path/to/output"
27
+ filter.rake_application = Rake::Application.new
28
+ filter
29
+ end
30
+
31
+ it "generates output" do
32
+ filter = setup_filter IifeFilter.new
33
+
34
+ filter.output_files.should == [output_file("name.js")]
35
+
36
+ tasks = filter.generate_rake_tasks
37
+ tasks.each(&:invoke)
38
+
39
+ file = MemoryFileWrapper.files["/path/to/output/name.js"]
40
+ file.body.should == expected_js_output.chomp
41
+ file.encoding.should == "UTF-8"
42
+ end
43
+
44
+ describe "naming output files" do
45
+ it "translates .js extensions to .min.js by default" do
46
+ filter = setup_filter IifeFilter.new
47
+ filter.output_files.first.path.should == "name.js"
48
+ end
49
+
50
+ it "accepts a block to customize output file names" do
51
+ filter = setup_filter(IifeFilter.new { |input| "octopus" })
52
+ filter.output_files.first.path.should == "octopus"
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,59 @@
1
+ describe "LessFilter" do
2
+ LessFilter ||= Rake::Pipeline::Web::Filters::LessFilter
3
+ MemoryFileWrapper ||= Rake::Pipeline::SpecHelpers::MemoryFileWrapper
4
+
5
+ let(:less_input) { <<-SCSS }
6
+ @blue: #3bbfce;
7
+
8
+ .border {
9
+ border-color: @blue;
10
+ }
11
+ SCSS
12
+
13
+ let(:expected_css_output) { <<-CSS }
14
+ .border {
15
+ border-color: #3bbfce;
16
+ }
17
+ CSS
18
+
19
+ def input_file(name, content)
20
+ MemoryFileWrapper.new("/path/to/input", name, "UTF-8", content)
21
+ end
22
+
23
+ def output_file(name)
24
+ MemoryFileWrapper.new("/path/to/output", name, "UTF-8")
25
+ end
26
+
27
+ def setup_filter(filter)
28
+ filter.file_wrapper_class = MemoryFileWrapper
29
+ filter.input_files = [input_file("border.less", less_input)]
30
+ filter.output_root = "/path/to/output"
31
+ filter.rake_application = Rake::Application.new
32
+ filter
33
+ end
34
+
35
+ it "generates output" do
36
+ filter = setup_filter LessFilter.new
37
+
38
+ filter.output_files.should == [output_file("border.css")]
39
+
40
+ tasks = filter.generate_rake_tasks
41
+ tasks.each(&:invoke)
42
+
43
+ file = MemoryFileWrapper.files["/path/to/output/border.css"]
44
+ file.body.should == expected_css_output
45
+ file.encoding.should == "UTF-8"
46
+ end
47
+
48
+ describe "naming output files" do
49
+ it "translates .less extensions to .css by default" do
50
+ filter = setup_filter LessFilter.new
51
+ filter.output_files.first.path.should == "border.css"
52
+ end
53
+
54
+ it "accepts a block to customize output file names" do
55
+ filter = setup_filter(LessFilter.new { |input| "octopus" })
56
+ filter.output_files.first.path.should == "octopus"
57
+ end
58
+ end
59
+ end