From 0ce7ebf7ff1b670ebc2289686c20ab5d6abb2b6c Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Sun, 18 Dec 2011 23:06:49 -0800 Subject: [PATCH] Add the CoffeeScript compiler and clean up some specs --- lib/rake-pipeline-web-filters.rb | 1 + .../coffee_script_compiler.rb | 26 ++++++++ rake-pipeline-web-filters.gemspec | 1 + spec/coffee_filter_spec.rb | 62 +++++++++++++++++++ spec/markdown_compiler_spec.rb | 1 - spec/minispade_filter_spec.rb | 2 - spec/ordering_concat_filter_spec.rb | 2 - spec/sass_compiler_spec.rb | 1 - spec/spec_helper.rb | 1 + spec/tilt_filter_spec.rb | 2 - 10 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 lib/rake-pipeline-web-filters/coffee_script_compiler.rb create mode 100644 spec/coffee_filter_spec.rb diff --git a/lib/rake-pipeline-web-filters.rb b/lib/rake-pipeline-web-filters.rb index 3d6ca10..34bc7ef 100644 --- a/lib/rake-pipeline-web-filters.rb +++ b/lib/rake-pipeline-web-filters.rb @@ -17,5 +17,6 @@ module Filters require "rake-pipeline-web-filters/ordering_concat_filter" require "rake-pipeline-web-filters/sass_compiler" require "rake-pipeline-web-filters/tilt_filter" +require "rake-pipeline-web-filters/coffee_script_compiler" require "rake-pipeline-web-filters/helpers" diff --git a/lib/rake-pipeline-web-filters/coffee_script_compiler.rb b/lib/rake-pipeline-web-filters/coffee_script_compiler.rb new file mode 100644 index 0000000..076d886 --- /dev/null +++ b/lib/rake-pipeline-web-filters/coffee_script_compiler.rb @@ -0,0 +1,26 @@ +module Rake::Pipeline::Web::Filters + # A filter that compiles CoffeeScript to JavaScript. + class CoffeeScriptCompiler < Rake::Pipeline::Filter + # By default, the CoffeeScriptCompiler converts inputs + # with the extension +.coffee+ to +.js+. + # + # @param [Proc] block the output name generator block + def initialize(&block) + block ||= proc { |input| input.sub(/\.coffee$/, '.js') } + super(&block) + end + + # The body of the filter. Compile each input file into + # a CoffeeScript compiled output file. + # + # @param [Array] inputs an Array of FileWrapper objects. + # @param [FileWrapper] output a FileWrapper object + def generate_output(inputs, output) + require "coffee-script" + + inputs.each do |input| + output.write CoffeeScript.compile(input) + end + end + end +end diff --git a/rake-pipeline-web-filters.gemspec b/rake-pipeline-web-filters.gemspec index 5e19f91..95f1ba4 100644 --- a/rake-pipeline-web-filters.gemspec +++ b/rake-pipeline-web-filters.gemspec @@ -21,5 +21,6 @@ Gem::Specification.new do |gem| gem.add_development_dependency "tilt" gem.add_development_dependency "sass" gem.add_development_dependency "compass" + gem.add_development_dependency "coffee-script" gem.add_development_dependency "redcarpet", '~> 2.0' end diff --git a/spec/coffee_filter_spec.rb b/spec/coffee_filter_spec.rb new file mode 100644 index 0000000..d70b4b5 --- /dev/null +++ b/spec/coffee_filter_spec.rb @@ -0,0 +1,62 @@ +describe "CoffeeScriptCompiler" do + CoffeeScriptCompiler = Rake::Pipeline::Web::Filters::CoffeeScriptCompiler + + COFFEE_INPUT = <<-COFFEE +x = 1; + +y = -> + x += 1 + COFFEE + + EXPECTED_COFFEE_OUTPUT = <<-HTML +(function() { + var x, y; + x = 1; + y = function() { + return x += 1; + }; +}).call(this); + HTML + + def input_file(name, content) + MemoryFileWrapper.new("/path/to/input", name, "UTF-8", content) + end + + def output_file(name) + MemoryFileWrapper.new("/path/to/output", name, "UTF-8") + end + + def setup_filter(filter) + filter.file_wrapper_class = MemoryFileWrapper + filter.input_files = [input_file("input.coffee", COFFEE_INPUT)] + filter.output_root = "/path/to/output" + filter.rake_application = Rake::Application.new + filter + end + + it "generates output" do + filter = setup_filter CoffeeScriptCompiler.new + + filter.output_files.should == [output_file("input.js")] + + tasks = filter.generate_rake_tasks + tasks.each(&:invoke) + + file = MemoryFileWrapper.files["/path/to/output/input.js"] + file.body.should == EXPECTED_COFFEE_OUTPUT + file.encoding.should == "UTF-8" + end + + describe "naming output files" do + it "translates .coffee extensions to .js by default" do + filter = setup_filter CoffeeScriptCompiler.new + filter.output_files.first.path.should == "input.js" + end + + it "accepts a block to customize output file names" do + filter = setup_filter(CoffeeScriptCompiler.new { |input| "octopus" }) + filter.output_files.first.path.should == "octopus" + end + end +end + diff --git a/spec/markdown_compiler_spec.rb b/spec/markdown_compiler_spec.rb index 66fef5e..b191024 100644 --- a/spec/markdown_compiler_spec.rb +++ b/spec/markdown_compiler_spec.rb @@ -1,5 +1,4 @@ describe "MarkdownCompiler" do - MemoryFileWrapper = Rake::Pipeline::SpecHelpers::MemoryFileWrapper MarkdownCompiler = Rake::Pipeline::Web::Filters::MarkdownCompiler MARKDOWN_INPUT = <<-MARKDOWN diff --git a/spec/minispade_filter_spec.rb b/spec/minispade_filter_spec.rb index 8698ff2..1a4aee8 100644 --- a/spec/minispade_filter_spec.rb +++ b/spec/minispade_filter_spec.rb @@ -1,6 +1,4 @@ describe "MinispadeFilter" do - MemoryFileWrapper = Rake::Pipeline::SpecHelpers::MemoryFileWrapper - let(:input_files) { [ MemoryFileWrapper.new("/path/to/input", "foo.js", "UTF-8", "var foo = 'bar';") diff --git a/spec/ordering_concat_filter_spec.rb b/spec/ordering_concat_filter_spec.rb index a853702..7fb98a1 100644 --- a/spec/ordering_concat_filter_spec.rb +++ b/spec/ordering_concat_filter_spec.rb @@ -1,6 +1,4 @@ describe "OrderingConcatFilter" do - MemoryFileWrapper = Rake::Pipeline::SpecHelpers::MemoryFileWrapper - let(:input_files) { [ MemoryFileWrapper.new("/path/to/input", "first.txt", "UTF-8", "FIRST"), diff --git a/spec/sass_compiler_spec.rb b/spec/sass_compiler_spec.rb index 9474f3d..66e3183 100644 --- a/spec/sass_compiler_spec.rb +++ b/spec/sass_compiler_spec.rb @@ -1,5 +1,4 @@ describe "SassCompiler" do - MemoryFileWrapper = Rake::Pipeline::SpecHelpers::MemoryFileWrapper SassCompiler = Rake::Pipeline::Web::Filters::SassCompiler SCSS_INPUT = <<-SCSS diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index f45b605..bf27682 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -62,6 +62,7 @@ def age_existing_files module Filters ConcatFilter = Rake::Pipeline::ConcatFilter + MemoryFileWrapper = Rake::Pipeline::SpecHelpers::MemoryFileWrapper class StripAssertsFilter < Rake::Pipeline::Filter def generate_output(inputs, output) diff --git a/spec/tilt_filter_spec.rb b/spec/tilt_filter_spec.rb index 571b5ce..0633c5a 100644 --- a/spec/tilt_filter_spec.rb +++ b/spec/tilt_filter_spec.rb @@ -1,6 +1,4 @@ describe "TiltFilter" do - MemoryFileWrapper = Rake::Pipeline::SpecHelpers::MemoryFileWrapper - let(:input_files) { [ MemoryFileWrapper.new("/path/to/input", "foo.erb", "UTF-8", "<%= 'foo' %>\n"),