factor out file list management
This commit is contained in:
parent
7c8f4c0e4e
commit
c32f13fbe1
1
Gemfile
1
Gemfile
@ -11,3 +11,4 @@ gem 'guard-shell'
|
|||||||
gem 'guard-coffeescript'
|
gem 'guard-coffeescript'
|
||||||
gem 'growl'
|
gem 'growl'
|
||||||
gem 'rake', '0.8.7'
|
gem 'rake', '0.8.7'
|
||||||
|
gem 'mocha'
|
||||||
|
@ -9,7 +9,7 @@ end
|
|||||||
# A sample Guardfile
|
# A sample Guardfile
|
||||||
# More info at https://github.com/guard/guard#readme
|
# More info at https://github.com/guard/guard#readme
|
||||||
|
|
||||||
guard 'rspec', :version => 2 do
|
guard 'rspec', :version => 2, :all_on_start => false do
|
||||||
watch(%r{^spec/.+_spec\.rb})
|
watch(%r{^spec/.+_spec\.rb})
|
||||||
watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
||||||
watch(%r{^bin/(.+)}) { |m| "spec/bin/#{m[1]}_spec.rb" }
|
watch(%r{^bin/(.+)}) { |m| "spec/bin/#{m[1]}_spec.rb" }
|
||||||
|
@ -17,6 +17,7 @@ require 'coffee-script'
|
|||||||
require 'rainbow'
|
require 'rainbow'
|
||||||
|
|
||||||
require 'jasmine/cli'
|
require 'jasmine/cli'
|
||||||
|
require 'jasmine/files_list'
|
||||||
include Jasmine::CLI
|
include Jasmine::CLI
|
||||||
|
|
||||||
if !File.file?(File.join(gem_dir, RUNNER))
|
if !File.file?(File.join(gem_dir, RUNNER))
|
||||||
@ -58,50 +59,15 @@ options = {
|
|||||||
|
|
||||||
read_defaults_files!
|
read_defaults_files!
|
||||||
opts.each(&@process_options)
|
opts.each(&@process_options)
|
||||||
@spec_filter = ARGV.dup
|
|
||||||
|
|
||||||
data = YAML.load_file(options[:jasmine_config])
|
|
||||||
|
|
||||||
puts "Running Jasmine specs..."
|
puts "Running Jasmine specs..."
|
||||||
|
|
||||||
files = %w{jasmine jasmine-html}.collect { |name| File.join(Jasmine.root, "lib/#{name}.js") }
|
files_list = Jasmine::FilesList.new(
|
||||||
files << File.join(gem_dir, 'jasmine/jasmine.headless-reporter.js')
|
:config => load_config(options[:jasmine_config]),
|
||||||
|
:only => ARGV.dup
|
||||||
|
)
|
||||||
|
|
||||||
[ [ 'src_files', 'src_dir' ], [ 'stylesheets', 'src_dir' ], [ 'helpers', 'spec_dir' ], [ 'spec_files', 'spec_dir' ] ].each do |searches, root|
|
output = jasmine_html_template(files_list.files_to_html)
|
||||||
if data[searches] ||= DEFAULTS[searches]
|
|
||||||
data[root] ||= DEFAULTS[root]
|
|
||||||
|
|
||||||
data[searches].collect do |search|
|
|
||||||
path = search
|
|
||||||
path = File.join(data[root], path) if data[root]
|
|
||||||
found_files = Dir[path]
|
|
||||||
if searches == 'spec_files'
|
|
||||||
found_files = found_files.find_all { |file| use_spec?(file) }
|
|
||||||
end
|
|
||||||
files += found_files
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
files = files.collect { |file|
|
|
||||||
case File.extname(file)
|
|
||||||
when '.js'
|
|
||||||
%{<script type="text/javascript" src="#{file}"></script>}
|
|
||||||
when '.coffee'
|
|
||||||
begin
|
|
||||||
%{<script type="text/javascript">#{CoffeeScript.compile(fh = File.open(file))}</script>}
|
|
||||||
rescue CoffeeScript::CompilationError => e
|
|
||||||
puts "[%s] %s: %s" % [ 'coffeescript'.color(:red), file.color(:yellow), e.message.to_s.color(:white) ]
|
|
||||||
exit 1
|
|
||||||
ensure
|
|
||||||
fh.close
|
|
||||||
end
|
|
||||||
when '.css'
|
|
||||||
%{<link rel="stylesheet" href="#{file}" type="text/css" />}
|
|
||||||
end
|
|
||||||
}
|
|
||||||
|
|
||||||
output = jasmine_html_template(files)
|
|
||||||
|
|
||||||
File.open(target = "specrunner.#{$$}.html", 'w') { |fh| fh.print output }
|
File.open(target = "specrunner.#{$$}.html", 'w') { |fh| fh.print output }
|
||||||
system jasmine_command(options, target)
|
system jasmine_command(options, target)
|
||||||
|
@ -13,6 +13,10 @@ module Jasmine
|
|||||||
DEFAULTS_FILE = '.jasmine-headless-webkit'
|
DEFAULTS_FILE = '.jasmine-headless-webkit'
|
||||||
GLOBAL_DEFAULTS_FILE = File.expand_path("~/#{DEFAULTS_FILE}")
|
GLOBAL_DEFAULTS_FILE = File.expand_path("~/#{DEFAULTS_FILE}")
|
||||||
|
|
||||||
|
def load_config(file)
|
||||||
|
process_jasmine_config(YAML.load_file(file))
|
||||||
|
end
|
||||||
|
|
||||||
def process_jasmine_config(overrides = {})
|
def process_jasmine_config(overrides = {})
|
||||||
DEFAULTS.merge(overrides)
|
DEFAULTS.merge(overrides)
|
||||||
end
|
end
|
||||||
@ -25,10 +29,6 @@ module Jasmine
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def use_spec?(file)
|
|
||||||
@spec_filter.empty? || @spec_filter.include?(file)
|
|
||||||
end
|
|
||||||
|
|
||||||
def jasmine_html_template(files)
|
def jasmine_html_template(files)
|
||||||
<<-HTML
|
<<-HTML
|
||||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||||
|
75
lib/jasmine/files_list.rb
Normal file
75
lib/jasmine/files_list.rb
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
require 'jasmine'
|
||||||
|
|
||||||
|
module Jasmine
|
||||||
|
class FilesList
|
||||||
|
attr_reader :files, :filtered_files
|
||||||
|
|
||||||
|
DEFAULT_FILES = [
|
||||||
|
File.join(Jasmine.root, "lib/jasmine.js"),
|
||||||
|
File.join(Jasmine.root, "lib/jasmine-html.js"),
|
||||||
|
File.expand_path('../../../jasmine/jasmine.headless-reporter.js', __FILE__)
|
||||||
|
]
|
||||||
|
|
||||||
|
def initialize(options = {})
|
||||||
|
@options = options
|
||||||
|
@files = DEFAULT_FILES
|
||||||
|
use_config! if config?
|
||||||
|
end
|
||||||
|
|
||||||
|
def use_spec?(file)
|
||||||
|
spec_filter.empty? || spec_filter.include?(file)
|
||||||
|
end
|
||||||
|
|
||||||
|
def files_to_html
|
||||||
|
files.collect { |file|
|
||||||
|
case File.extname(file)
|
||||||
|
when '.js'
|
||||||
|
%{<script type="text/javascript" src="#{file}"></script>}
|
||||||
|
when '.coffee'
|
||||||
|
begin
|
||||||
|
%{<script type="text/javascript">#{CoffeeScript.compile(fh = File.open(file))}</script>}
|
||||||
|
rescue CoffeeScript::CompilationError => e
|
||||||
|
puts "[%s] %s: %s" % [ 'coffeescript'.color(:red), file.color(:yellow), e.message.to_s.color(:white) ]
|
||||||
|
exit 1
|
||||||
|
ensure
|
||||||
|
fh.close
|
||||||
|
end
|
||||||
|
when '.css'
|
||||||
|
%{<link rel="stylesheet" href="#{file}" type="text/css" />}
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def spec_filter
|
||||||
|
@options[:only] || []
|
||||||
|
end
|
||||||
|
|
||||||
|
def use_config!
|
||||||
|
@filtered_files = @files.dup
|
||||||
|
|
||||||
|
data = @options[:config].dup
|
||||||
|
[ [ 'src_files', 'src_dir' ], [ 'stylesheets', 'src_dir' ], [ 'helpers', 'spec_dir' ], [ 'spec_files', 'spec_dir' ] ].each do |searches, root|
|
||||||
|
if data[searches]
|
||||||
|
data[searches].collect do |search|
|
||||||
|
path = search
|
||||||
|
path = File.join(data[root], path) if data[root]
|
||||||
|
found_files = Dir[path]
|
||||||
|
|
||||||
|
@files += found_files
|
||||||
|
|
||||||
|
if searches == 'spec_files'
|
||||||
|
found_files = found_files.find_all { |file| use_spec?(file) }
|
||||||
|
end
|
||||||
|
@filtered_files += found_files
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def config?
|
||||||
|
@options[:config]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -58,32 +58,4 @@ describe Jasmine::CLI do
|
|||||||
all_data.should == [ global_test_data, test_data ]
|
all_data.should == [ global_test_data, test_data ]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#use_spec?' do
|
|
||||||
let(:spec_file) { 'my/spec.js' }
|
|
||||||
|
|
||||||
context 'no filter provided' do
|
|
||||||
before do
|
|
||||||
@spec_filter = []
|
|
||||||
end
|
|
||||||
|
|
||||||
it "should allow the spec" do
|
|
||||||
use_spec?(spec_file).should be_true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'filter provided' do
|
|
||||||
before do
|
|
||||||
@spec_filter = [ spec_file ]
|
|
||||||
end
|
|
||||||
|
|
||||||
it "should use the spec" do
|
|
||||||
use_spec?(spec_file).should be_true
|
|
||||||
end
|
|
||||||
|
|
||||||
it "should not use the spec" do
|
|
||||||
use_spec?('other/file').should be_false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
141
spec/lib/jasmine/files_list_spec.rb
Normal file
141
spec/lib/jasmine/files_list_spec.rb
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
require 'spec_helper'
|
||||||
|
require 'jasmine/files_list'
|
||||||
|
require 'fakefs/spec_helpers'
|
||||||
|
require 'coffee-script'
|
||||||
|
|
||||||
|
describe Jasmine::FilesList do
|
||||||
|
let(:files_list) { Jasmine::FilesList.new }
|
||||||
|
|
||||||
|
describe '#initialize' do
|
||||||
|
it "should have default files" do
|
||||||
|
files_list.files.should == [
|
||||||
|
File.join(Jasmine.root, "lib/jasmine.js"),
|
||||||
|
File.join(Jasmine.root, "lib/jasmine-html.js"),
|
||||||
|
File.expand_path('jasmine/jasmine.headless-reporter.js')
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#use_config' do
|
||||||
|
let(:files_list) { Jasmine::FilesList.new(:config => config) }
|
||||||
|
|
||||||
|
include FakeFS::SpecHelpers
|
||||||
|
|
||||||
|
let(:src_dir) { 'src' }
|
||||||
|
let(:spec_dir) { 'spec' }
|
||||||
|
|
||||||
|
let(:src_file) { File.join(src_dir, 'js/src_file.js') }
|
||||||
|
let(:spec_file) { File.join(spec_dir, 'spec_file_spec.js') }
|
||||||
|
let(:helper_file) { File.join(spec_dir, 'helper/helper_file.js') }
|
||||||
|
let(:stylesheet_file) { File.join(src_dir, 'stylesheet/blah.css') }
|
||||||
|
|
||||||
|
before do
|
||||||
|
[ src_file, spec_file, helper_file, stylesheet_file ].each do |file|
|
||||||
|
File.open(file, 'w')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:config) { {
|
||||||
|
'src_dir' => src_dir,
|
||||||
|
'spec_dir' => spec_dir,
|
||||||
|
'src_files' => [ 'js/*.js' ],
|
||||||
|
'spec_files' => [ '*_spec.js' ],
|
||||||
|
'helpers' => [ 'helper/*.js' ],
|
||||||
|
'stylesheets' => [ 'stylesheet/*.css' ]
|
||||||
|
} }
|
||||||
|
|
||||||
|
it 'should read the data from the jasmine.yml file and add the files' do
|
||||||
|
files_list.files.should == Jasmine::FilesList::DEFAULT_FILES + [
|
||||||
|
File.expand_path(src_file),
|
||||||
|
File.expand_path(stylesheet_file),
|
||||||
|
File.expand_path(helper_file),
|
||||||
|
File.expand_path(spec_file)
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#use_spec?' do
|
||||||
|
let(:spec_file) { 'my/spec.js' }
|
||||||
|
|
||||||
|
let(:files_list) { Jasmine::FilesList.new(:only => filter) }
|
||||||
|
|
||||||
|
context 'no filter provided' do
|
||||||
|
let(:filter) { [] }
|
||||||
|
|
||||||
|
it "should allow the spec" do
|
||||||
|
files_list.use_spec?(spec_file).should be_true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'filter provided' do
|
||||||
|
let(:filter) { [ spec_file ] }
|
||||||
|
|
||||||
|
it "should use the spec" do
|
||||||
|
files_list.use_spec?(spec_file).should be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should not use the spec" do
|
||||||
|
files_list.use_spec?('other/file').should be_false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'with filtered specs' do
|
||||||
|
let(:files_list) { Jasmine::FilesList.new(:only => filter, :config => config) }
|
||||||
|
let(:spec_dir) { 'spec' }
|
||||||
|
|
||||||
|
include FakeFS::SpecHelpers
|
||||||
|
|
||||||
|
let(:config) { {
|
||||||
|
'spec_files' => [ '*_spec.js' ],
|
||||||
|
'spec_dir' => spec_dir
|
||||||
|
} }
|
||||||
|
|
||||||
|
before do
|
||||||
|
%w{one_spec.js two_spec.js}.each do |file|
|
||||||
|
File.open(File.join(spec_dir, file), 'w')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:filter) { 'spec/one_spec.js' }
|
||||||
|
|
||||||
|
it 'should return all files for files' do
|
||||||
|
files_list.files.any? { |file| file['two_spec.js'] }.should be_true
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should return only filtered files for filtered_files' do
|
||||||
|
files_list.filtered_files.any? { |file| file['two_spec.js'] }.should be_false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#.*files_to_html' do
|
||||||
|
include FakeFS::SpecHelpers
|
||||||
|
|
||||||
|
before do
|
||||||
|
files_list.instance_variable_set(:@files, [
|
||||||
|
'test.js',
|
||||||
|
'test.coffee',
|
||||||
|
'test.css'
|
||||||
|
])
|
||||||
|
|
||||||
|
File.open('test.coffee', 'w')
|
||||||
|
|
||||||
|
CoffeeScript.stubs(:compile).returns("i compiled")
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#files_to_html' do
|
||||||
|
it "should create the right HTML" do
|
||||||
|
files_list.files_to_html.should == [
|
||||||
|
%{<script type="text/javascript" src="test.js"></script>},
|
||||||
|
%{<script type="text/javascript">i compiled</script>},
|
||||||
|
%{<link rel="stylesheet" href="test.css" type="text/css" />}
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#filtered_files_to_html' do
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -1,3 +1,7 @@
|
|||||||
|
RSpec.configure do |c|
|
||||||
|
c.mock_with :mocha
|
||||||
|
end
|
||||||
|
|
||||||
specrunner = 'ext/jasmine-webkit-specrunner/jasmine-webkit-specrunner'
|
specrunner = 'ext/jasmine-webkit-specrunner/jasmine-webkit-specrunner'
|
||||||
|
|
||||||
if !File.file?(specrunner)
|
if !File.file?(specrunner)
|
||||||
|
Loading…
Reference in New Issue
Block a user