rsutphin-shenandoah 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.braids +8 -0
- data/.document +5 -0
- data/.gitignore +6 -0
- data/ChangeLog.markdown +13 -0
- data/LICENSE +20 -0
- data/LICENSE-Blue-Ridge +20 -0
- data/LICENSE-Screw.Unit +22 -0
- data/LICENSE-Smoke +22 -0
- data/README.markdown +280 -0
- data/Rakefile +71 -0
- data/VERSION.yml +4 -0
- data/lib/shenandoah/buildr.rb +9 -0
- data/lib/shenandoah/buildr/locator.rb +17 -0
- data/lib/shenandoah/buildr/shenandoah_tasks.rb +18 -0
- data/lib/shenandoah/buildr/test_framework.rb +28 -0
- data/lib/shenandoah/css/screw.css +90 -0
- data/lib/shenandoah/javascript/browser/runner.js +34 -0
- data/lib/shenandoah/javascript/common/jquery-1.3.2.js +4376 -0
- data/lib/shenandoah/javascript/common/jquery.fn.js +29 -0
- data/lib/shenandoah/javascript/common/jquery.print.js +109 -0
- data/lib/shenandoah/javascript/common/screw.behaviors.js +129 -0
- data/lib/shenandoah/javascript/common/screw.builder.js +104 -0
- data/lib/shenandoah/javascript/common/screw.events.js +45 -0
- data/lib/shenandoah/javascript/common/screw.matchers.js +254 -0
- data/lib/shenandoah/javascript/common/screw.mocking.js +22 -0
- data/lib/shenandoah/javascript/common/smoke.core.js +6 -0
- data/lib/shenandoah/javascript/common/smoke.mock.js +130 -0
- data/lib/shenandoah/javascript/common/smoke.stub.js +29 -0
- data/lib/shenandoah/javascript/console/consoleReportForRake.js +32 -0
- data/lib/shenandoah/javascript/console/env.rhino.js +8841 -0
- data/lib/shenandoah/javascript/console/js.jar +0 -0
- data/lib/shenandoah/javascript/console/runner.js +43 -0
- data/lib/shenandoah/javascript/console/shell.js.erb +23 -0
- data/lib/shenandoah/locator.rb +17 -0
- data/lib/shenandoah/rails/locator.rb +27 -0
- data/lib/shenandoah/rails/tasks.rb +16 -0
- data/lib/shenandoah/runner.rb +69 -0
- data/lib/shenandoah/server.rb +88 -0
- data/lib/shenandoah/server/views/index.haml +12 -0
- data/lib/shenandoah/tasks.rb +62 -0
- data/rails_generators/shen_spec/shen_spec_generator.rb +27 -0
- data/rails_generators/shen_spec/templates/fixture.html.erb +13 -0
- data/rails_generators/shen_spec/templates/javascript_spec.js.erb +8 -0
- data/rails_generators/shenandoah/shenandoah_generator.rb +21 -0
- data/rails_generators/shenandoah/templates/application.html +16 -0
- data/rails_generators/shenandoah/templates/application_spec.js +14 -0
- data/rails_generators/shenandoah/templates/shenandoah.rake +2 -0
- data/rails_generators/shenandoah/templates/spec_helper.js +1 -0
- data/shenandoah.gemspec +155 -0
- data/spec/rails_generators/shen_spec_generator_spec.rb +81 -0
- data/spec/rails_generators/shenandoah_generator_spec.rb +80 -0
- data/spec/rails_generators/spec_helper.rb +21 -0
- data/spec/shenandoah/buildr/locator_spec.rb +33 -0
- data/spec/shenandoah/buildr/shenandoah_tasks_spec.rb +27 -0
- data/spec/shenandoah/buildr/spec_helper.rb +2 -0
- data/spec/shenandoah/buildr/test_framework_spec.rb +77 -0
- data/spec/shenandoah/locator_spec.rb +74 -0
- data/spec/shenandoah/rails/locator_spec.rb +57 -0
- data/spec/shenandoah/rails/tasks_spec.rb +32 -0
- data/spec/shenandoah/runner_spec.rb +110 -0
- data/spec/shenandoah/server_spec.rb +216 -0
- data/spec/shenandoah/tasks_spec.rb +85 -0
- data/spec/spec_helper.rb +61 -0
- metadata +262 -0
Binary file
|
@@ -0,0 +1,43 @@
|
|
1
|
+
if(arguments.length == 0) {
|
2
|
+
print("Usage: test_runner.js /path/to/shenandoah /path/to/mainfiles /path/to/specfiles file_spec.js");
|
3
|
+
quit(1);
|
4
|
+
}
|
5
|
+
|
6
|
+
var SHENANDOAH = arguments[0]
|
7
|
+
var MAIN_PATH = arguments[1]
|
8
|
+
var SPEC_PATH = arguments[2]
|
9
|
+
var SPEC_FILE = arguments[3]
|
10
|
+
|
11
|
+
function require_main(file) {
|
12
|
+
require_absolute(MAIN_PATH + '/' + file)
|
13
|
+
}
|
14
|
+
|
15
|
+
function require_spec(file) {
|
16
|
+
require_absolute(SPEC_PATH + '/' + file)
|
17
|
+
}
|
18
|
+
|
19
|
+
function require_absolute(file) {
|
20
|
+
load(file)
|
21
|
+
}
|
22
|
+
|
23
|
+
var fixture = SPEC_FILE.replace(/^(.*?)_spec\.js$/, "$1.html");
|
24
|
+
print("Running " + SPEC_FILE + " with fixture '" + fixture + "'");
|
25
|
+
|
26
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/console/env.rhino.js");
|
27
|
+
window.location = fixture;
|
28
|
+
|
29
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/common/jquery-1.3.2.js");
|
30
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/common/jquery.fn.js");
|
31
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/common/jquery.print.js");
|
32
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/common/screw.builder.js");
|
33
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/common/screw.matchers.js");
|
34
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/common/screw.events.js");
|
35
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/common/screw.behaviors.js");
|
36
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/common/smoke.core.js");
|
37
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/common/smoke.mock.js");
|
38
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/common/smoke.stub.js");
|
39
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/common/screw.mocking.js");
|
40
|
+
load(SHENANDOAH + "/lib/shenandoah/javascript/console/consoleReportForRake.js");
|
41
|
+
|
42
|
+
load(SPEC_PATH + '/' + SPEC_FILE);
|
43
|
+
jQuery(window).trigger("load");
|
@@ -0,0 +1,23 @@
|
|
1
|
+
(function(){
|
2
|
+
var _old_quit = this.quit;
|
3
|
+
this.__defineGetter__("exit", function(){ _old_quit() });
|
4
|
+
this.__defineGetter__("quit", function(){ _old_quit() });
|
5
|
+
|
6
|
+
print("=================================================");
|
7
|
+
print(" Rhino JavaScript Shell");
|
8
|
+
print(" To exit type 'exit', 'quit', or 'quit()'.");
|
9
|
+
print("=================================================");
|
10
|
+
|
11
|
+
load("<%= shenandoah_root %>/lib/shenandoah/javascript/console/env.rhino.js");
|
12
|
+
print(" - loaded env.js");
|
13
|
+
|
14
|
+
window.location = "<%= shell_html_path %>";
|
15
|
+
print(" - sample DOM loaded");
|
16
|
+
|
17
|
+
load("<%= shenandoah_root %>/lib/shenandoah/javascript/common/jquery-1.3.2.js");
|
18
|
+
print (" jQuery-1.3.2 loaded");
|
19
|
+
// load(PLUGIN_PREFIX + "lib/jquery-1.2.6.js");
|
20
|
+
// print(" - jQuery-1.2.6 loaded");
|
21
|
+
|
22
|
+
print("=================================================");
|
23
|
+
})();
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rake'
|
2
|
+
|
3
|
+
module Shenandoah
|
4
|
+
class DefaultLocator
|
5
|
+
attr_accessor :main_path, :spec_path, :tmp_path
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
@main_path = options[:main_path] || "lib"
|
9
|
+
@spec_path = options[:spec_path] || "spec"
|
10
|
+
@tmp_path = options[:tmp_path] || ENV['TMPDIR'] || "tmp"
|
11
|
+
end
|
12
|
+
|
13
|
+
def spec_files
|
14
|
+
FileList["#{spec_path}/**/*_spec.js"]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'shenandoah/locator'
|
2
|
+
|
3
|
+
module Shenandoah
|
4
|
+
module Rails
|
5
|
+
class Locator < Shenandoah::DefaultLocator
|
6
|
+
def initialize(options={})
|
7
|
+
super(
|
8
|
+
:main_path => File.join(RAILS_ROOT, options[:main_path] || "public/javascripts"),
|
9
|
+
:spec_path => File.join(RAILS_ROOT, options[:spec_path] || select_spec_subpath),
|
10
|
+
:tmp_path => File.join(RAILS_ROOT, "tmp/shenandoah")
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def select_spec_subpath
|
17
|
+
%w(spec examples).each do |candidate|
|
18
|
+
if File.directory?(File.join(RAILS_ROOT, candidate))
|
19
|
+
return "#{candidate}/javascript"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
"test/javascript" # default
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# This class is just sugar for initing Shenandoah::Tasks with a rails locator
|
2
|
+
|
3
|
+
require 'shenandoah/tasks'
|
4
|
+
require 'shenandoah/rails/locator'
|
5
|
+
|
6
|
+
module Shenandoah
|
7
|
+
module Rails
|
8
|
+
class Tasks < Shenandoah::Tasks
|
9
|
+
protected
|
10
|
+
|
11
|
+
def default_locator_type
|
12
|
+
Locator
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module Shenandoah
|
5
|
+
class Runner
|
6
|
+
def initialize(locator, options = {})
|
7
|
+
@locator = locator
|
8
|
+
@quiet = options[:quiet]
|
9
|
+
end
|
10
|
+
|
11
|
+
# Runs the specified specs. Returns an array of the specs that passed.
|
12
|
+
def run_console(specs)
|
13
|
+
FileUtils.cd @locator.spec_path do
|
14
|
+
runner_cmd = rhino_command(shen_path_to('lib/shenandoah/javascript/console/runner.js'))
|
15
|
+
args = [
|
16
|
+
shen_path_to,
|
17
|
+
@locator.main_path,
|
18
|
+
@locator.spec_path
|
19
|
+
]
|
20
|
+
|
21
|
+
return specs.select { |spec|
|
22
|
+
system("#{runner_cmd} '#{args.join("' '")}' '#{spec.sub(%r{^#{@locator.spec_path}/}, '')}' #{@quiet ? '> /dev/null' : ''}")
|
23
|
+
}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def run_shell
|
28
|
+
create_shell_html
|
29
|
+
create_shell_js
|
30
|
+
|
31
|
+
rlwrap = `which rlwrap`.chomp
|
32
|
+
cmd = "#{rlwrap} #{rhino_command('-f', shell_js_path, '-f', '-')}"
|
33
|
+
$stderr.puts "Starting shell with #{cmd}"
|
34
|
+
system(cmd)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def shen_path_to(file=nil)
|
40
|
+
File.expand_path(File.dirname(__FILE__) + "/../../#{file}")
|
41
|
+
end
|
42
|
+
alias :shenandoah_root :shen_path_to
|
43
|
+
|
44
|
+
def rhino_command(*args)
|
45
|
+
"java -jar '#{shen_path_to 'lib/shenandoah/javascript/console/js.jar'}' -w -debug '#{args.join("' '")}'"
|
46
|
+
end
|
47
|
+
|
48
|
+
def shell_html_path
|
49
|
+
"#{@locator.tmp_path}/shell.html"
|
50
|
+
end
|
51
|
+
|
52
|
+
def shell_js_path
|
53
|
+
"#{@locator.tmp_path}/shell.js"
|
54
|
+
end
|
55
|
+
|
56
|
+
def create_shell_html
|
57
|
+
FileUtils.mkdir_p File.dirname(shell_html_path)
|
58
|
+
File.open(shell_html_path, 'w') do |f|
|
59
|
+
f.write "<html><body></body></html>"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def create_shell_js
|
64
|
+
js = ERB.new(File.read(shen_path_to('lib/shenandoah/javascript/console/shell.js.erb'))).result(binding)
|
65
|
+
FileUtils.mkdir_p File.dirname(shell_js_path)
|
66
|
+
File.open(shell_js_path, 'w') { |f| f.write js }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'sinatra'
|
2
|
+
require 'haml'
|
3
|
+
|
4
|
+
module Shenandoah
|
5
|
+
# The server which enables in-browser execution of Screw.Unit specs in
|
6
|
+
# Shenandoah.
|
7
|
+
#
|
8
|
+
# It exposes a list of all the specs at the root of the server,
|
9
|
+
# organized by subdirectory, with links to individual test fixtures.
|
10
|
+
# The contents of the +main_path+ and +spec_path+ in the configured locator
|
11
|
+
# are exposed under <tt>/main</tt> and <tt>/spec</tt> respectively.
|
12
|
+
class Server < Sinatra::Base
|
13
|
+
set :root, File.dirname(__FILE__) + "/server"
|
14
|
+
set :port, 4410
|
15
|
+
enable :logging
|
16
|
+
|
17
|
+
get '/' do
|
18
|
+
section_map = options.locator.spec_files.
|
19
|
+
collect { |t| t.sub(%r{^#{options.locator.spec_path}/?}, '') }.
|
20
|
+
collect { |t| [File.dirname(t), File.basename(t).sub(/_spec.js$/, '.html')] }.
|
21
|
+
inject({}) { |h, (dir, file)| h[dir] ||= []; h[dir] << file; h }
|
22
|
+
@sections = section_map.collect { |dir, files| [dir, files.sort] }.sort
|
23
|
+
|
24
|
+
haml :index
|
25
|
+
end
|
26
|
+
|
27
|
+
get '/main/*' do
|
28
|
+
map_file(options.locator.main_path, params[:splat].first, "Main")
|
29
|
+
end
|
30
|
+
|
31
|
+
get '/spec/*' do
|
32
|
+
map_file(options.locator.spec_path, params[:splat].first, "Spec")
|
33
|
+
end
|
34
|
+
|
35
|
+
get '/screw.css' do
|
36
|
+
screw_css = File.join(options.locator.spec_path, 'screw.css')
|
37
|
+
unless File.exist?(screw_css)
|
38
|
+
screw_css = File.join(File.dirname(__FILE__), 'css/screw.css')
|
39
|
+
end
|
40
|
+
send_file screw_css
|
41
|
+
end
|
42
|
+
|
43
|
+
get '/shenandoah/browser-runner.js' do
|
44
|
+
content_type 'text/javascript'
|
45
|
+
|
46
|
+
last_modified runner_files.collect { |filename|
|
47
|
+
File.stat("#{File.dirname(__FILE__)}/#{filename}").mtime
|
48
|
+
}.max
|
49
|
+
|
50
|
+
runner_files.collect { |filename|
|
51
|
+
[
|
52
|
+
"\n//////\n////// #{filename}\n//////\n",
|
53
|
+
File.read("#{File.dirname(__FILE__)}/#{filename}")
|
54
|
+
]
|
55
|
+
}.flatten
|
56
|
+
end
|
57
|
+
|
58
|
+
protected
|
59
|
+
|
60
|
+
def map_file(path, name, desc) # :nodoc:
|
61
|
+
file = File.join(path, name)
|
62
|
+
if File.exist?(file)
|
63
|
+
headers['Cache-Control'] = 'no-cache'
|
64
|
+
send_file file
|
65
|
+
else
|
66
|
+
halt 404, "#{desc} file not found: #{file}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def runner_files # :nodoc:
|
71
|
+
# Can't just use Dir[] because order is important
|
72
|
+
[
|
73
|
+
"javascript/common/jquery-1.3.2.js",
|
74
|
+
"javascript/common/jquery.fn.js",
|
75
|
+
"javascript/common/jquery.print.js",
|
76
|
+
"javascript/common/screw.builder.js",
|
77
|
+
"javascript/common/screw.matchers.js",
|
78
|
+
"javascript/common/screw.events.js",
|
79
|
+
"javascript/common/screw.behaviors.js",
|
80
|
+
"javascript/common/smoke.core.js",
|
81
|
+
"javascript/common/smoke.mock.js",
|
82
|
+
"javascript/common/smoke.stub.js",
|
83
|
+
"javascript/common/screw.mocking.js",
|
84
|
+
"javascript/browser/runner.js"
|
85
|
+
]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
%html
|
2
|
+
%head
|
3
|
+
%link{ :rel => "stylesheet", :href => "/screw.css", :type => "text/css", :charset => "utf-8" }
|
4
|
+
%body
|
5
|
+
- if options.respond_to?(:project_name) && options.project_name
|
6
|
+
%h1= "Specs for #{options.project_name}"
|
7
|
+
- @sections.each do |section, tests|
|
8
|
+
%h2= section == '.' ? '[root]' : section
|
9
|
+
%ul
|
10
|
+
- tests.each do |test|
|
11
|
+
%li
|
12
|
+
%a{ :href => ["spec", section, test].reject { |s| s == '.' }.join('/') }= test.sub(/.html$/, '')
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'shenandoah/runner'
|
3
|
+
require 'shenandoah/server'
|
4
|
+
|
5
|
+
module Shenandoah
|
6
|
+
class Tasks
|
7
|
+
attr_accessor :locator, :options, :runner
|
8
|
+
|
9
|
+
def initialize(options = {})
|
10
|
+
@options = options
|
11
|
+
@locator =
|
12
|
+
if options[:locator]
|
13
|
+
options[:locator]
|
14
|
+
else
|
15
|
+
default_locator_type.new(options)
|
16
|
+
end
|
17
|
+
@runner = Shenandoah::Runner.new(@locator)
|
18
|
+
create_serve_task
|
19
|
+
create_shell_task
|
20
|
+
create_run_task
|
21
|
+
end
|
22
|
+
|
23
|
+
def run_specs
|
24
|
+
files = @locator.spec_files
|
25
|
+
if ENV['SHEN_SPEC']
|
26
|
+
files = files.select { |f| f =~ /#{ENV['SHEN_SPEC']}/ }
|
27
|
+
end
|
28
|
+
successes = @runner.run_console(files)
|
29
|
+
if (successes.size != files.size)
|
30
|
+
raise "Shenandoah specs failed!"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
def default_locator_type
|
37
|
+
DefaultLocator
|
38
|
+
end
|
39
|
+
|
40
|
+
def create_serve_task
|
41
|
+
task('shen:serve') do |t|
|
42
|
+
Shenandoah::Server.set :locator, @locator
|
43
|
+
if @options[:project_name]
|
44
|
+
Shenandoah::Server.set :project_name, @options[:project_name]
|
45
|
+
end
|
46
|
+
Shenandoah::Server.run!
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_shell_task
|
51
|
+
task('shen:shell') do |t|
|
52
|
+
@runner.run_shell
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def create_run_task
|
57
|
+
task('shen:spec') do |t|
|
58
|
+
run_specs
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rails_generator'
|
2
|
+
require 'shenandoah/rails/locator'
|
3
|
+
|
4
|
+
module Shenandoah
|
5
|
+
module Generators
|
6
|
+
class ShenSpecGenerator < ::Rails::Generator::NamedBase
|
7
|
+
def manifest
|
8
|
+
spec_path = Shenandoah::Rails::Locator.new.spec_path.sub %r{^#{RAILS_ROOT}/}, ''
|
9
|
+
record do |m|
|
10
|
+
m.directory "#{spec_path}/#{File.dirname(file_path)}"
|
11
|
+
m.template 'javascript_spec.js.erb', "#{spec_path}/#{file_path}_spec.js"
|
12
|
+
m.template 'fixture.html.erb', "#{spec_path}/#{file_path}.html"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def file_path
|
17
|
+
super.sub /_spec$/, ''
|
18
|
+
end
|
19
|
+
|
20
|
+
def javascript_class_name
|
21
|
+
klass, *mods_rev = class_name.sub(/Spec$/, '').split('::').reverse
|
22
|
+
mod_spec = mods_rev.reverse.collect { |m| m.downcase }.join('.')
|
23
|
+
[mod_spec, klass].reject { |p| p == "" }.join '.'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
|
4
|
+
<head>
|
5
|
+
<title><%= file_name %>.js | JavaScript Testing Results</title>
|
6
|
+
<link rel="stylesheet" href="/screw.css" type="text/css" charset="utf-8" />
|
7
|
+
<script type="text/javascript" src="/shenandoah/browser-runner.js"></script>
|
8
|
+
</head>
|
9
|
+
|
10
|
+
<body>
|
11
|
+
<!-- Put any HTML fixture elements here. -->
|
12
|
+
</body>
|
13
|
+
</html>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rails_generator'
|
2
|
+
require 'shenandoah/rails/locator'
|
3
|
+
|
4
|
+
module Shenandoah
|
5
|
+
module Generators
|
6
|
+
class ShenandoahGenerator < ::Rails::Generator::Base
|
7
|
+
def manifest
|
8
|
+
spec_path = Shenandoah::Rails::Locator.new.spec_path.sub %r{^#{RAILS_ROOT}/}, ''
|
9
|
+
record do |m|
|
10
|
+
m.directory "lib/tasks"
|
11
|
+
m.file "shenandoah.rake", "lib/tasks/shenandoah.rake"
|
12
|
+
|
13
|
+
m.directory spec_path
|
14
|
+
m.file "spec_helper.js", "#{spec_path}/spec_helper.js"
|
15
|
+
m.file "application_spec.js", "#{spec_path}/application_spec.js"
|
16
|
+
m.file "application.html", "#{spec_path}/application.html"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|