ZenTest 3.4.3 → 3.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. data/History.txt +46 -3
  2. data/Manifest.txt +13 -0
  3. data/README.txt +1 -0
  4. data/Rakefile +20 -3
  5. data/bin/autotest +23 -37
  6. data/bin/multiruby +13 -7
  7. data/bin/unit_diff +1 -1
  8. data/example_dot_autotest.rb +14 -0
  9. data/lib/autotest.rb +77 -30
  10. data/lib/autotest/autoupdate.rb +26 -0
  11. data/lib/autotest/emacs.rb +29 -0
  12. data/lib/autotest/fixtures.rb +12 -0
  13. data/lib/autotest/growl.rb +7 -17
  14. data/lib/autotest/heckle.rb +14 -0
  15. data/lib/autotest/migrate.rb +7 -0
  16. data/lib/autotest/notify.rb +38 -0
  17. data/lib/autotest/redgreen.rb +7 -4
  18. data/lib/autotest/screen.rb +77 -0
  19. data/lib/autotest/shame.rb +45 -0
  20. data/lib/autotest/timestamp.rb +3 -1
  21. data/lib/camping_autotest.rb +37 -0
  22. data/lib/functional_test_matrix.rb +85 -0
  23. data/lib/rails_autotest.rb +49 -41
  24. data/lib/rspec_rails_autotest.rb +119 -0
  25. data/lib/test/rails.rb +28 -1
  26. data/lib/test/rails/controller_test_case.rb +27 -6
  27. data/lib/test/rails/functional_test_case.rb +3 -0
  28. data/lib/test/rails/helper_test_case.rb +3 -0
  29. data/lib/test/rails/view_test_case.rb +13 -5
  30. data/lib/test/zentest_assertions.rb +42 -23
  31. data/lib/unit_diff.rb +86 -69
  32. data/lib/zentest.rb +58 -87
  33. data/lib/zentest_mapping.rb +97 -0
  34. data/test/test_autotest.rb +23 -3
  35. data/test/test_help.rb +10 -4
  36. data/test/test_rails_autotest.rb +6 -4
  37. data/test/test_rails_controller_test_case.rb +10 -2
  38. data/test/test_ruby_fork.rb +12 -12
  39. data/test/test_unit_diff.rb +37 -33
  40. data/test/test_zentest.rb +15 -141
  41. data/test/test_zentest_assertions.rb +38 -18
  42. data/test/test_zentest_mapping.rb +213 -0
  43. metadata +18 -4
@@ -1,10 +1,53 @@
1
+ *** 3.5.1 / 2007-04-17
2
+
3
+ + 4 bug fixes:
4
+ + Fixed gem name to be camel-case again. Fixed on rubyforge too.
5
+ + Fixed rdoc for hooks.
6
+ + Fixed redgreen, results changed to an array.
7
+ + Patch up Rails fixture defaults, since they're not inheriting properly.
8
+
9
+ *** 3.5.0 / 2007-04-12
10
+
11
+ + 4 major enhancements:
12
+ + Now requires RubyGems 0.9.1 or newer.
13
+ + Autotest and unit_diff are both unbuffered. Results are more live.
14
+ + Refactored and redesigned how files map to test from Sean Carley. See fixtures plugin as an example.
15
+ + Generalize how autotest handler is instantiated and invoked, allowing for many more autotest types, including combos.
16
+ + 23 minor enhancements:
17
+ + Added all_good hook if initial run was all_good as well.
18
+ + Added assert_in_epsilon to ZentestAssertions.
19
+ + Added autotest plugin to auto-update source ala tinderbox/cruisecontrol.
20
+ + Added autotest plugin to update ichat/adium IM status with code stats.
21
+ + Added autotest plugin to update the GNU screen statusbar from Yuichi Tateno.
22
+ + Added autotest syntax error handling from Ryan Platte.
23
+ + Added autotest/emacs emacs integration plugin!!! YAY!
24
+ + Added autotest/migrate.rb.
25
+ + Added camping support from Geoffrey Grossenbach.
26
+ + Added changed file reporting to autotest via -v flag.
27
+ + Added informative summary and filtering via ENV['VERSIONS'] to multiruby.
28
+ + Added libnotify support from Kazuo Saito.
29
+ + Added lots of rdoc patches from Hugh Sasse.
30
+ + Added rjs files to view_test_case.
31
+ + Added rspec_autotest "stolen" from caldersphere.net
32
+ + Added run_command hook to trigger the start of a test run.
33
+ + Added tmp to rails' exceptions list.
34
+ + Added unit_diff command variable to autotest for customizing flags and such.
35
+ + Added zentest_mapping.rb and test.
36
+ + Allow session to work in Test::Rails view tests.
37
+ + Improved autotest/growl.rb output from imajes.
38
+ + Improved autotest/timestamp output from Josh Susser.
39
+ + Test::Rails works with Rails 1.2.
40
+ + 2 bug fixes:
41
+ + Accelerated Test::Rails unit tests via sensible defaults.
42
+ + Better assertion messages for ZentestAssertions.
43
+
1
44
  *** 3.4.3 / 2006-12-19
