Compare commits

...

34 Commits

Author SHA1 Message Date
John Bintz f86ec8b3b6 Merge pull request #20 from tim-sge/license-ambiguity-fix
Adds MIT license.
2012-09-30 10:12:41 -07:00
Tim Mansfield f82a1d6059 Adds MIT license. 2012-09-25 09:31:08 -07:00
John Bintz 644f24cc4c bump version rc 2012-01-27 09:45:39 -05:00
John Bintz b3e88261f0 better reporter support 2012-01-11 11:31:19 -05:00
John Bintz 943e754d59 start better reporter handling 2012-01-10 17:14:46 -05:00
John Bintz 12b48b1c6d update for new jhw 2011-12-30 15:53:09 -05:00
John Bintz 83e5bd542e update readme and other things for upcoming release 2011-11-23 17:57:19 -05:00
John Bintz b420397349 update readme 2011-11-03 10:35:45 -04:00
John Bintz 6e2be80d6a jhw uses full paths for everything now, this has to, too 2011-10-17 15:15:57 -04:00
John Bintz 7040e0e949 clean some things up 2011-10-11 15:30:39 -04:00
John Bintz c9e7bb60cb fix double inclusion and do glob expansion in runner, fix #7 2011-09-27 14:30:49 -04:00
John Bintz cd27ecb5be Merge pull request #9 from smitcham/master
Fix for failure to rerun after syntax error in system under test
2011-09-27 10:47:30 -07:00
Steven Mitcham 862b82e869 Fixing the runner to return false on the event of a failure and returning the original set of files in the event of a failure 2011-09-26 10:48:14 -05:00
Steven Mitcham 70b26b2c08 Fixing issue with jasmine headless webkit returning 'true' when a compilation error occurs 2011-09-23 11:54:46 -05:00
John Bintz 9b6cb02d06 pass other options into jhw 2011-09-14 10:06:55 -04:00
John Bintz c2a3635083 bump version 2011-09-12 09:17:49 -04:00
John Bintz 3ed72300d3 some cleanups of running specs, ensure correct return values for serial guard execution 2011-09-07 09:53:33 -04:00
John Bintz 570ea0814e always re-run failed specs, clear those out with ctrl-z 2011-09-06 16:00:27 -04:00
John Bintz 5baaf8f6e3 merge and add .orig to gitignore 2011-09-03 16:45:09 -04:00
John Bintz cd6004fd3d penchant-ize 2011-09-03 07:53:04 -04:00
John Bintz c467aea42b update runner to use new reporting system 2011-09-03 07:50:05 -04:00
John Bintz ce6639f44e include the main jhw library file for the autoload bits 2011-09-01 10:43:58 -04:00
John Bintz 25816daf7f bump version 2011-08-05 13:41:47 -04:00
John Bintz 895ae0c304 remove jammit and rails assets, also ensure files don't run twice 2011-08-05 13:35:06 -04:00
John Bintz 3fb7d8ac24 fix for new JHW where failure details are part of the report 2011-07-14 06:50:47 -04:00
John Bintz 245eeba260 refactor something that was really starting to bug me 2011-06-26 16:13:33 -04:00
John Bintz 7ca6900570 ok, fine 2011-06-26 16:11:33 -04:00
John Bintz 56e71e7ada a require for coffeescript 2011-06-26 15:51:52 -04:00
John Bintz 8b65ee4ed3 typo 2011-06-18 12:52:27 -04:00
John Bintz 93a8d546b8 rakefile with dsl goodness 2011-06-18 12:17:22 -04:00
John Bintz 74d4ce577f update readme 2011-06-18 12:15:12 -04:00
John Bintz e776f24970 better catch coffeescript compile errors 2011-06-17 10:26:16 -04:00
John Bintz 9f27c50156 catch and report errors better 2011-06-17 09:37:08 -04:00
John Bintz e1a01fb44e bump version some more 2011-06-16 17:33:42 -04:00
27 changed files with 545 additions and 222 deletions

2
.gitignore vendored
View File

