ZenTest 4.4.0 → 4.4.1
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/History.txt +30 -0
- data/Manifest.txt +2 -0
- data/README.txt +8 -11
- data/Rakefile +3 -10
- data/bin/autotest +5 -53
- data/bin/zentest +1 -6
- data/example_dot_autotest.rb +4 -0
- data/lib/autotest.rb +175 -58
- data/lib/autotest/bundler.rb +10 -0
- data/lib/autotest/isolate.rb +18 -0
- data/lib/autotest/restart.rb +4 -3
- data/lib/focus.rb +4 -0
- data/lib/unit_diff.rb +3 -5
- data/lib/zentest.rb +42 -1
- data/test/test_autotest.rb +6 -7
- metadata +12 -42
- data.tar.gz.sig +0 -0
- metadata.gz.sig +0 -1
data/History.txt
CHANGED
@@ -1,3 +1,33 @@
|
|
1
|
+
=== 4.4.1 / 2010-12-01
|
2
|
+
|
3
|
+
* 12 minor enhancements:
|
4
|
+
|
5
|
+
* Merged in most things from the autotest gem:
|
6
|
+
* Added --no-full-after-failed. (grosser)
|
7
|
+
* Added --rc path-to-dot-autotest. (grosser)
|
8
|
+
* Added --style autotest-style. (grosser)
|
9
|
+
* Added clarification comments. (grosser)
|
10
|
+
* Added rake task descriptions. (grosser)
|
11
|
+
* Switched to optparse. (grosser)
|
12
|
+
* Switched windoze detection. (grosser, tenderlove)
|
13
|
+
* Did not merge test parallelization. It should be a plugin. Awaiting patch.
|
14
|
+
* Added autotest/bundler plugin.
|
15
|
+
* Added autotest/isolate plugin.
|
16
|
+
* Added capture of skips (for minitest) from result line.
|
17
|
+
* Added focus_re to focus.rb.
|
18
|
+
* Added latest_results hash.
|
19
|
+
* Cleaned up unit_diff matcher by using any?
|
20
|
+
* Enhanced the help/usage for autotest and zentest. (hugh sasse)
|
21
|
+
* Refactored autotest runner discovery.
|
22
|
+
* Refactored ruby_cmd to allow plugins to affect ruby execution.
|
23
|
+
* Removed befuddling override of Dir.[] from 2007. *shrug*
|
24
|
+
* Removed deny method in favor of aliasing refute.
|
25
|
+
|
26
|
+
* 2 bug fixes:
|
27
|
+
|
28
|
+
* 1.9 shadowed variable fix
|
29
|
+
* autotest/restart now passes ARGV back through to exec. yay!
|
30
|
+
|
1
31
|
=== 4.4.0 / 2010-09-01
|
2
32
|
|
3
33
|
* 1 major enhancement:
|
data/Manifest.txt
CHANGED
data/README.txt
CHANGED
@@ -63,30 +63,27 @@ implementation.
|
|
63
63
|
|
64
64
|
(and other stuff for Test::Rails)
|
65
65
|
|
66
|
+
== Windows and Color
|
67
|
+
|
68
|
+
Read this: http://blog.mmediasys.com/2010/11/24/we-all-love-colors/
|
69
|
+
|
66
70
|
== REQUIREMENTS
|
67
71
|
|
68
72
|
* Ruby 1.6+, JRuby 1.1.2+, or rubinius
|
69
|
-
*
|
70
|
-
* Hoe
|
73
|
+
* A test/spec framework of your choice.
|
74
|
+
* Hoe (development)
|
71
75
|
* rubygems
|
72
|
-
* diff.exe on
|
76
|
+
* diff.exe on windows. Use http://gnuwin32.sourceforge.net/packages.html
|
73
77
|
|
74
78
|
== INSTALL
|
75
79
|
|
76
|
-
Using Rubygems:
|
77
|
-
|
78
80
|
* sudo gem install ZenTest
|
79
81
|
|
80
|
-
Using Rake:
|
81
|
-
|
82
|
-
* rake test
|
83
|
-
* sudo rake install
|
84
|
-
|
85
82
|
== LICENSE
|
86
83
|
|
87
84
|
(The MIT License)
|
88
85
|
|
89
|
-
Copyright (c)
|
86
|
+
Copyright (c) Ryan Davis, Eric Hodel, Zen Spider Software, Seattle.rb
|
90
87
|
|
91
88
|
Permission is hereby granted, free of charge, to any person obtaining
|
92
89
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
|
3
|
-
|
3
|
+
$LOAD_PATH << 'lib'
|
4
4
|
|
5
5
|
require 'rubygems'
|
6
6
|
require 'hoe'
|
@@ -14,10 +14,12 @@ Hoe.spec "ZenTest" do
|
|
14
14
|
developer 'Eric Hodel', 'drbrain@segment7.net'
|
15
15
|
end
|
16
16
|
|
17
|
+
desc "run autotest on itself"
|
17
18
|
task :autotest do
|
18
19
|
ruby "-Ilib -w ./bin/autotest"
|
19
20
|
end
|
20
21
|
|
22
|
+
desc "update example_dot_autotest.rb with all possible constants"
|
21
23
|
task :update do
|
22
24
|
system "p4 edit example_dot_autotest.rb"
|
23
25
|
File.open "example_dot_autotest.rb", "w" do |f|
|
@@ -46,14 +48,5 @@ task :update do
|
|
46
48
|
system "p4 diff -du example_dot_autotest.rb"
|
47
49
|
end
|
48
50
|
|
49
|
-
task :sort do
|
50
|
-
begin
|
51
|
-
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'
|
52
|
-
sh 'for f in test/test_*.rb; do echo $f; grep "^ *def.test_" $f > x; sort x > y; echo $f; echo; diff x y; done'
|
53
|
-
ensure
|
54
|
-
sh 'rm x y'
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
51
|
# vim:syntax=ruby
|
59
52
|
|
data/bin/autotest
CHANGED
@@ -1,55 +1,7 @@
|
|
1
|
-
#!/usr/
|
2
|
-
|
3
|
-
$v ||= false
|
4
|
-
$h ||= false
|
5
|
-
$f ||= false
|
6
|
-
$q ||= false
|
7
|
-
$help ||= false
|
8
|
-
|
9
|
-
if $h or $help then
|
10
|
-
help = [
|
11
|
-
"autotest [options]",
|
12
|
-
nil,
|
13
|
-
"options:",
|
14
|
-
"\t-h",
|
15
|
-
"\t-help\t\tYou're looking at it.",
|
16
|
-
nil,
|
17
|
-
"\t-v\t\tBe verbose.",
|
18
|
-
"\t\t\tPrints files that autotest doesn't know how to map to",
|
19
|
-
"\t\t\ttests.",
|
20
|
-
nil,
|
21
|
-
"\t-q\t\tBe more quiet.",
|
22
|
-
nil,
|
23
|
-
"\t-f\t\tFast start.",
|
24
|
-
"\t\t\tDoesn't initially run tests at start.",
|
25
|
-
]
|
26
|
-
STDERR.puts help.join("\n")
|
27
|
-
exit 1
|
28
|
-
end
|
29
|
-
|
30
|
-
class Dir
|
31
|
-
class << self
|
32
|
-
alias :old_index :[]
|
33
|
-
def [](*args)
|
34
|
-
$-w, old_warn = false, $-w
|
35
|
-
old_index(*args)
|
36
|
-
ensure
|
37
|
-
$-w = old_warn
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$-w = true
|
41
3
|
|
42
4
|
require 'autotest'
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
mod = "autotest/#{style.join("_")}"
|
47
|
-
puts "loading #{mod}"
|
48
|
-
begin
|
49
|
-
require mod
|
50
|
-
rescue LoadError
|
51
|
-
abort "Autotest style #{mod} doesn't seem to exist. Aborting."
|
52
|
-
end
|
53
|
-
target = Autotest.const_get(style.map {|s| s.capitalize}.join)
|
54
|
-
end
|
55
|
-
target.run
|
5
|
+
|
6
|
+
Autotest.parse_options
|
7
|
+
Autotest.runner.run
|
data/bin/zentest
CHANGED
@@ -10,12 +10,7 @@ if defined? $v then
|
|
10
10
|
end
|
11
11
|
|
12
12
|
if defined? $h then
|
13
|
-
|
14
|
-
puts " -h display this information"
|
15
|
-
puts " -v display version information"
|
16
|
-
puts " -r Reverse mapping (ClassTest instead of TestClass)"
|
17
|
-
puts " -e (Rapid XP) eval the code generated instead of printing it"
|
18
|
-
exit 0
|
13
|
+
ZenTest.usage_with_exit
|
19
14
|
end
|
20
15
|
|
21
16
|
code = ZenTest.fix(*ARGV)
|
data/example_dot_autotest.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
|
3
3
|
# require 'autotest/autoupdate'
|
4
|
+
# require 'autotest/bundler'
|
5
|
+
# require 'autotest/isolate'
|
4
6
|
# require 'autotest/once'
|
5
7
|
# require 'autotest/rcov'
|
6
8
|
# require 'autotest/restart'
|
@@ -8,5 +10,7 @@
|
|
8
10
|
|
9
11
|
# Autotest::AutoUpdate.sleep_time = o
|
10
12
|
# Autotest::AutoUpdate.update_cmd = o
|
13
|
+
# Autotest::Isolate.dir = o
|
11
14
|
# Autotest::RCov.command = o
|
12
15
|
# Autotest::RCov.pattern = o
|
16
|
+
# Autotest::RCov.options = o
|
data/lib/autotest.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'find'
|
2
2
|
require 'rbconfig'
|
3
3
|
|
4
|
-
$v ||= false
|
5
4
|
$TESTING = false unless defined? $TESTING
|
6
5
|
|
7
6
|
##
|
@@ -66,14 +65,100 @@ class Autotest
|
|
66
65
|
ALL_HOOKS = [ :all_good, :died, :green, :initialize, :interrupt, :quit,
|
67
66
|
:ran_command, :red, :reset, :run_command, :updated, :waiting ]
|
68
67
|
|
68
|
+
def self.options
|
69
|
+
@@options ||= {}
|
70
|
+
end
|
71
|
+
|
72
|
+
def options
|
73
|
+
self.class.options
|
74
|
+
end
|
75
|
+
|
69
76
|
HOOKS = Hash.new { |h,k| h[k] = [] }
|
70
77
|
unless defined? WINDOZE then
|
71
|
-
WINDOZE = /
|
78
|
+
WINDOZE = /mswin|mingw/ =~ RbConfig::CONFIG['host_os']
|
72
79
|
SEP = WINDOZE ? '&' : ';'
|
73
80
|
end
|
74
81
|
|
75
82
|
@@discoveries = []
|
76
83
|
|
84
|
+
def self.parse_options
|
85
|
+
require 'optparse'
|
86
|
+
options = {}
|
87
|
+
OptionParser.new do |opts|
|
88
|
+
opts.banner = <<-BANNER.gsub(/^ /, '')
|
89
|
+
Continuous testing for your ruby app.
|
90
|
+
|
91
|
+
Autotest automatically tests code that has changed. It
|
92
|
+
assumes the code is in lib, and tests are in tests. Autotest
|
93
|
+
uses plugins to control what happens. You configure plugins
|
94
|
+
with require statements in the .autotest file in your
|
95
|
+
project base directory, and a default configuration for all
|
96
|
+
your projects in the .autotest file in your home directory.
|
97
|
+
|
98
|
+
Usage:
|
99
|
+
autotest [options]
|
100
|
+
BANNER
|
101
|
+
|
102
|
+
opts.on "-f", "--fast-start", "Do not run full tests at start" do
|
103
|
+
options[:no_full_after_start] = true
|
104
|
+
end
|
105
|
+
|
106
|
+
opts.on("-c", "--no-full-after-failed",
|
107
|
+
"Do not run all tests on red->green") do
|
108
|
+
options[:no_full_after_failed] = true
|
109
|
+
end
|
110
|
+
|
111
|
+
opts.on "-v", "--verbose", "Be annoyingly verbose (debugs .autotest)." do
|
112
|
+
options[:verbose] = true
|
113
|
+
end
|
114
|
+
|
115
|
+
opts.on "-q", "--quiet", "Be quiet." do
|
116
|
+
options[:quiet] = true
|
117
|
+
end
|
118
|
+
|
119
|
+
opts.on("-r", "--rc CONF", String, "Override path to config file") do |o|
|
120
|
+
options[:rc] = o
|
121
|
+
end
|
122
|
+
|
123
|
+
opts.on("-s", "--style STYLE", String,
|
124
|
+
"Manually specify test style. (default: autodiscover)") do |style|
|
125
|
+
options[:style] = Array(style)
|
126
|
+
end
|
127
|
+
|
128
|
+
opts.on "-h", "--help", "Show this." do
|
129
|
+
puts opts
|
130
|
+
exit 1
|
131
|
+
end
|
132
|
+
end.parse!
|
133
|
+
|
134
|
+
Autotest.options.merge! options
|
135
|
+
|
136
|
+
options
|
137
|
+
end
|
138
|
+
|
139
|
+
##
|
140
|
+
# Calculates the autotest runner to use to run the tests.
|
141
|
+
#
|
142
|
+
# Can be overridden with --style, otherwise uses ::autodiscover.
|
143
|
+
|
144
|
+
def self.runner
|
145
|
+
style = options[:style] || Autotest.autodiscover
|
146
|
+
target = Autotest
|
147
|
+
|
148
|
+
unless style.empty? then
|
149
|
+
mod = "autotest/#{style.join "_"}"
|
150
|
+
puts "loading #{mod}"
|
151
|
+
begin
|
152
|
+
require mod
|
153
|
+
rescue LoadError
|
154
|
+
abort "Autotest style #{mod} doesn't seem to exist. Aborting."
|
155
|
+
end
|
156
|
+
target = Autotest.const_get(style.map {|s| s.capitalize}.join)
|
157
|
+
end
|
158
|
+
|
159
|
+
target
|
160
|
+
end
|
161
|
+
|
77
162
|
##
|
78
163
|
# Add a proc to the collection of discovery procs. See
|
79
164
|
# +autodiscover+.
|
@@ -114,7 +199,8 @@ class Autotest
|
|
114
199
|
load f
|
115
200
|
end
|
116
201
|
|
117
|
-
|
202
|
+
# call all discovery procs and determine the style to use
|
203
|
+
@@discoveries.map{ |proc| proc.call }.flatten.compact.sort.uniq
|
118
204
|
end
|
119
205
|
|
120
206
|
##
|
@@ -132,10 +218,12 @@ class Autotest
|
|
132
218
|
:files_to_test,
|
133
219
|
:find_order,
|
134
220
|
:interrupted,
|
221
|
+
:latest_results,
|
135
222
|
:last_mtime,
|
136
223
|
:libs,
|
137
224
|
:order,
|
138
225
|
:output,
|
226
|
+
:prefix,
|
139
227
|
:results,
|
140
228
|
:sleep,
|
141
229
|
:tainted,
|
@@ -155,7 +243,8 @@ class Autotest
|
|
155
243
|
@exception_list = []
|
156
244
|
@test_mappings = []
|
157
245
|
|
158
|
-
self.completed_re =
|
246
|
+
self.completed_re =
|
247
|
+
/\d+ tests, \d+ assertions, \d+ failures, \d+ errors(, \d+ skips)?/
|
159
248
|
self.extra_class_map = {}
|
160
249
|
self.extra_files = []
|
161
250
|
self.failed_results_re = /^\s+\d+\) (?:Failure|Error):\n(.*?)\((.*?)\)/
|
@@ -165,21 +254,28 @@ class Autotest
|
|
165
254
|
self.libs = %w[. lib test].join(File::PATH_SEPARATOR)
|
166
255
|
self.order = :random
|
167
256
|
self.output = $stderr
|
257
|
+
self.prefix = nil
|
168
258
|
self.sleep = 1
|
169
259
|
self.testlib = "test/unit"
|
170
260
|
self.find_directories = ['.']
|
171
261
|
self.unit_diff = "unit_diff -u"
|
262
|
+
self.latest_results = nil
|
172
263
|
|
264
|
+
# file in /lib -> run test in /test
|
173
265
|
self.add_mapping(/^lib\/.*\.rb$/) do |filename, _|
|
174
|
-
possible = File.basename(filename).gsub '_', '_?'
|
266
|
+
possible = File.basename(filename).gsub '_', '_?' # ' stupid emacs
|
175
267
|
files_matching %r%^test/.*#{possible}$%
|
176
268
|
end
|
177
269
|
|
270
|
+
# file in /test -> run it
|
178
271
|
self.add_mapping(/^test.*\/test_.*rb$/) do |filename, _|
|
179
272
|
filename
|
180
273
|
end
|
181
274
|
|
182
|
-
[File.expand_path('~/.autotest'), './.autotest']
|
275
|
+
default_configs = [File.expand_path('~/.autotest'), './.autotest']
|
276
|
+
configs = options[:rc] || default_configs
|
277
|
+
|
278
|
+
configs.each do |f|
|
183
279
|
load f if File.exist? f
|
184
280
|
end
|
185
281
|
end
|
@@ -193,12 +289,12 @@ class Autotest
|
|
193
289
|
reset
|
194
290
|
add_sigint_handler
|
195
291
|
|
196
|
-
self.last_mtime = Time.now if
|
292
|
+
self.last_mtime = Time.now if options[:no_full_after_start]
|
197
293
|
|
198
|
-
loop do
|
199
|
-
begin
|
294
|
+
loop do
|
295
|
+
begin # ^c handler
|
200
296
|
get_to_green
|
201
|
-
if tainted? then
|
297
|
+
if tainted? and not options[:no_full_after_failed] then
|
202
298
|
rerun_all_tests
|
203
299
|
else
|
204
300
|
hook :all_good
|
@@ -237,14 +333,14 @@ class Autotest
|
|
237
333
|
cmd = self.make_test_cmd self.files_to_test
|
238
334
|
return if cmd.empty?
|
239
335
|
|
240
|
-
puts cmd unless
|
336
|
+
puts cmd unless options[:quiet]
|
241
337
|
|
242
338
|
old_sync = $stdout.sync
|
243
339
|
$stdout.sync = true
|
244
340
|
self.results = []
|
245
341
|
line = []
|
246
342
|
begin
|
247
|
-
open
|
343
|
+
open "| #{cmd}", "r" do |f|
|
248
344
|
until f.eof? do
|
249
345
|
c = f.getc or break
|
250
346
|
if RUBY19 then
|
@@ -269,7 +365,7 @@ class Autotest
|
|
269
365
|
hook :ran_command
|
270
366
|
self.results = self.results.join
|
271
367
|
|
272
|
-
handle_results
|
368
|
+
handle_results self.results
|
273
369
|
end
|
274
370
|
|
275
371
|
############################################################
|
@@ -305,26 +401,26 @@ class Autotest
|
|
305
401
|
# Convert a path in a string, s, into a class name, changing
|
306
402
|
# underscores to CamelCase, etc.
|
307
403
|
|
308
|
-
def path_to_classname
|
404
|
+
def path_to_classname s
|
309
405
|
sep = File::SEPARATOR
|
310
|
-
f = s.sub(/^test#{sep}/, '').sub(/\.rb$/, '').split
|
406
|
+
f = s.sub(/^test#{sep}/, '').sub(/\.rb$/, '').split sep
|
311
407
|
f = f.map { |path| path.split(/_|(\d+)/).map { |seg| seg.capitalize }.join }
|
312
408
|
f = f.map { |path| path =~ /^Test/ ? path : "Test#{path}" }
|
313
409
|
|
314
|
-
f.join
|
410
|
+
f.join '::'
|
315
411
|
end
|
316
412
|
|
317
413
|
##
|
318
414
|
# Returns a hash mapping a file name to the known failures for that
|
319
415
|
# file.
|
320
416
|
|
321
|
-
def consolidate_failures
|
417
|
+
def consolidate_failures failed
|
322
418
|
filters = new_hash_of_arrays
|
323
419
|
|
324
420
|
class_map = Hash[*self.find_order.grep(/^test/).map { |f| # TODO: ugly
|
325
421
|
[path_to_classname(f), f]
|
326
422
|
}.flatten]
|
327
|
-
class_map.merge!
|
423
|
+
class_map.merge! self.extra_class_map
|
328
424
|
|
329
425
|
failed.each do |method, klass|
|
330
426
|
if class_map.has_key? klass then
|
@@ -334,7 +430,7 @@ class Autotest
|
|
334
430
|
end
|
335
431
|
end
|
336
432
|
|
337
|
-
|
433
|
+
filters
|
338
434
|
end
|
339
435
|
|
340
436
|
##
|
@@ -349,7 +445,7 @@ class Autotest
|
|
349
445
|
|
350
446
|
targets.each do |target|
|
351
447
|
order = []
|
352
|
-
Find.find
|
448
|
+
Find.find target do |f|
|
353
449
|
Find.prune if f =~ self.exceptions
|
354
450
|
|
355
451
|
next if test ?d, f
|
@@ -364,23 +460,26 @@ class Autotest
|
|
364
460
|
self.find_order.push(*order.sort)
|
365
461
|
end
|
366
462
|
|
367
|
-
|
463
|
+
result
|
368
464
|
end
|
369
465
|
|
370
466
|
##
|
371
467
|
# Find the files which have been modified, update the recorded
|
372
|
-
# timestamps, and use this to update the files to test. Returns
|
373
|
-
#
|
374
|
-
#
|
468
|
+
# timestamps, and use this to update the files to test. Returns
|
469
|
+
# the latest mtime of the files modified or nil when nothing was
|
470
|
+
# modified.
|
375
471
|
|
376
472
|
def find_files_to_test files = find_files
|
377
473
|
updated = files.select { |filename, mtime| self.last_mtime < mtime }
|
378
474
|
|
379
|
-
|
475
|
+
# nothing to update or initially run
|
476
|
+
unless updated.empty? || self.last_mtime.to_i == 0 then
|
477
|
+
p updated if options[:verbose]
|
380
478
|
|
381
|
-
|
479
|
+
hook :updated, updated
|
480
|
+
end
|
382
481
|
|
383
|
-
updated.map { |f,m| test_files_for
|
482
|
+
updated.map { |f,m| test_files_for f }.flatten.uniq.each do |filename|
|
384
483
|
self.files_to_test[filename] # creates key with default value
|
385
484
|
end
|
386
485
|
|
@@ -395,14 +494,21 @@ class Autotest
|
|
395
494
|
# Check results for failures, set the "bar" to red or green, and if
|
396
495
|
# there are failures record this.
|
397
496
|
|
398
|
-
def handle_results
|
399
|
-
failed = results.scan
|
400
|
-
completed = results
|
497
|
+
def handle_results results
|
498
|
+
failed = results.scan self.failed_results_re
|
499
|
+
completed = results[self.completed_re]
|
500
|
+
|
501
|
+
if completed then
|
502
|
+
completed = completed.scan(/(\d+) (\w+)/).map { |v, k| [k, v.to_i] }
|
401
503
|
|
402
|
-
|
504
|
+
self.latest_results = Hash[*completed.flatten]
|
505
|
+
self.files_to_test = consolidate_failures failed
|
403
506
|
|
404
|
-
|
405
|
-
|
507
|
+
color = self.files_to_test.empty? ? :green : :red
|
508
|
+
hook color unless $TESTING
|
509
|
+
else
|
510
|
+
self.latest_results = nil
|
511
|
+
end
|
406
512
|
|
407
513
|
self.tainted = true unless self.files_to_test.empty?
|
408
514
|
end
|
@@ -417,26 +523,32 @@ class Autotest
|
|
417
523
|
@known_files
|
418
524
|
end
|
419
525
|
|
526
|
+
##
|
527
|
+
# Returns the base of the ruby command.
|
528
|
+
|
529
|
+
def ruby_cmd
|
530
|
+
"#{prefix}#{ruby} -I#{libs} -rubygems"
|
531
|
+
end
|
532
|
+
|
420
533
|
##
|
421
534
|
# Generate the commands to test the supplied files
|
422
535
|
|
423
536
|
def make_test_cmd files_to_test
|
424
537
|
cmds = []
|
425
538
|
full, partial = reorder(files_to_test).partition { |k,v| v.empty? }
|
426
|
-
base_cmd = "#{ruby} -I#{libs} -rubygems"
|
427
539
|
|
428
540
|
unless full.empty? then
|
429
541
|
classes = full.map {|k,v| k}.flatten.uniq
|
430
542
|
classes.unshift testlib
|
431
|
-
cmds << "#{
|
543
|
+
cmds << "#{ruby_cmd} -e \"%w[#{classes.join ' '}].each { |f| require f }\" | #{unit_diff}"
|
432
544
|
end
|
433
545
|
|
434
546
|
partial.each do |klass, methods|
|
435
547
|
regexp = Regexp.union(*methods).source
|
436
|
-
cmds << "#{
|
548
|
+
cmds << "#{ruby_cmd} #{klass} -n \"/^(#{regexp})$/\" | #{unit_diff}"
|
437
549
|
end
|
438
550
|
|
439
|
-
|
551
|
+
cmds.join "#{SEP} "
|
440
552
|
end
|
441
553
|
|
442
554
|
def new_hash_of_arrays
|
@@ -451,7 +563,7 @@ class Autotest
|
|
451
563
|
files_to_test.sort_by { |k,v| k }.reverse
|
452
564
|
when :random then
|
453
565
|
max = files_to_test.size
|
454
|
-
files_to_test.sort_by { |k,v| rand
|
566
|
+
files_to_test.sort_by { |k,v| rand max }
|
455
567
|
when :natural then
|
456
568
|
(self.find_order & files_to_test.keys).map { |f| [f, files_to_test[f]] }
|
457
569
|
else
|
@@ -476,10 +588,11 @@ class Autotest
|
|
476
588
|
def reset
|
477
589
|
self.files_to_test.clear
|
478
590
|
self.find_order.clear
|
479
|
-
|
480
|
-
self.
|
481
|
-
self.
|
482
|
-
self.
|
591
|
+
|
592
|
+
self.interrupted = false
|
593
|
+
self.known_files = nil
|
594
|
+
self.last_mtime = T0
|
595
|
+
self.tainted = false
|
483
596
|
self.wants_to_quit = false
|
484
597
|
|
485
598
|
hook :reset
|
@@ -503,7 +616,7 @@ class Autotest
|
|
503
616
|
# a +test_mapping+ that matches the file and executing the mapping's
|
504
617
|
# proc.
|
505
618
|
|
506
|
-
def test_files_for
|
619
|
+
def test_files_for filename
|
507
620
|
result = @test_mappings.find { |file_re, ignored| filename =~ file_re }
|
508
621
|
|
509
622
|
p :test_file_for => [filename, result.first] if result and $DEBUG
|
@@ -511,7 +624,7 @@ class Autotest
|
|
511
624
|
result = result.nil? ? [] : [result.last.call(filename, $~)].flatten
|
512
625
|
|
513
626
|
output.puts "No tests matched #{filename}" if
|
514
|
-
(
|
627
|
+
(options[:verbose] or $TESTING) and result.empty?
|
515
628
|
|
516
629
|
result.sort.uniq.select { |f| known_files[f] }
|
517
630
|
end
|
@@ -546,7 +659,7 @@ class Autotest
|
|
546
659
|
# at.files_matching(/^test.*rb$/)
|
547
660
|
# end
|
548
661
|
|
549
|
-
def add_mapping
|
662
|
+
def add_mapping regexp, prepend = false, &proc
|
550
663
|
if prepend then
|
551
664
|
@test_mappings.unshift [regexp, proc]
|
552
665
|
else
|
@@ -616,11 +729,11 @@ class Autotest
|
|
616
729
|
|
617
730
|
def exceptions
|
618
731
|
unless defined? @exceptions then
|
619
|
-
if @exception_list.empty? then
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
732
|
+
@exceptions = if @exception_list.empty? then
|
733
|
+
nil
|
734
|
+
else
|
735
|
+
Regexp.union(*@exception_list)
|
736
|
+
end
|
624
737
|
end
|
625
738
|
|
626
739
|
@exceptions
|
@@ -630,11 +743,17 @@ class Autotest
|
|
630
743
|
# Hooks:
|
631
744
|
|
632
745
|
##
|
633
|
-
# Call the event hook named +name+,
|
634
|
-
#
|
635
|
-
#
|
746
|
+
# Call the event hook named +name+, passing in optional args
|
747
|
+
# depending on the hook itself.
|
748
|
+
#
|
749
|
+
# Returns false if no hook handled the event.
|
750
|
+
#
|
751
|
+
# === Hook Writers!
|
752
|
+
#
|
753
|
+
# This executes all registered hooks <em>until one returns truthy</em>.
|
754
|
+
# Pay attention to the return value of your block!
|
636
755
|
|
637
|
-
def hook
|
756
|
+
def hook name, *args
|
638
757
|
deprecated = {
|
639
758
|
# none currently
|
640
759
|
}
|
@@ -643,16 +762,14 @@ class Autotest
|
|
643
762
|
warn "hook #{name} has been deprecated, use #{deprecated[name]}"
|
644
763
|
end
|
645
764
|
|
646
|
-
HOOKS[name].any?
|
647
|
-
plugin[self, *args]
|
648
|
-
end
|
765
|
+
HOOKS[name].any? { |plugin| plugin[self, *args] }
|
649
766
|
end
|
650
767
|
|
651
768
|
##
|
652
769
|
# Add the supplied block to the available hooks, with the given
|
653
770
|
# name.
|
654
771
|
|
655
|
-
def self.add_hook
|
772
|
+
def self.add_hook name, &block
|
656
773
|
HOOKS[name] << block
|
657
774
|
end
|
658
775
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
##
|
2
|
+
# Run autotest with isolate support.
|
3
|
+
|
4
|
+
module Autotest::Isolate
|
5
|
+
@@dir = "tmp/isolate/#{Gem.ruby_engine}-#{RbConfig::CONFIG['ruby_version']}"
|
6
|
+
|
7
|
+
def self.dir= o
|
8
|
+
@@dir = o
|
9
|
+
end
|
10
|
+
|
11
|
+
Autotest.add_hook :initialize do |at|
|
12
|
+
ENV["GEM_PATH"] = dir
|
13
|
+
ENV["PATH"] += ":#{@@dir}/bin"
|
14
|
+
|
15
|
+
Gem.clear_paths
|
16
|
+
false
|
17
|
+
end
|
18
|
+
end
|
data/lib/autotest/restart.rb
CHANGED
@@ -2,10 +2,11 @@ module Autotest::Restart
|
|
2
2
|
Autotest.add_hook :updated do |at, *args|
|
3
3
|
if args.flatten.include? ".autotest" then
|
4
4
|
warn "Detected change to .autotest, restarting"
|
5
|
-
cmd =
|
5
|
+
cmd = %w(autotest)
|
6
6
|
cmd << " -v" if $v
|
7
|
-
|
8
|
-
|
7
|
+
cmd += ARGV
|
8
|
+
|
9
|
+
exec(*cmd)
|
9
10
|
end
|
10
11
|
end
|
11
12
|
end
|
data/lib/focus.rb
CHANGED
data/lib/unit_diff.rb
CHANGED
@@ -97,12 +97,10 @@ class UnitDiff
|
|
97
97
|
footer = data.pop
|
98
98
|
|
99
99
|
data.map do |result|
|
100
|
-
break if result.
|
101
|
-
line =~ / expected( but was|, not)/
|
102
|
-
end
|
100
|
+
break if result.any? { |l| l =~ / expected( but was|, not)/ }
|
103
101
|
|
104
|
-
header = result.find do |
|
105
|
-
|
102
|
+
header = result.find do |l|
|
103
|
+
l =~ /^\(?\s*\d+\) (Failure|Error):/
|
106
104
|
end
|
107
105
|
|
108
106
|
break unless header
|
data/lib/zentest.rb
CHANGED
@@ -53,7 +53,7 @@ end
|
|
53
53
|
|
54
54
|
class ZenTest
|
55
55
|
|
56
|
-
VERSION = '4.4.
|
56
|
+
VERSION = '4.4.1'
|
57
57
|
|
58
58
|
include ZenTestMapping
|
59
59
|
|
@@ -524,10 +524,51 @@ class ZenTest
|
|
524
524
|
return @result.join("\n")
|
525
525
|
end
|
526
526
|
|
527
|
+
# Provide a certain amount of help.
|
528
|
+
def self.usage
|
529
|
+
puts <<-EO_USAGE
|
530
|
+
usage: #{File.basename $0} [options] test-and-implementation-files...
|
531
|
+
|
532
|
+
ZenTest scans your target and unit-test code and writes your missing
|
533
|
+
code based on simple naming rules, enabling XP at a much quicker
|
534
|
+
pace. ZenTest only works with Ruby and Test::Unit.
|
535
|
+
|
536
|
+
ZenTest uses the following rules to figure out what code should be
|
537
|
+
generated:
|
538
|
+
|
539
|
+
* Definition:
|
540
|
+
* CUT = Class Under Test
|
541
|
+
* TC = Test Class (for CUT)
|
542
|
+
* TC's name is the same as CUT w/ "Test" prepended at every scope level.
|
543
|
+
* Example: TestA::TestB vs A::B.
|
544
|
+
* CUT method names are used in CT, with "test_" prependend and optional "_ext" extensions for differentiating test case edge boundaries.
|
545
|
+
* Example:
|
546
|
+
* A::B#blah
|
547
|
+
* TestA::TestB#test_blah_normal
|
548
|
+
* TestA::TestB#test_blah_missing_file
|
549
|
+
* All naming conventions are bidirectional with the exception of test extensions.
|
550
|
+
|
551
|
+
options:
|
552
|
+
-h display this information
|
553
|
+
-v display version information
|
554
|
+
-r Reverse mapping (ClassTest instead of TestClass)
|
555
|
+
-e (Rapid XP) eval the code generated instead of printing it
|
556
|
+
|
557
|
+
EO_USAGE
|
558
|
+
end
|
559
|
+
|
560
|
+
# Give help, then quit.
|
561
|
+
def self.usage_with_exit
|
562
|
+
self.usage
|
563
|
+
exit 0
|
564
|
+
end
|
565
|
+
|
527
566
|
# Runs ZenTest over all the supplied files so that
|
528
567
|
# they are analysed and the missing methods have
|
529
568
|
# skeleton code written.
|
569
|
+
# If no files are supplied, splutter out some help.
|
530
570
|
def self.fix(*files)
|
571
|
+
ZenTest.usage_with_exit if files.empty?
|
531
572
|
zentest = ZenTest.new
|
532
573
|
zentest.scan_files(*files)
|
533
574
|
zentest.analyze
|
data/test/test_autotest.rb
CHANGED
@@ -28,13 +28,7 @@ end
|
|
28
28
|
|
29
29
|
class TestAutotest < MiniTest::Unit::TestCase
|
30
30
|
|
31
|
-
|
32
|
-
if msg then
|
33
|
-
assert ! test, msg
|
34
|
-
else
|
35
|
-
assert ! test
|
36
|
-
end
|
37
|
-
end unless respond_to? :deny
|
31
|
+
alias :deny :refute
|
38
32
|
|
39
33
|
RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']) unless defined? RUBY
|
40
34
|
|
@@ -288,6 +282,9 @@ Finished in 0.001655 seconds.
|
|
288
282
|
@a.handle_results(s1)
|
289
283
|
assert_equal empty, @a.files_to_test, "must stay empty"
|
290
284
|
|
285
|
+
exp = { "tests" => 12, "assertions" => 18, "failures" => 0, "errors" => 0 }
|
286
|
+
assert_equal exp, @a.latest_results
|
287
|
+
|
291
288
|
s2 = "
|
292
289
|
1) Failure:
|
293
290
|
test_fail1(#{@test_class}) [#{@test}:59]:
|
@@ -305,6 +302,8 @@ test_error2(#{@test_class}):
|
|
305
302
|
expected = { @test => %w( test_fail1 test_fail2 test_error1 test_error2 ) }
|
306
303
|
assert_equal expected, @a.files_to_test
|
307
304
|
assert @a.tainted
|
305
|
+
exp = { "tests" => 12, "assertions" => 18, "failures" => 2, "errors" => 2 }
|
306
|
+
assert_equal exp, @a.latest_results
|
308
307
|
|
309
308
|
@a.handle_results(s1)
|
310
309
|
assert_equal empty, @a.files_to_test
|
metadata
CHANGED
@@ -1,54 +1,30 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ZenTest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 47
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 4
|
8
7
|
- 4
|
9
|
-
-
|
10
|
-
version: 4.4.
|
8
|
+
- 1
|
9
|
+
version: 4.4.1
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Ryan Davis
|
14
13
|
- Eric Hodel
|
15
14
|
autorequire:
|
16
15
|
bindir: bin
|
17
|
-
cert_chain:
|
18
|
-
- |
|
19
|
-
-----BEGIN CERTIFICATE-----
|
20
|
-
MIIDPjCCAiagAwIBAgIBADANBgkqhkiG9w0BAQUFADBFMRMwEQYDVQQDDApyeWFu
|
21
|
-
ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
|
22
|
-
GRYDY29tMB4XDTA5MDMwNjE4NTMxNVoXDTEwMDMwNjE4NTMxNVowRTETMBEGA1UE
|
23
|
-
AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS
|
24
|
-
JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda
|
25
|
-
b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx
|
26
|
-
taCPaLmfYIaFcHHCSY4hYDJijRQkLxPeB3xbOfzfLoBDbjvx5JxgJxUjmGa7xhcT
|
27
|
-
oOvjtt5P8+GSK9zLzxQP0gVLS/D0FmoE44XuDr3iQkVS2ujU5zZL84mMNqNB1znh
|
28
|
-
GiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt
|
29
|
-
qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV
|
30
|
-
gBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
|
31
|
-
HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBBQUAA4IB
|
32
|
-
AQAY59gYvDxqSqgC92nAP9P8dnGgfZgLxP237xS6XxFGJSghdz/nI6pusfCWKM8m
|
33
|
-
vzjjH2wUMSSf3tNudQ3rCGLf2epkcU13/rguI88wO6MrE0wi4ZqLQX+eZQFskJb/
|
34
|
-
w6x9W1ur8eR01s397LSMexySDBrJOh34cm2AlfKr/jokKCTwcM0OvVZnAutaovC0
|
35
|
-
l1SVZ0ecg88bsWHA0Yhh7NFxK1utWoIhtB6AFC/+trM0FQEB/jZkIS8SaNzn96Rl
|
36
|
-
n0sZEf77FLf5peR8TP/PtmIg7Cyqz23sLM4mCOoTGIy5OcZ8TdyiyINUHtb5ej/T
|
37
|
-
FBHgymkyj/AOSqKRIpXPhjC6
|
38
|
-
-----END CERTIFICATE-----
|
16
|
+
cert_chain: []
|
39
17
|
|
40
|
-
date: 2010-
|
18
|
+
date: 2010-12-01 00:00:00 -08:00
|
41
19
|
default_executable:
|
42
20
|
dependencies:
|
43
21
|
- !ruby/object:Gem::Dependency
|
44
22
|
name: rubyforge
|
45
23
|
prerelease: false
|
46
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
47
|
-
none: false
|
48
25
|
requirements:
|
49
26
|
- - ">="
|
50
27
|
- !ruby/object:Gem::Version
|
51
|
-
hash: 7
|
52
28
|
segments:
|
53
29
|
- 2
|
54
30
|
- 0
|
@@ -60,32 +36,28 @@ dependencies:
|
|
60
36
|
name: minitest
|
61
37
|
prerelease: false
|
62
38
|
requirement: &id002 !ruby/object:Gem::Requirement
|
63
|
-
none: false
|
64
39
|
requirements:
|
65
40
|
- - ">="
|
66
41
|
- !ruby/object:Gem::Version
|
67
|
-
hash: 11
|
68
42
|
segments:
|
69
|
-
-
|
70
|
-
-
|
43
|
+
- 2
|
44
|
+
- 0
|
71
45
|
- 0
|
72
|
-
version:
|
46
|
+
version: 2.0.0
|
73
47
|
type: :development
|
74
48
|
version_requirements: *id002
|
75
49
|
- !ruby/object:Gem::Dependency
|
76
50
|
name: hoe
|
77
51
|
prerelease: false
|
78
52
|
requirement: &id003 !ruby/object:Gem::Requirement
|
79
|
-
none: false
|
80
53
|
requirements:
|
81
54
|
- - ">="
|
82
55
|
- !ruby/object:Gem::Version
|
83
|
-
hash: 21
|
84
56
|
segments:
|
85
57
|
- 2
|
86
58
|
- 6
|
87
|
-
-
|
88
|
-
version: 2.6.
|
59
|
+
- 0
|
60
|
+
version: 2.6.0
|
89
61
|
type: :development
|
90
62
|
version_requirements: *id003
|
91
63
|
description: |-
|
@@ -146,6 +118,8 @@ files:
|
|
146
118
|
- example_dot_autotest.rb
|
147
119
|
- lib/autotest.rb
|
148
120
|
- lib/autotest/autoupdate.rb
|
121
|
+
- lib/autotest/bundler.rb
|
122
|
+
- lib/autotest/isolate.rb
|
149
123
|
- lib/autotest/once.rb
|
150
124
|
- lib/autotest/rcov.rb
|
151
125
|
- lib/autotest/restart.rb
|
@@ -172,27 +146,23 @@ rdoc_options:
|
|
172
146
|
require_paths:
|
173
147
|
- lib
|
174
148
|
required_ruby_version: !ruby/object:Gem::Requirement
|
175
|
-
none: false
|
176
149
|
requirements:
|
177
150
|
- - ">="
|
178
151
|
- !ruby/object:Gem::Version
|
179
|
-
hash: 3
|
180
152
|
segments:
|
181
153
|
- 0
|
182
154
|
version: "0"
|
183
155
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
|
-
none: false
|
185
156
|
requirements:
|
186
157
|
- - ">="
|
187
158
|
- !ruby/object:Gem::Version
|
188
|
-
hash: 3
|
189
159
|
segments:
|
190
160
|
- 0
|
191
161
|
version: "0"
|
192
162
|
requirements: []
|
193
163
|
|
194
164
|
rubyforge_project: zentest
|
195
|
-
rubygems_version: 1.3.
|
165
|
+
rubygems_version: 1.3.6
|
196
166
|
signing_key:
|
197
167
|
specification_version: 3
|
198
168
|
summary: "ZenTest provides 4 different tools: zentest, unit_diff, autotest, and multiruby"
|
data.tar.gz.sig
DELETED
Binary file
|
metadata.gz.sig
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
�ж/�Hl5�<����ņsm�8C�����8��9��S�ᷴ�{V���o۳�da�p--������i�#[���55����g�ggԏ�VD��8B������.�3] ���3�����}�E����Bb�4��F�����g!�T���R��x(�Z�y��~���c�C0LЯ-�Eu>ck�p����ϐ\��/�D�<��yï��zJ���5�.$,6��`�� �c]���F��;ﳎ��H�&<w���
|