bin/jspec in visionmedia-jspec-1.1.3 vs bin/jspec in visionmedia-jspec-1.1.4

- old
+ new

@@ -1,44 +1,67 @@ #!/usr/bin/env ruby +JSPEC_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')) +$:.unshift JSPEC_ROOT + require 'rubygems' require 'commander' require 'fileutils' -JSPEC_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..')) +RHINO = 'java org.mozilla.javascript.tools.shell.Main' program :name, 'JSpec' -program :version, '1.1.3' +program :version, '1.1.4' 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.' + c.description = 'Initialize a JSpec project template. Defaults to the current directory + when [dest] is not specified. Currently three templates are available: + + "default" : runs specs in browser(s) using the DOM formatter. + "rhino" : runs specs with Rhino using the Terminal formatter. + "server" : runs specs using a Ruby server/client solution which + starts each browser and reports back to the terminal.' c.example 'Create a directory foo, initialized with a jspec template', 'jspec init foo' + c.example 'Initialize a rhino based project in the current directory', 'jspec init --template rhino' + c.example 'Initialize a server based project in foo', 'jspec init foo --template server' + c.option '-T', '--template name', 'Template to use. Valid choices are default, rhino, and server.' c.when_called do |args, options| dest = args.shift || '.' + options.default :template => 'default' unless Dir[dest + '/*'].empty? abort unless agree "'#{dest}' is not empty; continue? " end + template = File.join JSPEC_ROOT, 'templates', options.template, '.' + abort "template #{options.template} does not exist" unless File.exists? template FileUtils.mkdir_p dest - FileUtils.cp_r File.join(JSPEC_ROOT, 'templates', 'default', '.'), dest - spec = File.join dest, 'spec', 'spec.html' - contents = File.read(spec).gsub 'JSPEC_ROOT', JSPEC_ROOT - File.open(spec, 'w') { |file| file.write contents } + FileUtils.cp_r template, dest + path = case options.template + when 'default' ; 'spec.html' + when 'rhino' ; 'spec.js' + else + end + if path + spec = File.join dest, 'spec', path + contents = File.read(spec).gsub 'JSPEC_ROOT', JSPEC_ROOT + File.open(spec, '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. If you have suites running at a path other than the regular - spec/spec.html simply pass them as arguments to this sub-command.' + spec/spec.html simply pass them as arguments to this sub-command. + + This is only needed when using the default, or rhino project templates.' c.when_called do |args, options| args = %w( spec/spec.html ) if args.empty? args.each do |path| next unless File.exists? path contents = File.read(path).gsub /visionmedia-jspec-(\d+\.\d+\.\d+)/, "visionmedia-jspec-#{program(:version)}" @@ -52,32 +75,63 @@ c.syntax = 'jspec run [path] [options]' c.summary = 'Run specifications' c.description = 'Run specifications, defaulting [path] to spec/spec.html. You will need 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.' + 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.js unless specified. See examples below for using the --rhino switch.' 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-refresh browsers when a file is altered', 'jspec run --bind --browsers Safari,Firefox' + 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 --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| begin require 'bind' - spec = args.shift || 'spec/spec.html' options.default :browsers => %w( Safari ), :paths => ['lib/**/*.js', 'spec/**/*.js'] - action = Bind::Actions::RefreshBrowsers.new spec, *options.browsers + + # Actions + if options.rhino + spec = args.shift || 'spec/spec.js' + action = lambda { rhino spec } + elsif options.server + spec = args.shift || 'spec/spec.html' + action = lambda { start_server options, spec } + else + spec = args.shift || 'spec/spec.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 spec + action.call File.new(spec) end + rescue LoadError abort "jspec run requires the visionmedia-bind gem; http://visionmedia.github.com/bind/" 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 \ No newline at end of file