harmon-autowatchr 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jeremy Stephens
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,80 @@
1
+ = autowatchr
2
+
3
+ Provides some autotest-like behavior for watchr (http://github.com/mynyml/watchr).
4
+
5
+ == Installation
6
+
7
+ gem install autowatchr --source http://gemcutter.org
8
+
9
+ == Current features
10
+
11
+ * Auto-watches test and lib files using the autotest layout
12
+ * Optionally run only failing-tests
13
+ * Optionally run entire suite after all tests pass
14
+ * Traps INT signal (Control-C) and re-runs all tests.
15
+
16
+ == Todo
17
+
18
+ * Cucumber support
19
+ * Expose algorithm to map test classes to test files
20
+
21
+ == Example use
22
+
23
+ test.watchr
24
+ require 'autowatchr'
25
+
26
+ Autowatchr.new(self) do |config|
27
+ config.ruby = 'jruby'
28
+ config.lib_dir = 'leet_lib'
29
+ config.test_dir = 'leet_test'
30
+ end
31
+
32
+ === Configuration options
33
+ * command
34
+ * An ERB template for the command
35
+ * Default: <tt>"<%= ruby %> -I<%= include %> <% list_of_requires.each { |lib| %>-r<%= lib %> <% } %><%= predicate %>"</tt>
36
+ * ruby
37
+ * The ruby executable to use
38
+ * Default: <tt>"ruby"</tt>
39
+ * run_method
40
+ * The way the ruby files are "require"-ed.
41
+ * Two options:
42
+ * <tt>:default => ruby -e "%w[test/first_test.rb test/second_test.rb].each do |f| require f end"</tt>
43
+ * <tt>:individual => ruby "test/first_test.rb" "test/second_test.rb"</tt>
44
+ * include
45
+ * Paths to include (with -I)
46
+ * Default: <tt>".:#{self.lib_dir}:#{self.test_dir}"</tt>
47
+ * require
48
+ * Libraries to include (with -r)
49
+ * Can either be a string or an array (Ex: <tt>config.require = %w{rubygems active_support}</tt>)
50
+ * Default: <tt>nil</tt>
51
+ * lib_dir
52
+ * The lib path, where your library lives
53
+ * Default: <tt>"lib"</tt>
54
+ * test_dir
55
+ * The test path, where your tests live
56
+ * Default: <tt>"test"</tt>
57
+ * lib_re
58
+ * The regexp to use for discovering library files
59
+ * Default: <tt>'^%s.*/.*\.rb$' % self.lib_dir</tt>
60
+ * test_re
61
+ * The regexp to use for discovering library files
62
+ * Default: <tt>'^%s.*/test_.*\.rb$' % self.test_dir</tt>
63
+ * failing_only
64
+ * Run only failing tests the next time a test file is run
65
+ * Default: <tt>true</tt>
66
+ * run_suite
67
+ * Run entire test suite after failing tests pass
68
+ * Default: <tt>true</tt>
69
+
70
+ All of the config options are optional. You can also pass in a hash instead of a block. Also see: test.watchr[http://github.com/viking/autowatchr/blob/master/test.watchr].
71
+
72
+ == Copyright
73
+
74
+ Copyright (c) 2009 Jeremy Stephens. See LICENSE for details.
75
+
76
+ Many snippets were taken from ZenTest[http://github.com/seattlerb/ZenTest].
77
+
78
+ == Contributors
79
+
80
+ * Adam Grant (harmon)
data/Rakefile ADDED
@@ -0,0 +1,58 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "harmon-autowatchr"
8
+ gem.summary = %Q{Provides some autotest-like behavior for watchr}
9
+ gem.description = %Q{Fork of viking's autowatchr library to fix some issues and add some features. Provides some autotest-like behavior for watchr (http://github.com/mynyml/watchr).}
10
+ gem.email = "harmon@harmonius.net"
11
+ gem.homepage = "http://github.com/harmon/autowatchr"
12
+ gem.authors = ["Jeremy Stephens", "Adam Grant"]
13
+ gem.add_dependency "watchr"
14
+ gem.add_development_dependency "mocha"
15
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
+ end
17
+ Jeweler::GemcutterTasks.new
18
+ rescue LoadError
19
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
20
+ end
21
+
22
+ require 'rake/testtask'
23
+ Rake::TestTask.new(:test) do |test|
24
+ test.libs << 'lib' << 'test'
25
+ test.pattern = 'test/test_*.rb'
26
+ test.verbose = true
27
+ end
28
+
29
+ begin
30
+ require 'rcov/rcovtask'
31
+ Rcov::RcovTask.new do |test|
32
+ test.libs << 'test'
33
+ test.pattern = 'test/test_*.rb'
34
+ test.verbose = true
35
+ end
36
+ rescue LoadError
37
+ task :rcov do
38
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
39
+ end
40
+ end
41
+
42
+ task :test => :check_dependencies
43
+
44
+ task :default => :test
45
+
46
+ require 'rake/rdoctask'
47
+ Rake::RDocTask.new do |rdoc|
48
+ if File.exist?('VERSION')
49
+ version = File.read('VERSION')
50
+ else
51
+ version = ""
52
+ end
53
+
54
+ rdoc.rdoc_dir = 'rdoc'
55
+ rdoc.title = "autowatchr #{version}"
56
+ rdoc.rdoc_files.include('README*')
57
+ rdoc.rdoc_files.include('lib/*.rb')
58
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.5
@@ -0,0 +1,73 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{harmon-autowatchr}
8
+ s.version = "0.1.5"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jeremy Stephens", "Adam Grant"]
12
+ s.date = %q{2010-12-14}
13
+ s.description = %q{Fork of viking's autowatchr library to fix some issues and add some features. Provides some autotest-like behavior for watchr (http://github.com/mynyml/watchr).}
14
+ s.email = %q{harmon@harmonius.net}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "autowatchr.gemspec",
26
+ "lib/autowatchr.rb",
27
+ "test.watchr",
28
+ "test/fixtures/lib/bar.rb",
29
+ "test/fixtures/lib/foo.rb",
30
+ "test/fixtures/results/all.txt",
31
+ "test/fixtures/results/bar_flunk.txt",
32
+ "test/fixtures/results/bar_pass.txt",
33
+ "test/fixtures/results/foo.txt",
34
+ "test/fixtures/results/foo_flunk.txt",
35
+ "test/fixtures/results/foo_pass.txt",
36
+ "test/fixtures/test.watchr",
37
+ "test/fixtures/test/helper.rb",
38
+ "test/fixtures/test/test_bar.rb",
39
+ "test/fixtures/test/test_foo.rb",
40
+ "test/helper.rb",
41
+ "test/test_autowatchr.rb"
42
+ ]
43
+ s.homepage = %q{http://github.com/harmon/autowatchr}
44
+ s.require_paths = ["lib"]
45
+ s.rubygems_version = %q{1.3.7}
46
+ s.summary = %q{Provides some autotest-like behavior for watchr}
47
+ s.test_files = [
48
+ "test/fixtures/lib/bar.rb",
49
+ "test/fixtures/lib/foo.rb",
50
+ "test/fixtures/test/helper.rb",
51
+ "test/fixtures/test/test_bar.rb",
52
+ "test/fixtures/test/test_foo.rb",
53
+ "test/helper.rb",
54
+ "test/test_autowatchr.rb"
55
+ ]
56
+
57
+ if s.respond_to? :specification_version then
58
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
59
+ s.specification_version = 3
60
+
61
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
62
+ s.add_runtime_dependency(%q<watchr>, [">= 0"])
63
+ s.add_development_dependency(%q<mocha>, [">= 0"])
64
+ else
65
+ s.add_dependency(%q<watchr>, [">= 0"])
66
+ s.add_dependency(%q<mocha>, [">= 0"])
67
+ end
68
+ else
69
+ s.add_dependency(%q<watchr>, [">= 0"])
70
+ s.add_dependency(%q<mocha>, [">= 0"])
71
+ end
72
+ end
73
+
data/lib/autowatchr.rb ADDED
@@ -0,0 +1,246 @@
1
+ require 'erb'
2
+ require 'stringio'
3
+
4
+ class Autowatchr
5
+ class Config
6
+ attr_writer :command, :ruby, :include, :require, :lib_dir, :test_dir,
7
+ :lib_re, :test_re, :failed_results_re, :completed_re, :failing_only,
8
+ :run_suite, :run_method
9
+
10
+ def initialize(options = {})
11
+ @failing_only = @run_suite = true
12
+
13
+ options.each_pair do |key, value|
14
+ method = "#{key}="
15
+ if self.respond_to?(method)
16
+ self.send(method, value)
17
+ end
18
+ end
19
+ end
20
+
21
+ def run_method
22
+ @run_method ||= :require
23
+ end
24
+
25
+ def command
26
+ @command ||= "<%= ruby %> -I<%= include %> <% list_of_requires.each { |lib| %>-r<%= lib %> <% } %><%= predicate %>"
27
+ end
28
+
29
+ def ruby
30
+ @ruby ||= "ruby"
31
+ end
32
+
33
+ def include
34
+ @include ||= ".:#{self.lib_dir}:#{self.test_dir}"
35
+ end
36
+
37
+ def require
38
+ @require
39
+ end
40
+
41
+ def list_of_requires
42
+ if @require.nil? || @require.empty?
43
+ []
44
+ elsif @require.is_a?(Array)
45
+ @require
46
+ else
47
+ [@require]
48
+ end
49
+ end
50
+
51
+ def lib_dir
52
+ @lib_dir ||= "lib"
53
+ end
54
+
55
+ def test_dir
56
+ @test_dir ||= "test"
57
+ end
58
+
59
+ def lib_re
60
+ @lib_re ||= '^%s.*/.*\.rb$' % self.lib_dir
61
+ end
62
+
63
+ def test_re
64
+ @test_re ||= '^%s.*/test_.*\.rb$' % self.test_dir
65
+ end
66
+
67
+ def failed_results_re
68
+ @failed_results_re ||= /^\s+\d+\) (?:Failure|Error):\n(.*?)\((.*?)\)/
69
+ end
70
+
71
+ def completed_re
72
+ @completed_re ||= /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/
73
+ end
74
+
75
+ def failing_only
76
+ @failing_only
77
+ end
78
+
79
+ def run_suite
80
+ @run_suite
81
+ end
82
+
83
+ def eval_command(predicate)
84
+ ERB.new(self.command).result(binding)
85
+ end
86
+ end
87
+
88
+ class Tee < StringIO
89
+ attr_reader :io
90
+ def initialize(io)
91
+ super("")
92
+ @io = io
93
+ end
94
+
95
+ def write(string)
96
+ super
97
+ @io.write(string)
98
+ end
99
+ end
100
+
101
+ attr_reader :config
102
+ attr_accessor :interrupt_received
103
+
104
+ def initialize(script, options = {})
105
+ @config = Config.new(options)
106
+ yield @config if block_given?
107
+ @script = script
108
+ @test_files = []
109
+ @failed_tests = {}
110
+
111
+ discover_files
112
+ run_all_tests
113
+ start_watching_files
114
+ start_sigint_handler
115
+ end
116
+
117
+ # Traps any INT signals (like Control-C) and re-runs all
118
+ # the tests, unless the user sends the INT signal again within
119
+ # 2 seconds.
120
+ def start_sigint_handler
121
+ Signal.trap 'INT' do
122
+ if self.interrupt_received
123
+ exit 0
124
+ else
125
+ self.interrupt_received = true
126
+ puts "\nInterrupt a second time to quit"
127
+ Kernel.sleep 2
128
+ self.interrupt_received = false
129
+ puts "Running all tests..."
130
+ run_all_tests
131
+ end
132
+ end
133
+ end
134
+
135
+ def run_lib_file(file)
136
+ md = file.match(%r{^#{@config.lib_dir}#{File::SEPARATOR}?(.+)$})
137
+ parts = md[1].split(File::SEPARATOR)
138
+ parts[-1] = "test_#{parts[-1]}"
139
+ file = "#{@config.test_dir}/" + File.join(parts)
140
+ run_test_file(file)
141
+ end
142
+
143
+ def run_test_file(files)
144
+ files = [files] unless files.is_a?(Array)
145
+
146
+ passing = []
147
+ commands = []
148
+ files.each do |file|
149
+ tests = @failed_tests[file]
150
+ if tests && !tests.empty?
151
+ predicate = %!#{file} -n "/^(#{tests.join("|")})$/"!
152
+ commands << @config.eval_command(predicate)
153
+ else
154
+ passing << file
155
+ end
156
+ end
157
+
158
+ if !passing.empty?
159
+ if passing.length > 1
160
+ if @config.run_method == :individual
161
+ predicate = "'#{passing.join("' '")}'"
162
+ else
163
+ predicate = "-e \"%w[#{passing.join(" ")}].each do |f| require f end\""
164
+ end
165
+ else
166
+ predicate = passing[0]
167
+ end
168
+ commands.unshift(@config.eval_command(predicate))
169
+ end
170
+
171
+ cmd = commands.join("; ")
172
+ puts cmd
173
+
174
+ results = execute_cmd(cmd)
175
+ handle_results(results, files)
176
+ end
177
+
178
+ def classname_to_path(s)
179
+ File.join(@config.test_dir, underscore(s)+".rb")
180
+ end
181
+
182
+ private
183
+ def discover_files
184
+ @test_files = Dir.glob("#{@config.test_dir}/**/*").grep(/#{@config.test_re}/)
185
+ end
186
+
187
+ def run_all_tests
188
+ run_test_file(@test_files)
189
+ end
190
+
191
+ def start_watching_files
192
+ @script.watch(@config.test_re) { |md| run_test_file(md[0]) }
193
+ @script.watch(@config.lib_re) { |md| run_lib_file(md[0]) }
194
+ end
195
+
196
+ def execute_cmd(cmd)
197
+ tee = Tee.new($stdout)
198
+ $stdout = tee
199
+
200
+ system(cmd)
201
+
202
+ $stdout = tee.io
203
+ tee.rewind
204
+ results = tee.read
205
+ tee.close
206
+
207
+ results
208
+ end
209
+
210
+ def handle_results(results, files_ran)
211
+ return if !@config.failing_only
212
+ num_previously_failed = @failed_tests.length
213
+
214
+ failed = results.scan(@config.failed_results_re)
215
+ completed = results =~ @config.completed_re
216
+
217
+ previously_failed = @failed_tests.keys & files_ran
218
+ failed.each do |(test_name, class_name)|
219
+ key = classname_to_path(class_name)
220
+ if files_ran.include?(key)
221
+ @failed_tests[key] ||= []
222
+ @failed_tests[key] |= [test_name]
223
+ previously_failed.delete(key)
224
+ else
225
+ puts "Couldn't map class to file: #{class_name}"
226
+ end
227
+ end
228
+
229
+ previously_failed.each do |file|
230
+ @failed_tests.delete(file)
231
+ end
232
+
233
+ if @config.run_suite && @failed_tests.empty? && num_previously_failed > 0
234
+ run_all_tests
235
+ end
236
+ end
237
+
238
+ # File vendor/rails/activesupport/lib/active_support/inflector.rb, line 206
239
+ def underscore(camel_cased_word)
240
+ camel_cased_word.to_s.gsub(/::/, '/').
241
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
242
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
243
+ tr("-", "_").
244
+ downcase
245
+ end
246
+ end
data/test.watchr ADDED
@@ -0,0 +1,6 @@
1
+ require 'lib/autowatchr'
2
+
3
+ Autowatchr.new(self) do |config|
4
+ config.test_re = "^#{config.test_dir}/test_\\w+.rb"
5
+ config.require = "rubygems" if Object.const_defined?(:Gem)
6
+ end
@@ -0,0 +1,2 @@
1
+ class Bar
2
+ end
@@ -0,0 +1,2 @@
1
+ class Foo
2
+ end
@@ -0,0 +1,14 @@
1
+ Loaded suite -e
2
+ Started
3
+ F.F.
4
+ Finished in 0.001231 seconds.
5
+
6
+ 1) Failure:
7
+ test_flunk(TestBar) [./test/test_bar.rb:9]:
8
+ Flunked.
9
+
10
+ 2) Failure:
11
+ test_flunk(TestFoo) [./test/test_foo.rb:9]:
12
+ Flunked.
13
+
14
+ 4 tests, 4 assertions, 2 failures, 0 errors
@@ -0,0 +1,10 @@
1
+ Loaded suite test/test_bar
2
+ Started
3
+ F.
4
+ Finished in 0.0007 seconds.
5
+
6
+ 1) Failure:
7
+ test_flunk(TestBar) [test/test_bar.rb:9]:
8
+ Flunked.
9
+
10
+ 2 tests, 2 assertions, 1 failures, 0 errors
@@ -0,0 +1,6 @@
1
+ Loaded suite test/test_bar
2
+ Started
3
+ ..
4
+ Finished in 0.000306 seconds.
5
+
6
+ 2 tests, 1 assertions, 0 failures, 0 errors
@@ -0,0 +1,10 @@
1
+ Loaded suite test/test_foo
2
+ Started
3
+ F.
4
+ Finished in 0.000871 seconds.
5
+
6
+ 1) Failure:
7
+ test_flunk(TestFoo) [test/test_foo.rb:7]:
8
+ Flunked.
9
+
10
+ 2 tests, 2 assertions, 1 failures, 0 errors
@@ -0,0 +1,10 @@
1
+ Loaded suite test/test_foo
2
+ Started
3
+ F
4
+ Finished in 0.000645 seconds.
5
+
6
+ 1) Failure:
7
+ test_flunk(TestFoo) [test/test_foo.rb:9]:
8
+ Flunked.
9
+
10
+ 1 tests, 1 assertions, 1 failures, 0 errors
@@ -0,0 +1,6 @@
1
+ Loaded suite test/test_foo
2
+ Started
3
+ .
4
+ Finished in 0.000219 seconds.
5
+
6
+ 1 tests, 0 assertions, 0 failures, 0 errors
@@ -0,0 +1,4 @@
1
+ require '../../lib/autowatchr'
2
+
3
+ Autowatchr.new(self) do |config|
4
+ end
@@ -0,0 +1 @@
1
+ require 'test/unit'
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class TestBar < Test::Unit::TestCase
4
+ def test_pass
5
+ assert true
6
+ end
7
+
8
+ def test_flunk
9
+ flunk
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + "/helper"
2
+
3
+ class TestFoo < Test::Unit::TestCase
4
+ def test_pass
5
+ assert true
6
+ end
7
+
8
+ def test_flunk
9
+ flunk
10
+ end
11
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,49 @@
1
+ require 'test/unit'
2
+ require 'mocha'
3
+ require 'pp'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'autowatchr'
8
+
9
+ class Test::Unit::TestCase
10
+ end
11
+
12
+ module Mocha::ObjectMethods
13
+ def stubs_system_call(result_name = nil)
14
+ self.stubs(:system).with() do |_|
15
+ $stdout.print(result_name ? fake_result(result_name) : "")
16
+ true
17
+ end
18
+ end
19
+
20
+ def expects_system_call(expected_command, result_name = nil)
21
+ self.expects(:system).with() do |actual_command|
22
+ if expected_command == actual_command
23
+ $stdout.print(result_name ? fake_result(result_name) : "")
24
+ true
25
+ else
26
+ false
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ def fake_result(name)
33
+ open(File.dirname(__FILE__) + "/fixtures/results/#{name}.txt").read
34
+ end
35
+
36
+ # File vendor/rails/activesupport/lib/active_support/core_ext/kernel/reporting.rb, line 36
37
+ def silence_stream(stream)
38
+ old_stream = stream.dup
39
+ stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
40
+ stream.sync = true
41
+ yield
42
+ ensure
43
+ stream.reopen(old_stream)
44
+ end
45
+
46
+ def debug_p(obj, label = nil)
47
+ $stderr.print "#{label}: " if label
48
+ $stderr.puts obj.inspect
49
+ end
@@ -0,0 +1,271 @@
1
+ require 'helper'
2
+
3
+ class TestAutowatchr < Test::Unit::TestCase
4
+ def new_autowatchr(options = {})
5
+ Autowatchr.new(@script, {
6
+ :ruby => "/usr/local/bin/ruby",
7
+ :lib_dir => @lib_dir,
8
+ :test_dir => @test_dir
9
+ }.merge(options))
10
+ end
11
+
12
+ def setup
13
+ @script = stub("fake watchr script", :watch => nil)
14
+ @lib_dir = File.dirname(__FILE__) + "/fixtures/lib"
15
+ @test_dir = File.dirname(__FILE__) + "/fixtures/test"
16
+ Autowatchr.any_instance.stubs_system_call
17
+ end
18
+
19
+ def test_new_with_hash
20
+ aw = nil
21
+ silence_stream(STDOUT) do
22
+ aw = Autowatchr.new(@script, {
23
+ :ruby => "/usr/local/bin/ruby",
24
+ :include => ".:lib:test"
25
+ })
26
+ end
27
+ assert_equal "/usr/local/bin/ruby", aw.config.ruby
28
+ assert_equal ".:lib:test", aw.config.include
29
+ end
30
+
31
+ def test_new_with_block
32
+ aw = nil
33
+ silence_stream(STDOUT) do
34
+ aw = Autowatchr.new(@script) do |config|
35
+ config.ruby = "/usr/local/bin/ruby"
36
+ config.include = ".:lib:test"
37
+ config.lib_dir = @lib_dir
38
+ config.test_dir = @test_dir
39
+ end
40
+ end
41
+ assert_equal "/usr/local/bin/ruby", aw.config.ruby
42
+ assert_equal ".:lib:test", aw.config.include
43
+ assert_equal @lib_dir, aw.config.lib_dir
44
+ assert_equal @test_dir, aw.config.test_dir
45
+ end
46
+
47
+ def test_auto_includes
48
+ aw = nil
49
+ silence_stream(STDOUT) do
50
+ aw = Autowatchr.new(@script) do |config|
51
+ config.ruby = "/usr/local/bin/ruby"
52
+ config.lib_dir = @lib_dir
53
+ config.test_dir = @test_dir
54
+ end
55
+ end
56
+ assert_equal ".:#{@lib_dir}:#{@test_dir}", aw.config.include
57
+ end
58
+
59
+ def test_defaults
60
+ aw = nil
61
+ silence_stream(STDOUT) do
62
+ aw = Autowatchr.new(@script)
63
+ end
64
+ assert_equal "ruby", aw.config.ruby
65
+ assert_equal ".:lib:test", aw.config.include
66
+ assert_equal nil, aw.config.require
67
+ assert_equal "lib", aw.config.lib_dir
68
+ assert_equal "test", aw.config.test_dir
69
+ assert_equal '^lib.*/.*\.rb$', aw.config.lib_re
70
+ assert_equal '^test.*/test_.*\.rb$', aw.config.test_re
71
+ assert_equal /^\s+\d+\) (?:Failure|Error):\n(.*?)\((.*?)\)/, aw.config.failed_results_re
72
+ assert_equal /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/, aw.config.completed_re
73
+ end
74
+
75
+ def test_watches_test_files
76
+ @script.expects(:watch).with('^%s.*/test_.*\.rb$' % @test_dir)
77
+ silence_stream(STDOUT) do
78
+ new_autowatchr
79
+ end
80
+ end
81
+
82
+ def test_watches_lib_files
83
+ @script.expects(:watch).with('^%s.*/.*\.rb$' % @lib_dir)
84
+ silence_stream(STDOUT) do
85
+ new_autowatchr
86
+ end
87
+ end
88
+
89
+ def test_run_lib_file
90
+ expected_cmd = "/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} #{@test_dir}/test_foo.rb"
91
+ Autowatchr.any_instance.expects_system_call(expected_cmd, "foo")
92
+
93
+ silence_stream(STDOUT) do
94
+ aw = new_autowatchr
95
+ aw.run_lib_file("#{@lib_dir}/foo.rb")
96
+ end
97
+ end
98
+
99
+ def test_run_lib_file_with_require
100
+ expected_cmd = "/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} -rrubygems #{@test_dir}/test_foo.rb"
101
+ Autowatchr.any_instance.expects_system_call(expected_cmd, "foo")
102
+
103
+ silence_stream(STDOUT) do
104
+ aw = new_autowatchr(:require => 'rubygems')
105
+ aw.run_lib_file("#{@lib_dir}/foo.rb")
106
+ end
107
+ end
108
+
109
+ def test_run_lib_file_with_mulitple_requires
110
+ expected_cmd = "/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} -rrubygems -rblah #{@test_dir}/test_foo.rb"
111
+ Autowatchr.any_instance.expects_system_call(expected_cmd, "foo")
112
+
113
+ silence_stream(STDOUT) do
114
+ aw = new_autowatchr(:require => %w{rubygems blah})
115
+ aw.run_lib_file("#{@lib_dir}/foo.rb")
116
+ end
117
+ end
118
+
119
+ def test_running_multiple_test_files_with_require_run_method
120
+ expected_cmd = "/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} -e \"%w[#{@test_dir}/test_bar.rb #{@test_dir}/test_foo.rb].each do |f| require f end\""
121
+ Autowatchr.any_instance.expects_system_call(expected_cmd, "all")
122
+
123
+ silence_stream(STDOUT) do
124
+ aw = new_autowatchr
125
+ aw.run_test_file(["#{@test_dir}/test_bar.rb", "#{@test_dir}/test_foo.rb"])
126
+ end
127
+ end
128
+
129
+ def test_running_multiple_test_files_with_individual_run_method
130
+ expected_cmd = "/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} '#{@test_dir}/test_bar.rb' '#{@test_dir}/test_foo.rb'"
131
+ Autowatchr.any_instance.expects_system_call(expected_cmd, "all")
132
+
133
+ silence_stream(STDOUT) do
134
+ aw = new_autowatchr(:run_method => :individual)
135
+ aw.run_test_file(["#{@test_dir}/test_bar.rb", "#{@test_dir}/test_foo.rb"])
136
+ end
137
+ end
138
+
139
+ def test_runs_all_test_files_on_start
140
+ files = Dir.glob("#{@test_dir}/**/test_*.rb").join(" ")
141
+ expected_cmd = %!/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} -e "%w[#{files}].each do |f| require f end"!
142
+ Autowatchr.any_instance.expects_system_call(expected_cmd, "all")
143
+
144
+ silence_stream(STDOUT) do
145
+ new_autowatchr
146
+ end
147
+ end
148
+
149
+ def test_mapping_test_classes_to_test_files
150
+ aw = nil
151
+ silence_stream(STDOUT) do
152
+ aw = new_autowatchr
153
+ end
154
+ assert_equal "#{@test_dir}/test_foo.rb", aw.classname_to_path("TestFoo")
155
+ assert_equal "#{@test_dir}/test_foo/test_baz.rb", aw.classname_to_path("TestFoo::TestBaz")
156
+ end
157
+
158
+ def test_only_runs_failing_tests
159
+ Autowatchr.any_instance.stubs_system_call("all")
160
+ aw = nil
161
+ silence_stream(STDOUT) do
162
+ aw = new_autowatchr
163
+ end
164
+
165
+ expected_cmd = %!/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} #{@test_dir}/test_foo.rb -n "/^(test_flunk)$/"!
166
+ aw.expects_system_call(expected_cmd, "foo_flunk")
167
+
168
+ silence_stream(STDOUT) do
169
+ aw.run_test_file("#{@test_dir}/test_foo.rb")
170
+ end
171
+ end
172
+
173
+ def test_only_registers_failing_test_once
174
+ Autowatchr.any_instance.stubs_system_call("all")
175
+ aw = nil
176
+ silence_stream(STDOUT) do
177
+ aw = new_autowatchr
178
+ end
179
+
180
+ expected_cmd = %!/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} #{@test_dir}/test_foo.rb -n "/^(test_flunk)$/"!
181
+ aw.expects_system_call(expected_cmd, "foo_flunk")
182
+ silence_stream(STDOUT) do
183
+ aw.run_test_file("#{@test_dir}/test_foo.rb")
184
+ end
185
+
186
+ expected_cmd = %!/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} #{@test_dir}/test_foo.rb -n "/^(test_flunk)$/"!
187
+ aw.expects_system_call(expected_cmd, "foo_flunk")
188
+ silence_stream(STDOUT) do
189
+ aw.run_test_file("#{@test_dir}/test_foo.rb")
190
+ end
191
+ end
192
+
193
+ def test_clears_failing_test_when_it_passes
194
+ Autowatchr.any_instance.stubs_system_call("all")
195
+ aw = nil
196
+ silence_stream(STDOUT) do
197
+ aw = new_autowatchr
198
+ end
199
+
200
+ aw.stubs_system_call("foo_pass")
201
+ silence_stream(STDOUT) do
202
+ aw.run_test_file("#{@test_dir}/test_foo.rb")
203
+ end
204
+
205
+ expected_cmd = %!/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} #{@test_dir}/test_foo.rb!
206
+ aw.expects_system_call(expected_cmd, "foo")
207
+ silence_stream(STDOUT) do
208
+ aw.run_test_file("#{@test_dir}/test_foo.rb")
209
+ end
210
+ end
211
+
212
+ def test_not_only_running_failing_tests
213
+ Autowatchr.any_instance.stubs_system_call("all")
214
+ aw = nil
215
+ silence_stream(STDOUT) do
216
+ aw = new_autowatchr(:failing_only => false)
217
+ end
218
+
219
+ expected_cmd = %!/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} #{@test_dir}/test_foo.rb!
220
+ aw.expects_system_call(expected_cmd, "foo")
221
+ silence_stream(STDOUT) do
222
+ aw.run_test_file("#{@test_dir}/test_foo.rb")
223
+ end
224
+ end
225
+
226
+ def test_running_entire_suite_after_green
227
+ Autowatchr.any_instance.stubs_system_call("all")
228
+ aw = nil
229
+ silence_stream(STDOUT) do
230
+ aw = new_autowatchr
231
+ end
232
+
233
+ expected_cmd_2 = %!/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} #{@test_dir}/test_foo.rb -n "/^(test_flunk)$/"!
234
+ aw.expects_system_call(expected_cmd_2, "foo_pass")
235
+ silence_stream(STDOUT) do
236
+ aw.run_test_file("#{@test_dir}/test_foo.rb")
237
+ end
238
+
239
+ expected_cmd_3 = %!/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} #{@test_dir}/test_bar.rb -n "/^(test_flunk)$/"!
240
+ aw.expects_system_call(expected_cmd_3, "bar_pass")
241
+
242
+ files = Dir.glob("#{@test_dir}/**/test_*.rb").join(" ")
243
+ expected_cmd_4 = %!/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} -e "%w[#{files}].each do |f| require f end"!
244
+ aw.expects_system_call(expected_cmd_4, "all")
245
+
246
+ silence_stream(STDOUT) do
247
+ aw.run_test_file("#{@test_dir}/test_bar.rb")
248
+ end
249
+ end
250
+
251
+ def test_not_running_entire_suite_after_green
252
+ Autowatchr.any_instance.stubs_system_call("all")
253
+ aw = nil
254
+ silence_stream(STDOUT) do
255
+ aw = new_autowatchr(:run_suite => false)
256
+ end
257
+
258
+ expected_cmd_2 = %!/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} #{@test_dir}/test_foo.rb -n "/^(test_flunk)$/"!
259
+ aw.expects_system_call(expected_cmd_2, "foo_pass")
260
+ silence_stream(STDOUT) do
261
+ aw.run_test_file("#{@test_dir}/test_foo.rb")
262
+ end
263
+
264
+ expected_cmd_3 = %!/usr/local/bin/ruby -I.:#{@lib_dir}:#{@test_dir} #{@test_dir}/test_bar.rb -n "/^(test_flunk)$/"!
265
+ aw.expects_system_call(expected_cmd_3, "bar_pass")
266
+
267
+ silence_stream(STDOUT) do
268
+ aw.run_test_file("#{@test_dir}/test_bar.rb")
269
+ end
270
+ end
271
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: harmon-autowatchr
3
+ version: !ruby/object:Gem::Version
4
+ hash: 17
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 5
10
+ version: 0.1.5
11
+ platform: ruby
12
+ authors:
13
+ - Jeremy Stephens
14
+ - Adam Grant
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2010-12-14 00:00:00 -08:00
20
+ default_executable:
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ name: watchr
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ hash: 3
31
+ segments:
32
+ - 0
33
+ version: "0"
34
+ type: :runtime
35
+ version_requirements: *id001
36
+ - !ruby/object:Gem::Dependency
37
+ name: mocha
38
+ prerelease: false
39
+ requirement: &id002 !ruby/object:Gem::Requirement
40
+ none: false
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ hash: 3
45
+ segments:
46
+ - 0
47
+ version: "0"
48
+ type: :development
49
+ version_requirements: *id002
50
+ description: Fork of viking's autowatchr library to fix some issues and add some features. Provides some autotest-like behavior for watchr (http://github.com/mynyml/watchr).
51
+ email: harmon@harmonius.net
52
+ executables: []
53
+
54
+ extensions: []
55
+
56
+ extra_rdoc_files:
57
+ - LICENSE
58
+ - README.rdoc
59
+ files:
60
+ - .document
61
+ - LICENSE
62
+ - README.rdoc
63
+ - Rakefile
64
+ - VERSION
65
+ - harmon-autowatchr.gemspec
66
+ - lib/autowatchr.rb
67
+ - test.watchr
68
+ - test/fixtures/lib/bar.rb
69
+ - test/fixtures/lib/foo.rb
70
+ - test/fixtures/results/all.txt
71
+ - test/fixtures/results/bar_flunk.txt
72
+ - test/fixtures/results/bar_pass.txt
73
+ - test/fixtures/results/foo.txt
74
+ - test/fixtures/results/foo_flunk.txt
75
+ - test/fixtures/results/foo_pass.txt
76
+ - test/fixtures/test.watchr
77
+ - test/fixtures/test/helper.rb
78
+ - test/fixtures/test/test_bar.rb
79
+ - test/fixtures/test/test_foo.rb
80
+ - test/helper.rb
81
+ - test/test_autowatchr.rb
82
+ has_rdoc: true
83
+ homepage: http://github.com/harmon/autowatchr
84
+ licenses: []
85
+
86
+ post_install_message:
87
+ rdoc_options: []
88
+
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ none: false
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ hash: 3
97
+ segments:
98
+ - 0
99
+ version: "0"
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ hash: 3
106
+ segments:
107
+ - 0
108
+ version: "0"
109
+ requirements: []
110
+
111
+ rubyforge_project:
112
+ rubygems_version: 1.3.7
113
+ signing_key:
114
+ specification_version: 3
115
+ summary: Provides some autotest-like behavior for watchr
116
+ test_files:
117
+ - test/fixtures/lib/bar.rb
118
+ - test/fixtures/lib/foo.rb
119
+ - test/fixtures/test/helper.rb
120
+ - test/fixtures/test/test_bar.rb
121
+ - test/fixtures/test/test_foo.rb
122
+ - test/helper.rb
123
+ - test/test_autowatchr.rb