deal with a coffeescript file

This commit is contained in:
John Bintz 2012-01-30 11:34:57 -05:00
parent fb5018148f
commit 9829c40730
20 changed files with 195 additions and 10 deletions

2
.gitignore vendored
View File

@ -16,3 +16,5 @@ test/tmp
test/version_tmp
tmp
rerun.txt
.tmp/
template.erb

View File

@ -10,6 +10,7 @@ Feature: Process files with Sprockets
another file
"""
@fakefs
Scenario: Simple Sprockets work
When I instantiate a Sprockets handler with the following asset directories:
| dir |
@ -18,6 +19,7 @@ Feature: Process files with Sprockets
| dir/other.js |
| dir/file.js |
@fakefs
Scenario: Require the file twice
Given I have the file "dir/third.js" with the content:
"""
@ -33,3 +35,18 @@ Feature: Process files with Sprockets
| dir/file.js |
| dir/third.js |
@realfs
Scenario: A CoffeeScript file
Given I have the file "dir/third.js.coffee" with the content:
"""
#= require other
for file in [ 'files' ]
alert(file)
"""
When I instantiate a Sprockets handler with the following asset directories:
| dir |
And I work with the Sprockets asset "third"
Then the handler should have the following files in order:
| dir/other.js |
| <%= temp_path_for("dir/third.js.coffee") %> |
And there should be a temp file for the local path "dir/third.js.coffee"

View File

@ -0,0 +1,3 @@
Given /^I have a CoffeeScript template processor for the file "([^"]*)"$/ do |file|
@template_processor = Flowerbox::Delivery::Tilt::CoffeeTemplate.new(file)
end

View File

@ -3,3 +3,4 @@ Given /^I have the file "([^"]*)" with the content:$/ do |filename, string|
File.open(filename, 'wb') { |fh| fh.print(string) }
end

View File

@ -1,5 +1,9 @@
require 'erb'
Then /^the handler should have the following files in order:$/ do |table|
table.raw.collect(&:first).each_with_index do |path, index|
table.raw.flatten.each_with_index do |path, index|
path = ERB.new(path).result(binding)
@sprockets.files[index].should == Pathname(File.expand_path(path))
end
end

View File

@ -0,0 +1,7 @@
Then /^there should be a temp file for the local path "([^"]*)"$/ do |path|
path.gsub!(%r{\.js.*$}, '.js')
@temp_file_path = Dir[".tmp/**/#{path}"].first
@temp_file_path.should_not be_nil
end

View File

@ -0,0 +1,7 @@
Then /^the temp file should contain:$/ do |string|
file_lines = File.read(@temp_file_path).lines.collect(&:strip)
string.lines.each do |line|
file_lines.should include(line.strip)
end
end

View File

@ -0,0 +1,3 @@
Then /^the evaluated template should be the path to the temp file for "([^"]*)"$/ do |file|
@temp_file_path.should == @result
end

View File

@ -0,0 +1,3 @@
When /^I evaluate the template$/ do
@result = @template_processor.render
end

View File

@ -11,10 +11,14 @@ class FakeFS::File::Stat
end
end
class FakeFS::File
def self.executable?(file)
false
end
end
Before do
mocha_setup
FakeFS.activate!
end
After do
@ -24,8 +28,6 @@ After do
mocha_teardown
end
FakeFS.deactivate!
if @running_server
@running_server[:server].shutdown
@running_server = nil
@ -35,3 +37,24 @@ After do
@server.stop if @server
end
def temp_path_for(file)
File.join('.tmp/sprockets', File.expand_path(file.gsub(%r{\.js.*$}, '.js')))
end
Before('@fakefs') do
FakeFS.activate!
end
After('@fakefs') do
FakeFS::FileSystem.clear
FakeFS.deactivate!
end
Before('@realfs') do
FileUtils.rm_rf 'dir'
end
After('@realfs') do
FileUtils.rm_rf 'dir'
end

View File

@ -21,6 +21,7 @@ Gem::Specification.new do |gem|
gem.add_development_dependency 'mocha'
gem.add_development_dependency 'fakefs'
gem.add_development_dependency 'nokogiri'
gem.add_development_dependency 'therubyracer'
gem.add_runtime_dependency 'rack'
gem.add_runtime_dependency 'sprockets'

View File