@ -2,3 +2,5 @@
.bundle .bundle
Gemfile.lock Gemfile.lock
pkg/* pkg/*
*.orig

15
Gemfile
View File

@ -2,10 +2,19 @@ source "http://rubygems.org"
# Specify your gem's dependencies in guard-jasmine-headless-webkit.gemspec # Specify your gem's dependencies in guard-jasmine-headless-webkit.gemspec
gemspec gemspec
gem 'guard', :git => 'https://github.com/guard/guard.git' gem 'rake', '0.9.2'
gem 'rspec' gem 'rspec'
gem 'cucumber'
gem 'mocha' gem 'mocha'
gem 'rake', '0.8.7'
gem 'growl'
gem 'fakefs', :require => nil gem 'fakefs', :require => nil
gem 'jasmine-headless-webkit', :path => '../jasmine-headless-webkit' gem 'jasmine-headless-webkit', :path => '../jasmine-headless-webkit'
gem 'guard', :git => 'git://github.com/guard/guard.git'
gem 'guard-rspec'
gem 'guard-cucumber'
gem 'growl'
gem 'rb-fsevent'

View File

@ -5,13 +5,11 @@ guard 'rspec', :cli => '-c', :version => 2 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('spec/spec_helper.rb') { "spec" } watch('spec/spec_helper.rb') { "spec" }
# Rails example
watch('spec/spec_helper.rb') { "spec" }
watch('config/routes.rb') { "spec/routing" }
watch('app/controllers/application_controller.rb') { "spec/controllers" }
watch(%r{^spec/.+_spec\.rb})
watch(%r{^app/(.+)\.rb}) { |m| "spec/#{m[1]}_spec.rb" }
watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
watch(%r{^app/controllers/(.+)_(controller)\.rb}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
end end
guard 'cucumber', :cli => '-f pretty' do
watch(%r{^features/.+\.feature$})
watch(%r{^features/support/.+$}) { 'features' }
watch(%r{^features/step_definitions/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'features' }
end

20
MIT-LICENSE.txt Normal file
View File

@ -0,0 +1,20 @@
Copyright (c) 2011 John Bintz
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -2,9 +2,11 @@
Add running your Jasmine specs to your `Guardfile` via [`jasmine-headless-webkit`](http://github.com/johnbintz/jasmine-headless-webkit/). Nice! Add running your Jasmine specs to your `Guardfile` via [`jasmine-headless-webkit`](http://github.com/johnbintz/jasmine-headless-webkit/). Nice!
guard 'jasmine-headless-webkit' do ``` ruby
guard 'jasmine-headless-webkit' do
watch(%r{^app/assets/javascripts/(.*)\..*}) { |m| newest_js_file("spec/javascripts/#{m[1]}_spec") } watch(%r{^app/assets/javascripts/(.*)\..*}) { |m| newest_js_file("spec/javascripts/#{m[1]}_spec") }
end end
```
`gem install guard-jasmine-headless-webkit` and then `guard init jasmine-headless-webkit` in your project directory to get started. `gem install guard-jasmine-headless-webkit` and then `guard init jasmine-headless-webkit` in your project directory to get started.
You should also put it in your `Gemfile` because, hey, why not, right? You should also put it in your `Gemfile` because, hey, why not, right?
@ -15,14 +17,31 @@ home folder's `.jasmine-headless-webkit` file.
## `guard` options ## `guard` options
* `:all_on_start => false` to not run everything when starting, just like `guard-rspec`. * `:all_on_start => false` to not run everything when starting, just like `guard-rspec`.
* `:rails_assets => true` to repackage Rails assets before each run.
* `:run_before => "<command to run>"` to run a command before running specs. If the command fails, the test run stops.
* `:valid_extensions => %w{js coffee}` to only trigger `run_on_change` events for files with these extensions. Forces Guard to re-run all tests when any other matched file changes. * `:valid_extensions => %w{js coffee}` to only trigger `run_on_change` events for files with these extensions. Forces Guard to re-run all tests when any other matched file changes.
* All other options from `Jasmine::Headless::Runner`: (see the [list of available options](https://github.com/johnbintz/jasmine-headless-webkit/blob/master/lib/jasmine/headless/options.rb#L11A))
### Deprecated options ## Using with .erb files in the Rails 3.1 Asset Pipeline and/or Jammit
* `:jammit => true` to run `jammit -f 2>/dev/null` before the tests for the current file change are run. If your code required Jammit or ERB templates, which aren't directly supported by `jasmine-headledd-webkit`,
* Use [guard-jammit](http://github.com/guard/guard-jammit) instead. use [`guard-rails-assets`](https://github.com/dnagir/guard-rails-assets) chained in before `guard-jasmine-headless-webkit` to precompile your application
code for testing:
``` ruby
guard 'rails-assets' do
watch(%r{^app/assets/javascripts/.*})
end
guard 'jasmine-headless-webkit' do
watch(%r{^public/assets/.*\.js})
... specs ...
end
```
Do the same for Jammit, using [`guard-jammit`](http://github.com/guard/guard-jammit).
### `guard-jammit` and Jammit >= 0.6.0
Jammit >= 0.6.0 changed how it determines the Rails environment. Use [my fork of `guard-jammit`](http://github.com/johnbintz/guard-jammit) until it's fixed upstream.
## What's the deal with `newest_js_file`? ## What's the deal with `newest_js_file`?
@ -34,12 +53,8 @@ file is a little more complicated. `newest_js_file` extends the Guard DSL to sea
If you 100% know you won't need that support, modify your `Guardfile` as appropriate. If you 100% know you won't need that support, modify your `Guardfile` as appropriate.
## ...and the `.jst` file search? ## License
I use [Backbone.js](http://documentcloud.github.com/backbone/) a lot, and I put my Underscore view templates in `app/views/*.jst` This library is released under the MIT license:
and mash them all together with [Jammit](https://github.com/documentcloud/jammit) for use in my apps. Feel free to change that, it's your `Guardfile` after all.
Or, try it. It's easy to do in your `assets.yml` file:
templates:
- app/views/*.jst
* http://www.opensource.org/licenses/MIT

View File

@ -1,6 +1,8 @@
require 'bundler' require 'bundler'
Bundler::GemHelper.install_tasks Bundler::GemHelper.install_tasks
include Rake::DSL if defined?(Rake::DSL)
desc 'Push everywhere!' desc 'Push everywhere!'
task :push_everywhere do task :push_everywhere do
system %{git push origin master} system %{git push origin master}
@ -11,27 +13,26 @@ require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new(:spec) RSpec::Core::RakeTask.new(:spec)
PLATFORMS = %w{1.8.7 1.9.2 ree 1.9.3}
def rvm_bundle(command = '')
Bundler.with_clean_env do
system %{bash -c 'unset BUNDLE_BIN_PATH && unset BUNDLE_GEMFILE && rvm #{PLATFORMS.join(',')} do bundle #{command}'}
end
end
class SpecFailure < StandardError; end
class BundleFailure < StandardError; end
namespace :spec do namespace :spec do
desc "Run on three Rubies" desc "Run on three Rubies"
task :platforms do task :platforms do
current = %x{rvm-prompt v} rvm_bundle "update"
rvm_bundle "exec rspec spec"
fail = false rvm_bundle "exec cucumber"
%w{1.8.7 1.9.2 ree}.each do |version| raise SpecError.new if $?.exitstatus != 0
puts "Switching to #{version}"
Bundler.with_clean_env do
system %{bash -c 'source ~/.rvm/scripts/rvm && rvm #{version} && bundle exec rake spec'}
end
if $?.exitstatus != 0
fail = true
break
end
end
system %{rvm #{current}}
exit (fail ? 1 : 0)
end end
end end
task :default => 'spec:platforms' task :default => 'spec:platforms'

33
features/runner.feature Normal file
View File

@ -0,0 +1,33 @@
Feature: Runner
Scenario: Don't specify a reporter
Given I am going to call a JHW runner with the following reporters:
| name | file |
| Console | |
| File | notify-file |
And I am going to get a notification file
When I don't specify a reporter
And I run the runner
Then I should get the reporters
Scenario: Specify another console reporter
Given I am going to call a JHW runner with the following reporters:
| name | file |
| Verbose | |
| File | notify-file |
And I am going to get a notification file
When I specify the reporter "Verbose"
And I run the runner
Then I should get the reporters
And the reporter string should not have changed
Scenario: Specify two reporters
Given I am going to call a JHW runner with the following reporters:
| name | file |
| Verbose | |
| Tap | tap-file |
| File | notify-file |
And I am going to get a notification file
When I specify the reporter "Verbose Tap:tap-file"
And I run the runner
Then I should get the reporters

View File

@ -0,0 +1,13 @@
Given /^I am going to call a JHW runner with the following reporters:$/ do |table|
reporters = []
table.rows.each do | name, file |
reporters << [ name ]
reporters.last << file if !file.empty?
end
Jasmine::Headless::Runner.expects(:run).with(has_entry(:reporters => reporters))
Guard::JasmineHeadlessWebkit::Runner.expects(:notify)
end

View File

@ -0,0 +1,3 @@
Given /^I am going to get a notification file$/ do
Guard::JasmineHeadlessWebkit::Runner.stubs(:notify_report_file).returns(@report_file)
end

View File

@ -0,0 +1,3 @@
Then /^I should get the reporters$/ do
end

View File

@ -0,0 +1,3 @@
Then /^the reporter string should not have changed$/ do
@options[:reporters].should == @requested_reporter
end

View File

@ -0,0 +1,3 @@
When /^I don't specify a reporter$/ do
@options = {}
end

View File

@ -0,0 +1,3 @@
When /^I run the runner$/ do
Guard::JasmineHeadlessWebkit::Runner.run(@paths, @options)
end

View File

@ -0,0 +1,6 @@
When /^I specify the reporter "([^"]*)"$/ do |reporter|
@requested_reporter = reporter
@options = { :reporters => reporter }
end

30
features/support/env.rb Normal file
View File

@ -0,0 +1,30 @@
require 'rspec'
require 'mocha'
require 'fakefs/safe'
require 'jasmine-headless-webkit'
require 'guard/jasmine-headless-webkit'
require 'coffee-script'
World(Mocha::API)
Before do
mocha_setup
FakeFS.activate!
@report_file = 'notify-file'
@paths = []
end
After do
begin
mocha_verify
ensure
mocha_teardown
end
FakeFS.deactivate!
end

View File

@ -1,10 +1,8 @@
# -*- encoding: utf-8 -*- # -*- encoding: utf-8 -*-
$:.push File.expand_path("../lib", __FILE__)
require "guard/jasmine-headless-webkit/version"
Gem::Specification.new do |s| Gem::Specification.new do |s|
s.name = "guard-jasmine-headless-webkit" s.name = "guard-jasmine-headless-webkit"
s.version = Guard::JasmineHeadlessWebkitVersion::VERSION s.version = '0.4.0.rc1'
s.platform = Gem::Platform::RUBY s.platform = Gem::Platform::RUBY
s.authors = ["John Bintz"] s.authors = ["John Bintz"]
s.email = ["john@coswellproductions.com"] s.email = ["john@coswellproductions.com"]
@ -19,6 +17,7 @@ Gem::Specification.new do |s|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) } s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
s.require_paths = ["lib"] s.require_paths = ["lib"]
s.add_dependency 'guard', '>= 0.4.0' s.add_runtime_dependency 'guard', '>= 0.4.0'
s.add_dependency 'jasmine-headless-webkit', '>= 0.3.0' s.add_runtime_dependency 'jasmine-headless-webkit', '>= 0.7.0'
end end

View File

@ -1,18 +1,32 @@
require 'guard' require 'guard'
require 'guard/guard' require 'guard/guard'
require 'guard/jasmine-headless-webkit/runner' require 'coffee-script'
module Guard module Guard
class JasmineHeadlessWebkit < Guard class JasmineHeadlessWebkit < Guard
autoload :Runner, 'guard/jasmine-headless-webkit/runner'
DEFAULT_EXTENSIONS = %w{js coffee} DEFAULT_EXTENSIONS = %w{js coffee}
def initialize(watchers = [], options = {}) ALL_SPECS_MESSAGE = "Guard::JasmineHeadlessWebkit running all specs..."
super SOME_SPECS_MESSAGE = "Guard::JasmineHeadlessWebkit running the following: %s"
@options = {
attr_reader :files_to_rerun
DEFAULT_OPTIONS = {
:all_on_start => true, :all_on_start => true,
:run_before => false, :run_before => false,
:valid_extensions => DEFAULT_EXTENSIONS :valid_extensions => DEFAULT_EXTENSIONS
}.merge(options) }
def initialize(watchers = [], options = {})
super
@options = DEFAULT_OPTIONS.merge(options)
@filtered_options = options
DEFAULT_OPTIONS.keys.each { |key| @filtered_options.delete(key) }
@files_to_rerun = []
end end
def start def start
@ -20,20 +34,23 @@ module Guard
run_all if @options[:all_on_start] run_all if @options[:all_on_start]
end end
def reload
@files_to_rerun = []
UI.info "Resetting Guard::JasmineHeadlessWebkit failed files..."
end
def run_all def run_all
UI.info "Guard::JasmineHeadlessWebkit running all specs..." run_something_and_rescue do
JasmineHeadlessWebkitRunner.run if run_all_things_before run_for_failed_files
@ran_before = false end
end end
def run_on_change(paths) def run_on_change(paths)
paths = filter_paths(paths) run_something_and_rescue do
@ran_before = false if !(paths = filter_paths(paths)).empty?
if run_all_things_before paths = (paths + @files_to_rerun).uniq
@ran_before = true
if !paths.empty? run_for_failed_files(paths)
UI.info "Guard::JasmineHeadlessWebkit running the following: #{paths.join(' ')}"
JasmineHeadlessWebkitRunner.run(paths)
else else
run_all run_all
end end
@ -41,45 +58,45 @@ module Guard
end end
private private
def run_for_failed_files(paths = [])
if paths.empty?
UI.info(ALL_SPECS_MESSAGE)
else
UI.info(SOME_SPECS_MESSAGE % paths.join(' '))
end
failed_files = Runner.run(paths, @filtered_options)
@files_to_rerun = failed_files || paths
failed_files && @files_to_rerun.empty?
end
def filter_paths(paths) def filter_paths(paths)
paths.find_all { |path| File.extname(path)[valid_extensions] } paths.collect { |path| Dir[path] }.flatten.find_all { |path| File.extname(path)[valid_extensions] }.collect { |path| File.expand_path(path) }.uniq
end end
def valid_extensions def valid_extensions
%r{\.(#{@options[:valid_extensions].join('|')})$} %r{\.(#{@options[:valid_extensions].join('|')})$}
end end
def run_before
run_a_thing_before(:run_before, @options[:run_before])
end
def run_jammit
$stderr.puts "Jammit support is deprecated and will be removed in the future. Use guard-jammit instead." if @options[:jammit]
run_a_thing_before(:jammit, "Jammit", %{jammit -f 2>/dev/null})
end
def run_rails_assets
run_a_thing_before(:rails_assets, "Rails Assets", %{rake assets:precompile:for_testing})
end
def run_a_thing_before(option, *args)
if @options[option] && !@ran_before
run_program(*args)
else
true
end
end
def run_all_things_before
run_before and run_rails_assets and run_jammit
end
def run_program(name, command = nil) def run_program(name, command = nil)
command ||= name command ||= name
UI.info "Guard::JasmineHeadlessWebkit running #{name}..." UI.info "Guard::JasmineHeadlessWebkit running #{name}..."
system command system command
$?.exitstatus == 0 $?.exitstatus == 0
end end
def run_something_and_rescue
yield
rescue ::CoffeeScript::CompilationError
rescue StandardError => e
if ENV['GUARD_ENV'] == 'test'
raise e
else
puts e.message
puts e.backtrace.join("\n")
puts
end
end
end end
class Dsl class Dsl

View File

@ -1,37 +1,60 @@
require 'guard/notifier' require 'guard/notifier'
require 'jasmine/headless/runner' require 'jasmine-headless-webkit'
module Guard module Guard
class JasmineHeadlessWebkitRunner class JasmineHeadlessWebkit
class << self class Runner
def run(paths = []) def self.run(paths = [], options = {})
report_file = notify_report_file
options = options.merge(:reporters => process_reporters(options[:reporters], report_file), :colors => true, :files => paths)
Jasmine::Headless::Runner.run(options)
notify(report_file)
end
def self.notify_report_file
file = Tempfile.new('guard-jasmine-headless-webkit') file = Tempfile.new('guard-jasmine-headless-webkit')
file.close file.close
file.path
Jasmine::Headless::Runner.run(:report => file.path, :colors => true, :files => paths)
notify(file.path)
end end
def notify(file) def self.process_reporters(reporters, report_file)
if (data = File.read(file).strip).empty? reporters ||= 'Console'
Notifier.notify('Spec runner interrupted!', :title => 'Jasmine results', :image => :failed)
out = []
reporters.split(' ').each do |reporter|
name, file = reporter.split(':', 2)
out << [ name ]
out.last << file if file && !file.empty?
end
out + [ [ 'File', report_file ] ]
end
def self.notify(file)
if (report = Jasmine::Headless::Report.load(file)).valid?
Notifier.notify(message(report.total, report.failed, report.time, report.has_used_console?), :title => 'Jasmine results', :image => image(report.has_used_console?, report.failed))
report.failed_files
else else
total, fails, any_console, secs = File.read(file).strip.split('/') raise Jasmine::Headless::InvalidReport
Notifier.notify(message(total, fails, secs, any_console == "T"), :title => 'Jasmine results', :image => image(any_console == "T", fails))
fails.to_i
end end
rescue Jasmine::Headless::InvalidReport => e
Notifier.notify('Spec runner interrupted!', :title => 'Jasmine results', :image => :failed)
false
end end
private private
def message(total, fails, secs, any_console) def self.message(total, fails, secs, any_console)
total_word = (total.to_i == 1) ? "test" : "tests" total_word = (total.to_i == 1) ? "test" : "tests"
"#{total} #{total_word}, #{fails} failures, #{secs} secs#{any_console ? ', console.log used' : ''}." "#{total} #{total_word}, #{fails} failures, #{secs} secs#{any_console ? ', console.log used' : ''}."
end end
def image(any_console, fails) def self.image(any_console, fails)
if any_console if any_console
:pending :pending
else else
@ -45,4 +68,3 @@ module Guard
end end
end end
end end

View File

@ -1,4 +1,4 @@
# Run JS and CoffeeScript files in a typical Rails 3.1 fashion, placing Underscore templates in app/views/*.jst # Run JS and CoffeeScript files in a typical Rails 3.1/Sprockets fashion.
# Your spec files end with _spec.{js,coffee}. # Your spec files end with _spec.{js,coffee}.
spec_location = "spec/javascripts/%s_spec" spec_location = "spec/javascripts/%s_spec"
@ -7,9 +7,7 @@ spec_location = "spec/javascripts/%s_spec"
# spec_location = "spec/javascripts/%sSpec" # spec_location = "spec/javascripts/%sSpec"
guard 'jasmine-headless-webkit' do guard 'jasmine-headless-webkit' do
watch(%r{^app/views/.*\.jst$}) watch(%r{^(app|lib|vendor)/assets/javascripts/(.*)$}) { |m| newest_js_file(spec_location % m[1]) }
watch(%r{^public/javascripts/(.*)\.js$}) { |m| newest_js_file(spec_location % m[1]) } watch(%r{^spec/javascripts/(.*)[Ss]pec\..*}) { |m| newest_js_file(spec_location % m[1]) }
watch(%r{^app/assets/javascripts/(.*)\.(js|coffee)$}) { |m| newest_js_file(spec_location % m[1]) }
watch(%r{^spec/javascripts/(.*)_spec\..*}) { |m| newest_js_file(spec_location % m[1]) }
end end

View File

@ -1,5 +0,0 @@
module Guard
module JasmineHeadlessWebkitVersion
VERSION = "0.1.1"
end
end

11
script/gemfile Executable file
View File

@ -0,0 +1,11 @@
#!/usr/bin/env ruby
require 'rubygems'
require 'penchant'
if Penchant::Gemfile.do_full_env_switch!(ARGV[0])
puts "Gemfile switched to #{ARGV[0]}"
else
exit 0
end

15
script/hooks/pre-commit Executable file
View File

@ -0,0 +1,15 @@
#!/bin/bash
OLD_GIT_DIR=$GIT_DIR
if [ "$(penchant gemfile-env)" != "remote" ]; then
unset GIT_DIR
penchant gemfile remote
GIT_DIR=$OLD_GIT_DIR
git add Gemfile*
fi
bundle exec rake
R=$?
if [ $R -ne 0 ]; then exit $R; fi

35
script/initialize-environment Executable file
View File

@ -0,0 +1,35 @@
#!/usr/bin/env ruby
if File.file?('Gemfile.erb')
pwd = Dir.pwd
Dir.chdir '..' do
File.readlines(File.join(pwd, 'Gemfile.erb')).find_all { |line| line[':git'] }.each do |line|
repo = line[%r{:git => (['"])(.*)\1}, 2]
puts "Installing #{repo}"
system %{git clone #{repo}}
end
end
puts "Bundling for local environment"
system %{script/gemfile local}
else
puts "Bundling..."
system %{bundle}
end
puts "Installing git hooks"
system %{script/install-git-hooks}
bundle = File.file?('Gemfile') ? 'bundle exec' : ''
command = [ bundle, 'rake', '-s', '-T', 'bootstrap' ]
if !(%x{#{command.join(' ')}}).empty?
puts "Trying to run rake bootstrap..."
system %{#{bundle} rake bootstrap}
end
puts "Done!"

6
script/install-git-hooks Executable file
View File

@ -0,0 +1,6 @@
#!/bin/bash
for hook in script/hooks/* ; do
ln -sf $PWD/$hook .git/hooks/${hook##*/}
done

