guard-motion 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +19 -0
- data/.travis.yml +2 -0
- data/Gemfile +8 -0
- data/Guardfile +9 -0
- data/LICENSE +22 -0
- data/README.md +99 -0
- data/Rakefile +7 -0
- data/guard-motion.gemspec +24 -0
- data/lib/guard/motion.rb +87 -0
- data/lib/guard/motion/runner.rb +95 -0
- data/lib/guard/motion/tasks.rb +21 -0
- data/lib/guard/motion/templates/Guardfile +9 -0
- data/lib/guard/motion/version.rb +5 -0
- data/spec/fixtures/bundler/Gemfile +3 -0
- data/spec/guard/motion/runner_spec.rb +140 -0
- data/spec/guard/motion_spec.rb +145 -0
- data/spec/spec_helper.rb +17 -0
- metadata +121 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Fabio Kuhn
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
# Guard::Motion [](http://travis-ci.org/mordaroso/guard-motion)
|
2
|
+
|
3
|
+
Motion guard allows to automatically & intelligently launch [RubyMotion](http://www.rubymotion.com/) specs when files are modified.
|
4
|
+
|
5
|
+
## Install
|
6
|
+
|
7
|
+
Please be sure to have [Guard](https://github.com/guard/guard) installed before continue.
|
8
|
+
|
9
|
+
Install the gem:
|
10
|
+
|
11
|
+
```
|
12
|
+
$ gem install guard-motion
|
13
|
+
```
|
14
|
+
|
15
|
+
Add it to your Gemfile (inside development group):
|
16
|
+
|
17
|
+
``` ruby
|
18
|
+
gem 'guard-motion'
|
19
|
+
```
|
20
|
+
|
21
|
+
Add guard definition to your Guardfile by running this command:
|
22
|
+
|
23
|
+
```
|
24
|
+
$ guard init motion
|
25
|
+
```
|
26
|
+
|
27
|
+
Make sure Guard::Motion is loaded in your project Rakefile:
|
28
|
+
|
29
|
+
``` ruby
|
30
|
+
require 'guard/motion'
|
31
|
+
```
|
32
|
+
|
33
|
+
## Usage
|
34
|
+
|
35
|
+
Please read [Guard usage doc](https://github.com/guard/guard#readme)
|
36
|
+
|
37
|
+
## Guardfile
|
38
|
+
|
39
|
+
Motion guard can be really adapted to all kind of project setup.
|
40
|
+
|
41
|
+
### Typical RubyMotion App
|
42
|
+
|
43
|
+
``` ruby
|
44
|
+
guard 'motion' do
|
45
|
+
watch(%r{^spec/.+_spec\.rb$})
|
46
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
### Typical RubyMotion library
|
51
|
+
|
52
|
+
``` ruby
|
53
|
+
guard 'motion' do
|
54
|
+
watch(%r{^spec/.+_spec\.rb$})
|
55
|
+
watch(%r{^lib/[^/]+/(.+)\.rb$}) { |m| "./spec/#{m[1]}_spec.rb" }
|
56
|
+
end
|
57
|
+
```
|
58
|
+
|
59
|
+
Please read [Guard doc](https://github.com/guard/guard#readme) for more information about the Guardfile DSL.
|
60
|
+
|
61
|
+
## Options
|
62
|
+
|
63
|
+
By default, Guard::Motion will only look for spec files within `spec` in your project root. You can configure Guard::Motion to look in additional paths by using the `:spec_paths` option:
|
64
|
+
|
65
|
+
``` ruby
|
66
|
+
guard 'motion', :spec_paths => ["spec", "vendor/other_project/spec"] do
|
67
|
+
# ...
|
68
|
+
end
|
69
|
+
```
|
70
|
+
If you have only one path to look, you can configure `:spec_paths` option with a string:
|
71
|
+
|
72
|
+
``` ruby
|
73
|
+
guard 'motion', :spec_paths => "test" do
|
74
|
+
# ...
|
75
|
+
end
|
76
|
+
```
|
77
|
+
|
78
|
+
### List of available options:
|
79
|
+
|
80
|
+
``` ruby
|
81
|
+
:bundler => false # use "bundle exec" to run the rake command, default: true
|
82
|
+
:binstubs => true # use "bin/rake" to run the rake command (takes precedence over :bundle), default: false
|
83
|
+
:notification => false # display Growl (or Libnotify) notification after the specs are done running, default: true
|
84
|
+
:all_after_pass => false # run all specs after changed specs pass, default: true
|
85
|
+
:all_on_start => false # run all the specs at startup, default: true
|
86
|
+
:keep_failed => false # keep failed specs until they pass, default: true
|
87
|
+
:spec_paths => ["spec"] # specify an array of paths that contain spec files
|
88
|
+
```
|
89
|
+
|
90
|
+
You can also use a custom binstubs directory using `:binstubs => 'some-dir'`.
|
91
|
+
|
92
|
+
Development
|
93
|
+
-----------
|
94
|
+
|
95
|
+
* Source hosted at [GitHub](https://github.com/mordaroso/guard-motion)
|
96
|
+
* Report issues/Questions/Feature requests on [GitHub Issues](https://github.com/mordaroso/guard-motion/issues)
|
97
|
+
|
98
|
+
Pull requests are very welcome! Make sure your patches are well tested. Please create a topic branch for every separate change
|
99
|
+
you make.
|
data/Rakefile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/guard/motion/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["mordaroso"]
|
6
|
+
gem.email = ["mordaroso@gmail.com"]
|
7
|
+
gem.homepage = 'http://rubygems.org/gems/guard-motion'
|
8
|
+
gem.summary = 'Guard gem for RubyMotion'
|
9
|
+
gem.description = 'Guard::Motion automatically run your specs (much like autotest).'
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "guard-motion"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Guard::MotionVersion::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency 'guard', '>= 1.1.0'
|
19
|
+
gem.add_dependency 'rake', '>= 0.9'
|
20
|
+
|
21
|
+
gem.add_development_dependency 'bundler', '~> 1.1.0'
|
22
|
+
gem.add_development_dependency 'rspec', '~> 2.10'
|
23
|
+
gem.add_development_dependency 'guard-rspec', '~> 1.1'
|
24
|
+
end
|
data/lib/guard/motion.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'guard'
|
2
|
+
require 'guard/guard'
|
3
|
+
|
4
|
+
require 'guard/motion/tasks'
|
5
|
+
|
6
|
+
module Guard
|
7
|
+
class Motion < Guard
|
8
|
+
autoload :Runner, 'guard/motion/runner'
|
9
|
+
|
10
|
+
# Initialize a Guard.
|
11
|
+
# @param [Array<Guard::Watcher>] watchers the Guard file watchers
|
12
|
+
# @param [Hash] options the custom Guard options
|
13
|
+
def initialize(watchers = [], options = {})
|
14
|
+
super
|
15
|
+
@options = {
|
16
|
+
:all_after_pass => true,
|
17
|
+
:all_on_start => true,
|
18
|
+
:keep_failed => true,
|
19
|
+
:spec_paths => ["spec"]
|
20
|
+
}.merge(options)
|
21
|
+
@last_failed = false
|
22
|
+
@failed_paths = []
|
23
|
+
|
24
|
+
@runner = Runner.new(@options)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Call once when Guard starts. Please override initialize method to init stuff.
|
28
|
+
# @raise [:task_has_failed] when start has failed
|
29
|
+
def start
|
30
|
+
UI.info "Guard::Motion is running"
|
31
|
+
run_all if @options[:all_on_start]
|
32
|
+
end
|
33
|
+
|
34
|
+
# Called when `reload|r|z + enter` is pressed.
|
35
|
+
# This method should be mainly used for "reload" (really!) actions like reloading passenger/spork/bundler/...
|
36
|
+
# @raise [:task_has_failed] when reload has failed
|
37
|
+
def reload
|
38
|
+
@failed_paths = []
|
39
|
+
end
|
40
|
+
|
41
|
+
# Called when just `enter` is pressed
|
42
|
+
# This method should be principally used for long action like running all specs/tests/...
|
43
|
+
# @raise [:task_has_failed] when run_all has failed
|
44
|
+
def run_all
|
45
|
+
passed = @runner.run
|
46
|
+
|
47
|
+
unless @last_failed = !passed
|
48
|
+
@failed_paths = []
|
49
|
+
else
|
50
|
+
throw :task_has_failed
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Called on file(s) modifications that the Guard watches.
|
55
|
+
# @param [Array<String>] paths the changes files or paths
|
56
|
+
# @raise [:task_has_failed] when run_on_change has failed
|
57
|
+
def run_on_changes(paths)
|
58
|
+
paths += @failed_paths if @options[:keep_failed]
|
59
|
+
paths.uniq!
|
60
|
+
|
61
|
+
if passed = @runner.run(paths)
|
62
|
+
remove_failed(paths)
|
63
|
+
|
64
|
+
# run all the specs if the run before this one failed
|
65
|
+
if @last_failed && @options[:all_after_pass]
|
66
|
+
@last_failed = false
|
67
|
+
run_all
|
68
|
+
end
|
69
|
+
else
|
70
|
+
@last_failed = true
|
71
|
+
add_failed(paths)
|
72
|
+
|
73
|
+
throw :task_has_failed
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
def remove_failed(paths)
|
79
|
+
@failed_paths -= paths if @options[:keep_failed]
|
80
|
+
end
|
81
|
+
|
82
|
+
def add_failed(paths)
|
83
|
+
@failed_paths += paths if @options[:keep_failed]
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Guard
|
2
|
+
class Motion
|
3
|
+
class Runner
|
4
|
+
|
5
|
+
def initialize(options = {})
|
6
|
+
@options = {
|
7
|
+
:bundler => true,
|
8
|
+
:binstubs => false,
|
9
|
+
:notification => true,
|
10
|
+
}.merge(options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def run(paths = nil, options = {})
|
14
|
+
if paths.nil?
|
15
|
+
paths = all_spec_paths
|
16
|
+
message = options[:message] || "Running all specs"
|
17
|
+
else
|
18
|
+
message = options[:message] || "Running: #{paths.join(' ')}"
|
19
|
+
end
|
20
|
+
|
21
|
+
return false if paths.empty?
|
22
|
+
|
23
|
+
UI.info(message, :reset => true)
|
24
|
+
|
25
|
+
run_via_shell rake_command(paths)
|
26
|
+
end
|
27
|
+
|
28
|
+
def rake_executable
|
29
|
+
@rake_executable ||= begin
|
30
|
+
binstubs? ? "#{binstubs}/rake" : 'rake'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def rake_command(paths)
|
35
|
+
cmd_parts = []
|
36
|
+
cmd_parts << "bundle exec" if bundle_exec?
|
37
|
+
cmd_parts << rake_executable
|
38
|
+
cmd_parts << "spec:specific[\"#{paths.join(';')}\"]"
|
39
|
+
cmd_parts.compact.join(' ')
|
40
|
+
end
|
41
|
+
|
42
|
+
def run_via_shell(command)
|
43
|
+
success = system(command)
|
44
|
+
|
45
|
+
if @options[:notification] && !success
|
46
|
+
Notifier.notify("Failed", :title => "Motion spec results", :image => :failed, :priority => 2)
|
47
|
+
end
|
48
|
+
|
49
|
+
success
|
50
|
+
end
|
51
|
+
|
52
|
+
def all_spec_paths
|
53
|
+
@options[:spec_paths].map { |spec_path|
|
54
|
+
Dir.glob("#{spec_path}/**/*_spec.rb")
|
55
|
+
}.flatten
|
56
|
+
end
|
57
|
+
|
58
|
+
def bundler_allowed?
|
59
|
+
if @bundler_allowed.nil?
|
60
|
+
@bundler_allowed = File.exist?("#{Dir.pwd}/Gemfile")
|
61
|
+
else
|
62
|
+
@bundler_allowed
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def bundler?
|
67
|
+
if @bundler.nil?
|
68
|
+
@bundler = bundler_allowed? && @options[:bundler]
|
69
|
+
else
|
70
|
+
@bundler
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def binstubs?
|
75
|
+
if @binstubs.nil?
|
76
|
+
@binstubs = !!@options[:binstubs]
|
77
|
+
else
|
78
|
+
@binstubs
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def binstubs
|
83
|
+
if @options[:binstubs] == true
|
84
|
+
"bin"
|
85
|
+
else
|
86
|
+
@options[:binstubs]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def bundle_exec?
|
91
|
+
bundler? && !binstubs?
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# include rake task spec:specific only if included in a rake file
|
2
|
+
if Kernel.const_defined?(:Rake)
|
3
|
+
desc "Run a specific list of motion specs"
|
4
|
+
namespace :spec do
|
5
|
+
task :specific, :files do |task, args|
|
6
|
+
files = args[:files]
|
7
|
+
|
8
|
+
if files.nil? || files.empty?
|
9
|
+
puts "No spec file passed to the task."
|
10
|
+
puts "Please run the task like this: `rake spec:specific[./spec/app_delegate_spec.rb;./spec/other_spec.rb]`"
|
11
|
+
exit 1
|
12
|
+
end
|
13
|
+
|
14
|
+
App.config.spec_mode = true
|
15
|
+
spec_files = App.config.spec_files.select{|file_path| !(file_path =~ /_spec.rb$/)}
|
16
|
+
spec_files += files.split(';')
|
17
|
+
App.config.instance_variable_set("@spec_files", spec_files)
|
18
|
+
Rake::Task["simulator"].invoke
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Guard
|
4
|
+
class Motion
|
5
|
+
|
6
|
+
describe Runner do
|
7
|
+
subject { described_class.new }
|
8
|
+
|
9
|
+
describe '#run' do
|
10
|
+
context 'when passed an empty paths list' do
|
11
|
+
it 'returns false' do
|
12
|
+
subject.run([]).should be_false
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'in a folder without Bundler' do
|
17
|
+
before do
|
18
|
+
Dir.stub(:pwd).and_return(@fixture_path.join('empty'))
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'runs without bundler' do
|
22
|
+
subject.should_receive(:system).with(
|
23
|
+
"rake spec:specific[\"something\"]"
|
24
|
+
).and_return(true)
|
25
|
+
|
26
|
+
subject.run(['something'])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context 'in a folder with Bundler' do
|
31
|
+
before do
|
32
|
+
Dir.stub(:pwd).and_return(@fixture_path.join('bundler'))
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'runs with Bundler' do
|
36
|
+
subject.should_receive(:system).with(
|
37
|
+
"bundle exec rake spec:specific[\"something\"]"
|
38
|
+
).and_return(true)
|
39
|
+
|
40
|
+
subject.run(['something'])
|
41
|
+
end
|
42
|
+
|
43
|
+
describe 'notification' do
|
44
|
+
it 'notifies when Motion specs fails to execute' do
|
45
|
+
subject.should_receive(:rake_command) { "`exit 1`" }
|
46
|
+
::Guard::Notifier.should_receive(:notify).with(
|
47
|
+
'Failed', :title => 'Motion spec results', :image => :failed, :priority => 2
|
48
|
+
)
|
49
|
+
|
50
|
+
subject.run(['spec'])
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'does not notify that Motion specs failed when the specs pass' do
|
54
|
+
subject.should_receive(:rake_command) { "`exit 0`" }
|
55
|
+
::Guard::Notifier.should_not_receive(:notify)
|
56
|
+
|
57
|
+
subject.run(['spec'])
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe 'options' do
|
62
|
+
|
63
|
+
describe ':bundler' do
|
64
|
+
context ':bundler => false' do
|
65
|
+
subject { described_class.new(:bundler => false) }
|
66
|
+
|
67
|
+
it 'runs without Bundler' do
|
68
|
+
subject.should_receive(:system).with(
|
69
|
+
"rake spec:specific[\"spec\"]"
|
70
|
+
).and_return(true)
|
71
|
+
|
72
|
+
subject.run(['spec'])
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe ':binstubs' do
|
78
|
+
context ':bundler => false, :binstubs => true' do
|
79
|
+
subject { described_class.new(:bundler => false, :binstubs => true) }
|
80
|
+
|
81
|
+
it 'runs without Bundler and with binstubs' do
|
82
|
+
subject.should_receive(:system).with(
|
83
|
+
"bin/rake spec:specific[\"spec\"]"
|
84
|
+
).and_return(true)
|
85
|
+
|
86
|
+
subject.run(['spec'])
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context ':bundler => true, :binstubs => true' do
|
91
|
+
subject { described_class.new(:bundler => true, :binstubs => true) }
|
92
|
+
|
93
|
+
it 'runs without Bundler and binstubs' do
|
94
|
+
subject.should_receive(:system).with(
|
95
|
+
"bin/rake spec:specific[\"spec\"]"
|
96
|
+
).and_return(true)
|
97
|
+
|
98
|
+
subject.run(['spec'])
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context ':bundler => true, :binstubs => "dir"' do
|
103
|
+
subject { described_class.new(:bundler => true, :binstubs => 'dir') }
|
104
|
+
|
105
|
+
it 'runs without Bundler and binstubs in custom directory' do
|
106
|
+
subject.should_receive(:system).with(
|
107
|
+
"dir/rake spec:specific[\"spec\"]"
|
108
|
+
).and_return(true)
|
109
|
+
|
110
|
+
subject.run(['spec'])
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe ':notification' do
|
116
|
+
context ':notification => false' do
|
117
|
+
subject { described_class.new(:notification => false) }
|
118
|
+
|
119
|
+
it 'runs without notification formatter' do
|
120
|
+
subject.should_receive(:system).with(
|
121
|
+
"bundle exec rake spec:specific[\"spec\"]"
|
122
|
+
).and_return(true)
|
123
|
+
|
124
|
+
subject.run(['spec'])
|
125
|
+
end
|
126
|
+
|
127
|
+
it "doesn't notify when specs fails" do
|
128
|
+
subject.should_receive(:system) { mock('res', :success? => false, :exitstatus => 2) }
|
129
|
+
::Guard::Notifier.should_not_receive(:notify)
|
130
|
+
|
131
|
+
subject.run(['spec'])
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Guard
|
4
|
+
describe Motion do
|
5
|
+
let(:default_options) do
|
6
|
+
{
|
7
|
+
:all_after_pass => true, :all_on_start => true, :keep_failed => true,
|
8
|
+
:spec_paths => ['spec']
|
9
|
+
}
|
10
|
+
end
|
11
|
+
subject { described_class.new }
|
12
|
+
|
13
|
+
let(:runner) { mock(described_class::Runner) }
|
14
|
+
|
15
|
+
before do
|
16
|
+
described_class::Runner.stub(:new => runner)
|
17
|
+
end
|
18
|
+
|
19
|
+
shared_examples_for 'clear failed paths' do
|
20
|
+
it 'should clear the previously failed paths' do
|
21
|
+
runner.should_receive(:run).with(['spec/foo']) { false }
|
22
|
+
expect { subject.run_on_changes(['spec/foo']) }.to throw_symbol :task_has_failed
|
23
|
+
|
24
|
+
runner.should_receive(:run) { true }
|
25
|
+
expect { subject.run_all }.to_not throw_symbol # this actually clears the failed paths
|
26
|
+
|
27
|
+
runner.should_receive(:run).with(['spec/bar']) { true }
|
28
|
+
subject.run_on_changes(['spec/bar'])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '.initialize' do
|
33
|
+
it 'creates a runner' do
|
34
|
+
described_class::Runner.should_receive(:new).with(default_options.merge(:foo => :bar))
|
35
|
+
|
36
|
+
described_class.new([], :foo => :bar)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#start' do
|
41
|
+
it 'calls #run_all' do
|
42
|
+
subject.should_receive(:run_all)
|
43
|
+
subject.start
|
44
|
+
end
|
45
|
+
|
46
|
+
context ':all_on_start option is false' do
|
47
|
+
let(:subject) { subject = described_class.new([], :all_on_start => false) }
|
48
|
+
|
49
|
+
it "doesn't call #run_all" do
|
50
|
+
subject.should_not_receive(:run_all)
|
51
|
+
subject.start
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe '#run_all' do
|
57
|
+
it "runs all specs specified by the default 'spec_paths' option" do
|
58
|
+
runner.should_receive(:run) { true }
|
59
|
+
|
60
|
+
subject.run_all
|
61
|
+
end
|
62
|
+
|
63
|
+
it "throws task_has_failed if specs don't passed" do
|
64
|
+
runner.should_receive(:run) { false }
|
65
|
+
|
66
|
+
expect { subject.run_all }.to throw_symbol :task_has_failed
|
67
|
+
end
|
68
|
+
|
69
|
+
it_should_behave_like 'clear failed paths'
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#reload' do
|
73
|
+
it_should_behave_like 'clear failed paths'
|
74
|
+
end
|
75
|
+
|
76
|
+
describe '#run_on_changes' do
|
77
|
+
it 'runs rspec with paths' do
|
78
|
+
runner.should_receive(:run).with(['spec/foo']) { true }
|
79
|
+
|
80
|
+
subject.run_on_changes(['spec/foo'])
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'the changed specs pass after failing' do
|
84
|
+
it 'calls #run_all' do
|
85
|
+
runner.should_receive(:run).with(['spec/foo']) { false }
|
86
|
+
|
87
|
+
expect { subject.run_on_changes(['spec/foo']) }.to throw_symbol :task_has_failed
|
88
|
+
|
89
|
+
runner.should_receive(:run).with(['spec/foo']) { true }
|
90
|
+
subject.should_receive(:run_all)
|
91
|
+
|
92
|
+
expect { subject.run_on_changes(['spec/foo']) }.to_not throw_symbol
|
93
|
+
end
|
94
|
+
|
95
|
+
context ':all_after_pass option is false' do
|
96
|
+
subject { described_class.new([], :all_after_pass => false) }
|
97
|
+
|
98
|
+
it "doesn't call #run_all" do
|
99
|
+
runner.should_receive(:run).with(['spec/foo']) { false }
|
100
|
+
|
101
|
+
expect { subject.run_on_changes(['spec/foo']) }.to throw_symbol :task_has_failed
|
102
|
+
|
103
|
+
runner.should_receive(:run).with(['spec/foo']) { true }
|
104
|
+
subject.should_not_receive(:run_all)
|
105
|
+
|
106
|
+
expect { subject.run_on_changes(['spec/foo']) }.to_not throw_symbol
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'the changed specs pass without failing' do
|
112
|
+
it "doesn't call #run_all" do
|
113
|
+
runner.should_receive(:run).with(['spec/foo']) { true }
|
114
|
+
|
115
|
+
subject.should_not_receive(:run_all)
|
116
|
+
|
117
|
+
subject.run_on_changes(['spec/foo'])
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'keeps failed spec and rerun them later' do
|
122
|
+
subject = described_class.new([], :all_after_pass => false)
|
123
|
+
|
124
|
+
runner.should_receive(:run).with(['spec/bar']) { false }
|
125
|
+
|
126
|
+
expect { subject.run_on_changes(['spec/bar']) }.to throw_symbol :task_has_failed
|
127
|
+
|
128
|
+
runner.should_receive(:run).with(['spec/foo', 'spec/bar']) { true }
|
129
|
+
|
130
|
+
subject.run_on_changes(['spec/foo'])
|
131
|
+
|
132
|
+
runner.should_receive(:run).with(['spec/foo']) { true }
|
133
|
+
|
134
|
+
subject.run_on_changes(['spec/foo'])
|
135
|
+
end
|
136
|
+
|
137
|
+
it "throws task_has_failed if specs doesn't pass" do
|
138
|
+
runner.should_receive(:run).with(['spec/foo']) { false }
|
139
|
+
|
140
|
+
expect { subject.run_on_changes(['spec/foo']) }.to throw_symbol :task_has_failed
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
end
|
145
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'guard/motion'
|
2
|
+
require 'rspec'
|
3
|
+
|
4
|
+
ENV["GUARD_ENV"] = 'test'
|
5
|
+
|
6
|
+
Dir["#{File.expand_path('..', __FILE__)}/support/**/*.rb"].each { |f| require f }
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.color_enabled = true
|
10
|
+
config.filter_run :focus => true
|
11
|
+
config.run_all_when_everything_filtered = true
|
12
|
+
|
13
|
+
config.before(:each) do
|
14
|
+
@fixture_path = Pathname.new(File.expand_path('../fixtures/', __FILE__))
|
15
|
+
@lib_path = Pathname.new(File.expand_path('../../lib/', __FILE__))
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: guard-motion
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- mordaroso
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: guard
|
16
|
+
requirement: &70212465443740 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.1.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70212465443740
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
requirement: &70212465459540 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0.9'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70212465459540
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: bundler
|
38
|
+
requirement: &70212465459040 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 1.1.0
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70212465459040
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rspec
|
49
|
+
requirement: &70212465458440 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.10'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70212465458440
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: guard-rspec
|
60
|
+
requirement: &70212465457840 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ~>
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: '1.1'
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *70212465457840
|
69
|
+
description: Guard::Motion automatically run your specs (much like autotest).
|
70
|
+
email:
|
71
|
+
- mordaroso@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- .gitignore
|
77
|
+
- .travis.yml
|
78
|
+
- Gemfile
|
79
|
+
- Guardfile
|
80
|
+
- LICENSE
|
81
|
+
- README.md
|
82
|
+
- Rakefile
|
83
|
+
- guard-motion.gemspec
|
84
|
+
- lib/guard/motion.rb
|
85
|
+
- lib/guard/motion/runner.rb
|
86
|
+
- lib/guard/motion/tasks.rb
|
87
|
+
- lib/guard/motion/templates/Guardfile
|
88
|
+
- lib/guard/motion/version.rb
|
89
|
+
- spec/fixtures/bundler/Gemfile
|
90
|
+
- spec/guard/motion/runner_spec.rb
|
91
|
+
- spec/guard/motion_spec.rb
|
92
|
+
- spec/spec_helper.rb
|
93
|
+
homepage: http://rubygems.org/gems/guard-motion
|
94
|
+
licenses: []
|
95
|
+
post_install_message:
|
96
|
+
rdoc_options: []
|
97
|
+
require_paths:
|
98
|
+
- lib
|
99
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
101
|
+
requirements:
|
102
|
+
- - ! '>='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
requirements: []
|
112
|
+
rubyforge_project:
|
113
|
+
rubygems_version: 1.8.17
|
114
|
+
signing_key:
|
115
|
+
specification_version: 3
|
116
|
+
summary: Guard gem for RubyMotion
|
117
|
+
test_files:
|
118
|
+
- spec/fixtures/bundler/Gemfile
|
119
|
+
- spec/guard/motion/runner_spec.rb
|
120
|
+
- spec/guard/motion_spec.rb
|
121
|
+
- spec/spec_helper.rb
|