2
45
 
3
46
  + 2 minor enhancements:
4
- + Add assert_title and assert_h (for header).
47
+ + Add assert_title and assert_h (for header).
5
48
  + 2 bug fixes:
6
- + Rereleased against latest version of hoe to fix load path problems.
7
- + Fix case ViewTestCase for case-sensitive file systems.
49
+ + Rereleased against latest version of hoe to fix load path problems.
50
+ + Fix case ViewTestCase for case-sensitive file systems.
8
51
 
9
52
  *** 3.4.2 / 2006-11-09
10
53
 
@@ -15,15 +15,26 @@ example1.rb
15
15
  example2.rb
16
16
  example_dot_autotest.rb
17
17
  lib/autotest.rb
18
+ lib/autotest/autoupdate.rb
19
+ lib/autotest/emacs.rb
20
+ lib/autotest/fixtures.rb
18
21
  lib/autotest/growl.rb
22
+ lib/autotest/heckle.rb
19
23
  lib/autotest/html_report.rb
20
24
  lib/autotest/kdenotify.rb
21
25
  lib/autotest/menu.rb
26
+ lib/autotest/migrate.rb
27
+ lib/autotest/notify.rb
22
28
  lib/autotest/pretty.rb
23
29
  lib/autotest/redgreen.rb
30
+ lib/autotest/screen.rb
31
+ lib/autotest/shame.rb
24
32
  lib/autotest/snarl.rb
25
33
  lib/autotest/timestamp.rb
34
+ lib/camping_autotest.rb
35
+ lib/functional_test_matrix.rb
26
36
  lib/rails_autotest.rb
37
+ lib/rspec_rails_autotest.rb
27
38
  lib/ruby_fork.rb
28
39
  lib/test/rails.rb
29
40
  lib/test/rails/controller_test_case.rb
@@ -38,6 +49,7 @@ lib/test/rails/view_test_case.rb
38
49
  lib/test/zentest_assertions.rb
39
50
  lib/unit_diff.rb
40
51
  lib/zentest.rb
52
+ lib/zentest_mapping.rb
41
53
  test/test_autotest.rb
42
54
  test/test_help.rb
43
55
  test/test_rails_autotest.rb
@@ -48,3 +60,4 @@ test/test_ruby_fork.rb
48
60
  test/test_unit_diff.rb
49
61
  test/test_zentest.rb
50
62
  test/test_zentest_assertions.rb
63
+ test/test_zentest_mapping.rb
data/README.txt CHANGED
@@ -65,6 +65,7 @@ implementation.
65
65
 
66
66
  * Ruby 1.6+
67
67
  * Test::Unit
68
+ * Hoe
68
69
  * Rake or rubygems for install/uninstall
69
70
  * diff.exe on windoze. Try http://gnuwin32.sourceforge.net/packages.html
70
71
 
data/Rakefile CHANGED
@@ -1,14 +1,12 @@
1
1
  # -*- ruby -*-
2
2
 
