forked from airportyh/jspec
/
jspec
executable file
·121 lines (108 loc) · 4.69 KB
/
jspec
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#!/usr/bin/env ruby
JSPEC_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
$:.unshift JSPEC_ROOT
require 'rubygems'
require 'commander'
require 'bind'
require 'fileutils'
RHINO = 'java org.mozilla.javascript.tools.shell.Main'
program :name, 'JSpec'
program :version, '2.4.1'
program :description, 'JavaScript BDD Testing Framework'
default_command :bind
command :init do |c|
c.syntax = 'jspec init [dest]'
c.summary = 'Initialize a JSpec project template'
c.description = 'Initialize a JSpec project template. Defaults to the current directory
when [dest] is not specified. The template includes several files for
running via Rhino, DOM, and the JSpec Rack server.'
c.example 'Create a directory foo, initialized with a jspec template', 'jspec init foo'
c.when_called do |args, options|
dest = args.shift || '.'
unless Dir[dest + '/*'].empty?
abort unless agree "'#{dest}' is not empty; continue? "
end
template = File.join JSPEC_ROOT, 'templates', 'default', '.'
FileUtils.mkdir_p dest
FileUtils.cp_r template, dest
%w( spec/spec.dom.html spec/spec.rhino.js ).each do |path|
path = File.join dest, path
contents = File.read(path).gsub 'JSPEC_ROOT', JSPEC_ROOT
File.open(path, 'w') { |file| file.write contents }
end
say "Template initialized at '#{dest}'"
end
end
command :update do |c|
c.syntax = 'jspec update [path ...]'
c.summary = 'Update JSpec releases'
c.description = 'Update JSpec release in [paths], this will allow you to utilize
the latest JSpec features. Execute from JSpec project root without [paths] to
update the default template spec files.'
c.when_called do |args, options|
paths = args.empty? ? %w( spec/spec.dom.html spec/spec.rhino.js ) : args
paths.each do |path|
next unless File.exists? path
contents = File.read(path).gsub /visionmedia-jspec-(\d+\.\d+\.\d+)/, "visionmedia-jspec-#{program(:version)}"
File.open(path, 'r+'){ |file| file.write contents }
say "Updated #{path} to JSpec #{program(:version)}"
end
end
end
command :run do |c|
c.syntax = 'jspec run [path] [options]'
c.summary = 'Run specifications'
c.description = 'Run specifications, defaulting [path] to spec/spec.dom.html.
You will need to supply [path] if your specs do not reside
in this location. `run --bind` is the default sub-command of
jspec so you may simply execute `jspec` in order to bind execution
of your specs when a file is altered.
JSpec supports Rhino execution when installed. The [path] is assumed
to be spec/spec.rhino.js unless specified. See examples below for
using the --rhino switch.
JSpec\'s server is also available via --server, which defaults
the [path] to spec/server.html'
c.example 'Run once in Safari', 'jspec run'
c.example 'Run once in Safari and Firefox', 'jspec run --browsers Safari,Firefox'
c.example 'Run custom spec file', 'jspec run foo.html'
c.example 'Auto-run browsers when a file is altered', 'jspec run --bind --browsers Safari,Firefox'
c.example 'Shortcut for the previous example', 'jspec --browsers Safari,Firefox'
c.example 'Auto-run rhino when a file is altered', 'jspec --rhino'
c.example 'Run Rhino specs once', 'jspec run specs/something.js --rhino'
c.option '-b', '--browsers BROWSERS', Array, 'Specify browsers to test, defaults to Safari'
c.option '-p', '--paths PATHS', Array, 'Specify paths when binding, defaults to javascript within ./lib and ./spec'
c.option '-B', '--bind', 'Auto-run specs when source files or specs are altered'
c.option '-R', '--rhino', 'Run specs using Rhino'
c.option '-S', '--server', 'Run specs using the JSpec server'
c.option '-s', '--server-only', 'Start JSpec server without running browsers'
c.when_called do |args, options|
options.default :browsers => %w( Safari ), :paths => ['lib/**/*.js', 'spec/**/*.js']
# Actions
if options.rhino
spec = args.shift || 'spec/spec.rhino.js'
action = lambda { rhino spec }
elsif options.server
spec = args.shift || 'spec/spec.server.html'
action = lambda { start_server options, spec }
else
spec = args.shift || 'spec/spec.dom.html'
action = Bind::Actions::RefreshBrowsers.new spec, *options.browsers
end
# Binding
if options.bind
listener = Bind::Listener.new :paths => options.paths, :interval => 1, :actions => [action], :debug => $stdout
listener.run!
else
action.call File.new(spec)
end
end
end
alias_command :bind, :run, '--bind'
def rhino file
abort "#{file} not found" unless File.exists? file
system "#{RHINO} #{file}"
end
def start_server options, spec
require 'server/server'
JSpec::Server.start options, spec
end