View File

@ -1,8 +1,44 @@
require 'spec_helper' require 'spec_helper'
require 'guard/jasmine-headless-webkit/runner'
require 'fakefs/spec_helpers'
describe Guard::JasmineHeadlessWebkitRunner do describe Guard::JasmineHeadlessWebkit::Runner do
describe '.run' do
let(:reporter) { 'reporter' }
before do
described_class.stubs(:process_reporters).returns([ reporter ])
end
it 'should pass along options' do
Jasmine::Headless::Runner.expects(:run).with(all_of(has_key(:full_run), has_entry(:reporters => [ reporter ])))
Guard::JasmineHeadlessWebkit::Runner.run([], :full_run => false)
end
end
describe '.process_reporters' do
subject { described_class.process_reporters(reporters, report_file) }
let(:report_file) { 'report file' }
context 'none provided' do
let(:reporters) { nil }
it { should == [ [ 'Console' ], [ 'File', report_file ] ] }
end
context 'one provided' do
let(:reporters) { 'One' }
it { should == [ [ 'One' ], [ 'File', report_file ] ] }
end
context 'two provided' do
let(:reporters) { 'One Two:file.txt' }
it { should == [ [ 'One' ], [ 'Two', 'file.txt' ], [ 'File', report_file ] ] }
end
end
describe '.notify' do describe '.notify' do
include FakeFS::SpecHelpers include FakeFS::SpecHelpers
@ -13,12 +49,25 @@ describe Guard::JasmineHeadlessWebkitRunner do
end end
context 'system run not interrupted' do context 'system run not interrupted' do
let(:data) { '1/0/F/5' } let(:data) { 'TOTAL||1||0||5||F' }
it 'should notify with the right information' do it 'should notify with the right information' do
Guard::Notifier.expects(:notify).with("1 test, 0 failures, 5 secs.", { :title => 'Jasmine results', :image => :success }) Guard::Notifier.expects(:notify).with("1 test, 0 failures, 5.0 secs.", { :title => 'Jasmine results', :image => :success })
Guard::JasmineHeadlessWebkitRunner.notify(file) Guard::JasmineHeadlessWebkit::Runner.notify(file).should == []
end
end
context 'with failures' do
let(:data) { <<-REPORT }
FAIL||Test||Two||file.js:50
TOTAL||1||1||5||F
REPORT
it 'should notify with the right information' do
Guard::Notifier.expects(:notify).with("1 test, 1 failures, 5.0 secs.", { :title => 'Jasmine results', :image => :failed })
Guard::JasmineHeadlessWebkit::Runner.notify(file).should == [ 'file.js' ]
end end
end end
@ -28,7 +77,7 @@ describe Guard::JasmineHeadlessWebkitRunner do
it 'should notify failure' do it 'should notify failure' do
Guard::Notifier.expects(:notify).with("Spec runner interrupted!", { :title => 'Jasmine results', :image => :failed }) Guard::Notifier.expects(:notify).with("Spec runner interrupted!", { :title => 'Jasmine results', :image => :failed })
Guard::JasmineHeadlessWebkitRunner.notify(file) Guard::JasmineHeadlessWebkit::Runner.notify(file).should be_false
end end
end end
end end