3
- ENV["RUBY_FLAGS"]="-Ilib:bin:test" # FIX
3
+ $: << 'lib'
4
4
 
5
5
  require 'rubygems'
6
6
  require 'hoe'
7
7
  require './lib/zentest.rb'
8
8
 
9
9
  Hoe.new("ZenTest", ZenTest::VERSION) do |p|
10
- paragraphs = File.read("README.txt").split(/\n\n+/)
11
-
12
10
  p.author = ['Ryan Davis', 'Eric Hodel']
13
11
 
14
12
  changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
@@ -23,6 +21,25 @@ task :autotest do
23
21
  ruby "-Ilib ./bin/autotest"
24
22
  end
25
23
 
24
+ task :update do
25
+ File.open "example_dot_autotest.rb", "w" do |f|
26
+ f.puts "# -*- ruby -*-"
27
+ f.puts
28
+ Dir.chdir "lib" do
29
+ Dir["autotest/*.rb"].sort.each do |s|
30
+ f.puts "# require '#{s[0..-4]}'"
31
+ end
32
+ end
33
+
34
+ f.puts
35
+ f.puts "# Autotest::AutoUpdate.sleep_time = 60"
36
+ f.puts "# Autotest::AutoUpdate.update_cmd = 'svn up'"
37
+ f.puts "# Autotest::Heckle.flags << '-t test/**/*.rb'"
38
+ f.puts "# Autotest::Heckle.klasses << 'MyClass'"
39
+ f.puts "# Autotest::Shame.chat_app = :adium"
40
+ end
41
+ end
42
+
26
43
  task :sort do
27
44
  begin
28
45
  sh 'for f in lib/*.rb; do echo $f; grep "^ *def " $f | grep -v sort=skip > x; sort x > y; echo $f; echo; diff x y; done'
@@ -1,50 +1,36 @@
1
1
  #!/usr/local/bin/ruby -ws
2
2
 
3
+ $v ||= false
3
4
  $h ||= false
4
5
  $help ||= false
5
6
 
6
7
  if $h or $help then
7
- help = []
8
- help << "autotest [options]"
9
- help << nil
10
- help << "options:"
11
- help << "\t-h"
12
- help << "\t-help\t\tYou're looking at it."
13
- help << nil
14
- help << "\t-v\t\tBe verbose."
15
- help << "\t\t\tPrints files that autotest doesn't know how to map to"
16
- help << "\t\t\ttests."
17
- help << nil
18
- help << "\t-rails\t\tForce rails mode."
19
- help << "\t\t\tRails will be automatically detected by the presence of"
20
- help << "\t\t\tconfig/environment.rb. Use this if you don't have one."
21
- help << nil
22
- help << "\t\t\tYou may need to run 'rake db:test:prepare' before"
23
- help << "\t\t\tstarting autotest on a rails project."
24
- help << nil
25
- help << "\t-vcs=NAME\tVersion control system to update."
26
- help << "\t\t\tAutotest will automatically update every vcstime"
27
- help << "\t\t\tseconds."
28
- help << "\t\t\tAutotest understands Perforce (p4), CVS (cvs) and"
29
- help << "\t\t\tSubversion (svn)."
30
- help << nil
31
- help << "\t-vcstime=N\tUpdate source control every N seconds."
32
- help << "\t\t\tDefaults to every five minutes (300 seconds)."
8
+ help = [
9
+ "autotest [options]",
10
+ nil,
11
+ "options:",
12
+ "\t-h",
13
+ "\t-help\t\tYou're looking at it.",
14
+ nil,
15
+ "\t-v\t\tBe verbose.",
16
+ "\t\t\tPrints files that autotest doesn't know how to map to",
17
+ "\t\t\ttests.",
18
+ ]
33
19
  STDERR.puts help.join("\n")
34
20
  exit 1
35
21
  end
36
22
 
37
- $v ||= false
23
+ $rspec ||= false
38
24
  $rails ||= false
39
- $vcs ||= nil
40
- $vcstime ||= 300
41
- $vcstime = $vcstime.to_i
25
+ $camping ||= false
42
26
 
