harmon-autowatchr 0.1.5

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/.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