@ -4,6 +4,8 @@ module Flowerbox
autoload :TemplateRenderer, 'flowerbox/delivery/template_renderer'
autoload :SprocketsHandler, 'flowerbox/delivery/sprockets_handler'
autoload :UniqueAssetList, 'flowerbox/delivery/unique_asset_list'
autoload :Tilt, 'flowerbox/delivery/tilt'
end
end

View File

@ -11,7 +11,7 @@ module Flowerbox::Delivery
end
def add(asset)
@files.add(paths_for(asset))
paths_for(asset).each { |path| @files.add(path_for_compiled_asset(path)) }
end
def paths_for(asset)
@ -22,8 +22,19 @@ module Flowerbox::Delivery
return @environment if @environment
@environment = Sprockets::Environment.new
@environment.unregister_postprocessor('application/javascript', Sprockets::SafetyColons)
@environment.register_engine('.js', Flowerbox::Delivery::Tilt::JSTemplate)
options[:asset_paths].each { |path| @environment.append_path(path) }
@environment
end
def asset_for(*args)
environment.find_asset(*args)
end
def path_for_compiled_asset(path)
Pathname(asset_for(path, :bundle => false).to_s)
end
end
end

View File

@ -0,0 +1,6 @@
require 'sprockets'
module Flowerbox::Delivery::Tilt
autoload :JSTemplate, 'flowerbox/delivery/tilt/js_template'
end

View File

@ -0,0 +1,28 @@
require 'tilt'
class Flowerbox::Delivery::Tilt::JSTemplate < Tilt::Template
self.default_mime_type = "application/javascript"
def prepare ; end
def evaluate(scope, locals, &block)
case File.extname(file)
when '.js'
file
else
save
end
end
def save
FileUtils.mkdir_p File.dirname(temp_file)
File.open(temp_file, 'wb') { |fh| fh.print data }
temp_file
end
def temp_file
File.join(Dir.pwd, ".tmp/sprockets", file.gsub(%r{(\.js)(.*)$}, '\1'))
end
end

View File

@ -1,7 +1,7 @@
module Flowerbox::Delivery
class UniqueAssetList < ::Array
def add(files)
files.each { |file| self << file if !include?(file) }
[ files ].flatten.each { |file| self << file if !include?(file) }
end
private

View File

@ -7,16 +7,20 @@ describe Flowerbox::Delivery::SprocketsHandler do
describe '#add' do
let(:asset) { 'asset' }
let(:paths) { [ 'paths' ] }
let(:path) { 'path' }
let(:paths) { [ path ] }
let(:pathname_path) { 'pathname path' }
before do
sprockets_handler.expects(:paths_for).with(asset).returns(paths)
sprockets_handler.expects(:path_for_compiled_asset).with(path).returns(pathname_path)
end
it 'should add the asset to the list of ones to work with' do
sprockets_handler.add(asset)
sprockets_handler.files.should == paths
sprockets_handler.files.should == [ pathname_path ]
end
end

View File

@ -0,0 +1,62 @@
require 'spec_helper'
describe Flowerbox::Delivery::Tilt::JSTemplate do
let(:js_template) { described_class.new { '' } }
describe '#evaluate' do
subject { js_template.evaluate(Object.new, {}) }
before do
js_template.stubs(:file).returns(file)
end
context '.js' do
let(:file) { 'file.js' }
it { should == file }
end
context 'other extension' do
let(:file) { 'file.coffee' }
let(:temp_file) { 'temp file' }
before do
js_template.expects(:save).returns(temp_file)
end
it { should == temp_file }
end
end
describe '#save' do
include FakeFS::SpecHelpers
let(:temp_file) { 'dir/temp file' }
let(:data) { 'data' }
before do
js_template.stubs(:temp_file).returns(temp_file)
js_template.stubs(:data).returns(data)
end
it 'should save the file to disk and return the temp path' do
js_template.save.should == temp_file
File.read(temp_file).should == data
end
end
describe '#temp_file' do
subject { js_template.temp_file }
let(:filename) { "#{root_filename}.ext" }
let(:root_filename) { "dir/file.js" }
before do
js_template.stubs(:file).returns(filename)
end
it { should == File.join(Dir.pwd, '.tmp/sprockets', root_filename) }
end
end

View File

@ -9,7 +9,8 @@ describe Flowerbox::Delivery::UniqueAssetList do
let(:third) { Pathname.new('two') }
it 'should not add assets already added' do
unique_asset_list.add([ first, second, third ])
unique_asset_list.add(first)
unique_asset_list.add([ second, third ])
unique_asset_list.should == [ first, third ]
end