43
- if $rails or File.exist? 'config/environment.rb' then
44
- require 'rails_autotest'
45
- RailsAutotest.run
46
- else
47
- require 'autotest'
48
- Autotest.run
49
- end
27
+ style = []
28
+ style << "rspec" if $rspec or File.directory?('spec')
29
+ style << "rails" if $rails or File.exist? 'config/environment.rb'
30
+ style << "camping" if $camping or File.exist? 'test/camping_test_case.rb'
31
+ style << "autotest"
50
32
 
33
+ mod = style.join("_")
34
+ puts "loading #{mod}"
35
+ require mod
36
+ Object.const_get(style.map {|s| s.capitalize}.join).run
@@ -18,12 +18,12 @@ Dir.chdir root_dir do
18
18
  %w(build install versions).each do |dir|
19
19
  unless test ?d, dir then
20
20
  puts "creating #{dir}"
21
- Dir.mkdir dir
21
+ Dir.mkdir dir
22
22
  if dir == "versions" then
23
23
  file = "ruby-#{RUBY_VERSION}.tar.gz"
24
24
  puts " downloading #{file} via HTTP... this might take a while."
25
25
  puts " Put other ruby tarballs in versions to use them."
26
-
26
+
27
27
  Dir.chdir dir do
28
28
  require 'open-uri'
29
29
  open("http://ftp.ruby-lang.org/pub/ruby/#{file}") do |f|
@@ -77,7 +77,10 @@ Dir.chdir root_dir do
77
77
  end
78
78
  end
79
79
 
80
- results = versions.map do |version|
80
+ versions = ENV['VERSIONS'].split(/:/) if ENV.has_key? 'VERSIONS'
81
+
82
+ results = {}
83
+ versions.each do |version|
81
84
  ruby = "#{root_dir}/install/#{version}/bin/ruby"
82
85
  puts
83
86
  puts "VERSION = #{version}"
@@ -85,12 +88,15 @@ results = versions.map do |version|
85
88
  system ruby, *ARGV
86
89
  puts
87
90
  puts "RESULT = #{$?}"
88
- $?
91
+ results[version] = $?
89
92
  end
90
93
 
91
- result = results.select { |n| n != 0 }.size
94
+ passed, failed = results.keys.partition { |v| results[v] == 0 }
92
95
 
93
96
  puts
94
- puts "TOTAL RESULT = #{result} failures"
97
+ puts "TOTAL RESULT = #{failed.size} failures out of #{results.size}"
98
+ puts
99
+ puts "Passed: #{passed.join(", ")}"
100
+ puts "Failed: #{failed.join(", ")}"
95
101
 
96
- exit result
102
+ exit failed.size
@@ -35,4 +35,4 @@ if defined? $h then
35
35
  exit 0
36
36
  end
37
37
 
38
- puts UnitDiff.unit_diff(ARGF)
38
+ UnitDiff.unit_diff
@@ -1,10 +1,24 @@
1
1
  # -*- ruby -*-
2
2
 
3
+ # require 'autotest/autoupdate'
4
+ # require 'autotest/emacs'
5
+ # require 'autotest/fixtures'
3
6
  # require 'autotest/growl'
7
+ # require 'autotest/heckle'
4
8
  # require 'autotest/html_report'
5
9
  # require 'autotest/kdenotify'
6
10
  # require 'autotest/menu'
11
+ # require 'autotest/migrate'
12
+ # require 'autotest/notify'
7
13
  # require 'autotest/pretty'
8
14
  # require 'autotest/redgreen'
15
+ # require 'autotest/screen'
16
+ # require 'autotest/shame'
9
17
  # require 'autotest/snarl'
10
18
  # require 'autotest/timestamp'
19
+
20
+ # Autotest::AutoUpdate.sleep_time = 60
21
+ # Autotest::AutoUpdate.update_cmd = 'svn up'
22
+ # Autotest::Heckle.flags << '-t test/**/*.rb'
23
+ # Autotest::Heckle.klasses << 'MyClass'
24
+ # Autotest::Shame.chat_app = :adium
@@ -1,6 +1,7 @@
1
1
  require 'find'