View File

@ -1,5 +1,4 @@
require 'spec_helper' require 'spec_helper'
require 'guard/jasmine-headless-webkit'
describe Guard::JasmineHeadlessWebkit do describe Guard::JasmineHeadlessWebkit do
let(:guard) { Guard::JasmineHeadlessWebkit.new([], options) } let(:guard) { Guard::JasmineHeadlessWebkit.new([], options) }
@ -26,127 +25,158 @@ describe Guard::JasmineHeadlessWebkit do
end end
end end
describe '#run_on_change' do describe '#run_all' do
context 'jhw call fails' do before do
it "should not run all" do guard.stubs(:run_all_things_before).returns(true)
Guard::JasmineHeadlessWebkitRunner.expects(:run).returns(1) end
guard.expects(:run_all).never
guard.run_on_change(%w{test.js}) context 'fails' do
it 'should return false' do
Guard::JasmineHeadlessWebkit::Runner.stubs(:run).returns(['file.js'])
guard.run_all.should be_false
guard.files_to_rerun.should == ['file.js']
end
end
context 'succeeds' do
it 'should return true' do
Guard::JasmineHeadlessWebkit::Runner.stubs(:run).returns([])
guard.run_all.should be_true
guard.files_to_rerun.should == []
end
end
context 'pass along jhw options' do
let(:options) { { :all_on_start => false, :full_run => false } }
it 'should only pass along jhw options' do
Guard::JasmineHeadlessWebkit::Runner.expects(:run).with([], :full_run => false)
guard.run_all
end
end
end
describe '#run_on_change' do
include FakeFS::SpecHelpers
let(:one_file) { %w{test.js} }
def absolute(file)
case file
when Array
file.collect { |f| absolute(f) }
else
File.expand_path(file)
end
end
before do
File.open(one_file.first, 'wb')
end
context 'two files' do
it "should only run one" do
Guard::JasmineHeadlessWebkit::Runner.expects(:run).with(absolute(one_file), {}).returns(one_file)
guard.run_on_change(%w{test.js test.js}).should be_false
guard.files_to_rerun.should == one_file
end
end
context 'one file no priors' do
it "should not run all" do
Guard::JasmineHeadlessWebkit::Runner.expects(:run).returns(one_file)
guard.run_on_change(one_file).should be_false
guard.files_to_rerun.should == one_file
end
end
context 'one file one prior' do
it "should not run all" do
guard.instance_variable_set(:@files_to_rerun, [ "two.js" ])
Guard::JasmineHeadlessWebkit::Runner.expects(:run).with(absolute(one_file) + [ "two.js" ], {}).returns(one_file)
guard.run_on_change(one_file).should be_false
guard.files_to_rerun.should == one_file
end
end
context 'failed hard' do
it "should not run all" do
guard.instance_variable_set(:@files_to_rerun, absolute(one_file))
Guard::JasmineHeadlessWebkit::Runner.expects(:run).with(absolute(one_file), {}).returns(false)
guard.run_on_change(one_file).should be_false
guard.files_to_rerun.should == absolute(one_file)
end end
end end
context 'succeed, but still do not run all' do context 'succeed, but still do not run all' do
it "should run all" do it "should run all" do
Guard::JasmineHeadlessWebkitRunner.expects(:run).returns(0) Guard::JasmineHeadlessWebkit::Runner.expects(:run).returns([])
guard.expects(:run_all).never
guard.run_on_change(%w{test.js}) guard.run_on_change(one_file).should be_true
guard.files_to_rerun.should == []
end end
end end
context 'no files given, just run all' do context 'no files given, just run all' do
it 'should run all but not run once' do it 'should run all but not run once' do
Guard::JasmineHeadlessWebkitRunner.expects(:run).never Guard::JasmineHeadlessWebkit::Runner.expects(:run).never
guard.expects(:run_all).once guard.expects(:run_all).once.returns(true)
guard.run_on_change([]) guard.run_on_change([]).should be_true
guard.files_to_rerun.should == []
end end
end end
context "Files I don't care about given, ignore" do context "Files I don't care about given, ignore" do
it 'should run all but not run once' do it 'should run all but not run once' do
Guard::JasmineHeadlessWebkitRunner.expects(:run).never Guard::JasmineHeadlessWebkit::Runner.expects(:run).never
guard.expects(:run_all).once guard.expects(:run_all).once
guard.run_on_change(%w{test.jst}) guard.run_on_change(%w{test.jst})
end guard.files_to_rerun.should == []
end end
end end
context 'with run_before' do context 'glob given' do
context 'with failing command' do let(:files) { %w{file1.js file2.js other.js} }
before do before do
Guard::JasmineHeadlessWebkitRunner.expects(:run).never files.each { |file| File.open(file, 'wb') }
Guard::UI.expects(:info).with(regexp_matches(/false/))
Guard::UI.expects(:info).with(regexp_matches(/running all/))
end end
let(:options) { { :run_before => 'false' } } context 'not a duplicate' do
it 'should expand the glob' do
Guard::JasmineHeadlessWebkit::Runner.expects(:run).with(absolute(%w{file1.js file2.js}), {}).returns(false)
it "should run the command first" do guard.run_on_change(%w{file*.js})
guard.run_all
end end
end end
context 'with succeeding command' do context 'a duplicate' do
before do it 'should expand the glob and uniq' do
Guard::JasmineHeadlessWebkitRunner.expects(:run).once guard.instance_variable_set(:@files_to_rerun, absolute(%w{file1.js}))
Guard::UI.expects(:info).with(regexp_matches(/true/)) Guard::JasmineHeadlessWebkit::Runner.expects(:run).with(absolute(%w{file1.js file2.js}), {}).returns(false)
Guard::UI.expects(:info).with(regexp_matches(/running all/))
guard.run_on_change(%w{file*.js})
end end
let(:options) { { :run_before => 'true' } }
it "should run the command first" do
guard.run_all
end end
end end
end end
describe 'run jammit first' do describe '#reload' do
context 'run on run_all if called first' do it 'should reset the state of the files_to_rerun' do
before do Guard::UI.expects(:info).with(regexp_matches(/Resetting/))
guard.expects(:run_program).once.with('Jammit', regexp_matches(/jammit/)).returns(true)
Guard::JasmineHeadlessWebkitRunner.expects(:run).once
end
let(:options) { { :jammit => true } } guard.instance_variable_set(:@files_to_rerun, "test")
guard.reload
it "should run jammit first" do guard.files_to_rerun.should == []
guard.run_all
end
end
context 'only run once if run_on_change is successful' do
before do
guard.expects(:run_program).once.with('Jammit', regexp_matches(/jammit/)).returns(true)
Guard::JasmineHeadlessWebkitRunner.expects(:run).once.returns(0)
end
let(:options) { { :jammit => true } }
it "should run jammit only once" do
guard.run_on_change(%w{path.js})
end
end
end
describe 'run rails_assets first' do
context 'run on run_all if called first' do
before do
guard.expects(:run_program).with('Rails Assets', regexp_matches(/assets:precompile:for_testing/)).once.returns(true)
Guard::JasmineHeadlessWebkitRunner.expects(:run).once
end
let(:options) { { :rails_assets => true } }
it "should run rails assets first" do
guard.run_all
end
end
context 'only run once if run_on_change is successful' do
before do
guard.expects(:run_program).with('Rails Assets', regexp_matches(/assets:precompile:for_testing/)).once.returns(true)
Guard::JasmineHeadlessWebkitRunner.expects(:run).once.returns(0)
end
let(:options) { { :rails_assets => true } }
it "should run rails assets only once" do
guard.run_on_change(%w{path.js})
end
end end
end end
end end

View File

@ -1,10 +1,14 @@
require 'mocha' require 'mocha'
require 'guard' require 'guard'
require 'guard/jasmine-headless-webkit'
require 'fakefs/spec_helpers'
RSpec.configure do |config| RSpec.configure do |config|
config.mock_with :mocha config.mock_with :mocha
end end
ENV['GUARD_ENV'] = 'test'
module Guard module Guard
module UI module UI
class << self class << self