2
2
  require 'rbconfig'
3
3
 
4
+ $v ||= false
4
5
  $TESTING = false unless defined? $TESTING
5
6
 
6
7
  ##
@@ -27,8 +28,8 @@ $TESTING = false unless defined? $TESTING
27
28
  #
28
29
  # Autotest.add_hook hook_name { |autotest| ... }
29
30
  #
30
- # The available hooks are: run, interrupt, quit, ran_command, red,
31
- # green, all_good, and reset.
31
+ # The available hooks are: initialize, run, run_command, ran_command,
32
+ # red, green, all_good, reset, interrupt, and quit.
32
33
  #
33
34
  # See example_dot_autotest.rb for more details.
34
35
  #
@@ -62,7 +63,18 @@ class Autotest
62
63
  new.run
63
64
  end
64
65
 
65
- attr_accessor :exceptions, :files, :files_to_test, :interrupted, :last_mtime, :libs, :output, :results, :tainted, :wants_to_quit
66
+ attr_accessor(:exceptions,
67
+ :files,
68
+ :files_to_test,
69
+ :interrupted,
70
+ :last_mtime,
71
+ :libs,
72
+ :output,
73
+ :results,
74
+ :tainted,
75
+ :test_mappings,
76
+ :unit_diff,
77
+ :wants_to_quit)
66
78
 
67
79
  def initialize
68
80
  @files = Hash.new Time.at(0)
@@ -71,6 +83,17 @@ class Autotest
71
83
  @libs = %w[. lib test].join(File::PATH_SEPARATOR)
72
84
  @output = $stderr
73
85
  @sleep = 1
86
+ @unit_diff = "unit_diff -u"
87
+
88
+ @test_mappings = {
89
+ /^lib\/.*\.rb$/ => proc { |filename, _|
90
+ files_matching %r%^test/.*#{File.basename(filename).gsub '_', '_?'}$%
91
+ },
92
+ /^test\/test_.*rb$/ => proc { |filename, _|
93
+ filename
94
+ }
95
+ }
96
+
74
97
  hook :initialize
75
98
  end
76
99
 
@@ -82,7 +105,11 @@ class Autotest
82
105
  loop do # ^c handler
83
106
  begin
84
107
  get_to_green
85
- rerun_all_tests if @tainted
108
+ if @tainted then
109
+ rerun_all_tests
110
+ else
111
+ hook :all_good
112
+ end
86
113
  wait_for_changes
87
114
  rescue Interrupt
88
115
  if @wants_to_quit then
@@ -106,11 +133,30 @@ class Autotest
106
133
  find_files_to_test # failed + changed/affected
107
134
  cmd = make_test_cmd @files_to_test
108
135
 
136
+ hook :run_command
109
137
  puts cmd
110
138
 
111
- @results = `#{cmd}`
139
+ old_sync = $stdout.sync
140
+ $stdout.sync = true
141
+ @results = []
142
+ line = []
143
+ begin
144
+ open("| #{cmd}", "r") do |f|
145
+ until f.eof? do
146
+ c = f.getc
147
+ putc c
148
+ line << c
149
+ if c == ?\n then
150
+ @results << line.pack("c*")
151
+ line.clear
152
+ end
153
+ end
154
+ end
155
+ ensure
156
+ $stdout.sync = old_sync
157
+ end
112
158
  hook :ran_command
113
- puts @results
159
+ @results = @results.join
114
160
 
115
161
  handle_results(@results)
116
162
  end
@@ -165,7 +211,6 @@ class Autotest
165
211
  result = {}
166
212
  Find.find '.' do |f|
167
213
  Find.prune if @exceptions and f =~ @exceptions and test ?d, f
168
- Find.prune if f =~ /(\.(svn|hg)|CVS|tmp|public|doc|pkg)$/ # prune dirs
169
214
 
170
215
  next if test ?d, f
171
216
  next if f =~ /(swp|~|rej|orig)$/ # temporary/patch files
@@ -183,6 +228,8 @@ class Autotest
183
228
  @files[filename] < mtime
184
229
  }
185
230
 
231
+ p updated if $v unless updated.empty? or @last_mtime.to_i == 0
232
+
186
233
  # TODO: keep an mtime at app level and drop the files hash
187
234
  updated.each do |filename, mtime|
188
235
  @files[filename] = mtime
@@ -195,18 +242,18 @@ class Autotest
195
242
  end
196
243
 
197
244
  previous = @last_mtime
198
- @last_mtime = @files.values.sort.last
245
+ @last_mtime = @files.values.max
199
246
  @last_mtime > previous
200
247
  end
201
248
 
202
249
  def handle_results(results)
203
250
  failed = results.scan(/^\s+\d+\) (?:Failure|Error):\n(.*?)\((.*?)\)/)
204
- @files_to_test = consolidate_failures failed
205
- unless @files_to_test.empty? then
206
- hook :red
207
- else
208
- hook :green
209
- end unless $TESTING
251
+ completed = results =~ /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/
252
+
253
+ @files_to_test = consolidate_failures failed if completed
254
+
255
+ hook completed && @files_to_test.empty? ? :green : :red unless $TESTING
256
+
210
257
  @tainted = true unless @files_to_test.empty?
211
258
  end
212
259
 
@@ -215,12 +262,12 @@ class Autotest
215
262
  full, partial = files_to_test.partition { |k,v| v.empty? }
216
263
 
217
264
  unless full.empty? then
218
- classes = full.map {|k,v| k}.flatten.join(' ')
219
- cmds << "#{ruby} -I#{@libs} -rtest/unit -e \"%w[#{classes}].each { |f| require f }\" | unit_diff -u"
265
+ classes = full.map {|k,v| k}.flatten.uniq.sort.join(' ')
266
+ cmds << "#{ruby} -I#{@libs} -rtest/unit -e \"%w[#{classes}].each { |f| require f }\" | #{unit_diff}"
220
267
  end
221
268
 
222
269
  partial.each do |klass, methods|
223
- cmds << "#{ruby} -I#{@libs} #{klass} -n \"/^(#{Regexp.union(*methods).source})$/\" | unit_diff -u"
270
+ cmds << "#{ruby} -I#{@libs} #{klass} -n \"/^(#{Regexp.union(*methods).source})$/\" | #{unit_diff}"
224
271
  end
225
272
 
226
273
  return cmds.join('; ')
@@ -241,7 +288,7 @@ class Autotest
241
288
  @tainted = false
242
289
  hook :reset
243
290
  end
244
-
291
+
245
292
  def ruby
246
293
  ruby = File.join(Config::CONFIG['bindir'],
247
294
  Config::CONFIG['ruby_install_name'])
@@ -254,18 +301,12 @@ class Autotest
254
301
  end
255
302
 
256
303
  def tests_for_file(filename)
257
- case filename
258
- when /^lib\/.*\.rb$/ then
259
- impl = File.basename(filename).gsub '_', '_?'
260
- @files.keys.select do |k|
261
- k =~ %r%^test/.*#{impl}$%
262
- end
263
- when /^test\/test_.*rb$/ then
264
- [filename]
265
- else
266
- @output.puts "Dunno! #{filename}" if $TESTING
267
- []
268
- end
304
+ result = @test_mappings.find { |file_re, ignored| filename =~ file_re }
305
+ result = result.nil? ? [] : Array(result.last.call(filename, $~))
306
+
307
+ @output.puts "Dunno! #{filename}" if $TESTING and result.empty?
308
+
309
+ result.sort.uniq
269
310
  end
270
311
 
271
312
  def wait_for_changes
@@ -275,6 +316,12 @@ class Autotest
275
316
  end until find_files_to_test
276
317
  end
277
318
 
319
+ def files_matching regexp
320
+ @files.keys.select { |k|
321
+ k =~ regexp
322
+ }
323
+ end
324
+
278
325
  ############################################################
279
326
  # Hooks:
280
327