minitap 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.ruby ADDED
@@ -0,0 +1,39 @@
1
+ ---
2
+ authors:
3
+ - name: Thomas Sawyer
4
+ email: transfire@gmail.com
5
+ copyrights:
6
+ - holder: Thomas Sawyer
7
+ year: '2011'
8
+ license: BSD-2-Clause
9
+ replacements: []
10
+ conflicts: []
11
+ requirements:
12
+ - name: tapout
13
+ - name: detroit
14
+ groups:
15
+ - build
16
+ development: true
17
+ - name: reap
18
+ groups:
19
+ - build
20
+ development: true
21
+ dependencies: []
22
+ repositories: []
23
+ resources:
24
+ home: http://rubyworks.github.com/minitap
25
+ code: http://github.com/rubyworks/minitap
26
+ load_path:
27
+ - lib
28
+ extra: {}
29
+ name: minitap
30
+ title: TAP-Y/J for MiniTest
31
+ date: '2011-10-06'
32
+ alternatives: []
33
+ version: 0.1.0
34
+ revision: 0
35
+ source:
36
+ - ruby.yml
37
+ summary: MiniTest TAP-Y/J reporter
38
+ description: MiniTap provides a custom MiniTest reporter that outs TAP-Y or TAP-J
39
+ formatted output.
data/COPYING.rdoc ADDED
@@ -0,0 +1,59 @@
1
+ = COPYRIGHT NOTICES
2
+
3
+ == MiniTap
4
+
5
+ Copyright:: (c) 2010 Thomas Sawyer, Rubyworks
6
+ License:: BSD-2-Clause
7
+ Website:: http://rubyworks.github.com/tapout
8
+
9
+ Copyright 2011 Thomas Sawyer. All rights reserved.
10
+
11
+ Redistribution and use in source and binary forms, with or without
12
+ modification, are permitted provided that the following conditions are met:
13
+
14
+ 1. Redistributions of source code must retain the above copyright notice,
15
+ this list of conditions and the following disclaimer.
16
+
17
+ 2. Redistributions in binary form must reproduce the above copyright
18
+ notice, this list of conditions and the following disclaimer in the
19
+ documentation and/or other materials provided with the distribution.
20
+
21
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
22
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
23
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24
+ COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
28
+ OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+
32
+
33
+ == MiniTest Reporter
34
+
35
+ Copyright:: (c) 2011 Alexander Kern
36
+ License:: MIT
37
+ Website:: https://github.com/CapnKernul/minitest-reporters
38
+
39
+ Copyright (c) 2011 Alexander Kern
40
+
41
+ Permission is hereby granted, free of charge, to any person obtaining
42
+ a copy of this software and associated documentation files (the
43
+ "Software"), to deal in the Software without restriction, including
44
+ without limitation the rights to use, copy, modify, merge, publish,
45
+ distribute, sublicense, and/or sell copies of the Software, and to
46
+ permit persons to whom the Software is furnished to do so, subject to
47
+ the following conditions:
48
+
49
+ The above copyright notice and this permission notice shall be
50
+ included in all copies or substantial portions of the Software.
51
+
52
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
53
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
54
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
55
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
56
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
57
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
58
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
59
+
data/HISTORY.rdoc ADDED
@@ -0,0 +1,10 @@
1
+ = RELEASE HISTORY
2
+
3
+ == 0.1.0 / 2011-10-06
4
+
5
+ This is the first release of MiniTap, a TAP-Y/J reporter
6
+ for the MiniTest test framework.
7
+
8
+ Changes:
9
+
10
+ * First Release Day!
data/README.rdoc ADDED
@@ -0,0 +1,46 @@
1
+ = MiniTap
2
+
3
+ {Website}[http://rubyworks.github.com/minitap]
4
+ {Development}[http://github.com/rubyworks/minitap]
5
+
6
+
7
+ == Description
8
+
9
+ The MiniTap project provides a TAP-Y and TAP-J output reporters for
10
+ the MiniTest test framework --the test framework that comes standard
11
+ with Ruby 1.9+.
12
+
13
+ See {TAPOUT}[http://rubyworks.github.com/tapout] for more information about
14
+ TAP-Y/J formats.
15
+
16
+
17
+ == Usage
18
+
19
+ Simply require `minitest/tapy` or `minitest/tapj' when running your tests.
20
+ For example if you use `ruby` on the command line:
21
+
22
+ ruby -r'minitest/tapy' test_some_test.rb
23
+
24
+ Now to do something intersing with the outout. Make sure `tapout` is installed:
25
+
26
+ $ gem install tapout
27
+
28
+ Then pipe the output to the `tapout` command.
29
+
30
+ $ ruby -r'minitest/tapy' test/some_test.rb | tapout progressbar
31
+
32
+ Adjust your Rake task or other means of running tests to suite.
33
+
34
+
35
+ == Copying
36
+
37
+ Copyright (c) 2011 Thomas Sawyer
38
+
39
+ Made available under the terms of the BSD-2-Clause license.
40
+
41
+ Portions of this program were drawn from Alexander Kern's
42
+ MiniTest Reporter (c) 2011 Alexander Kern. Thanks Alexander
43
+ for making my endeavor a little bit easier.
44
+
45
+ See COPYING.rdoc for copyright and licensing details.
46
+
data/lib/minitap.rb ADDED
@@ -0,0 +1,534 @@
1
+ # MiniTest adaptor for tapout.
2
+
3
+ require 'minitest/unit'
4
+ require 'stringio'
5
+
6
+ # Becuase of some wierdness in MiniTest
7
+ #debug, $DEBUG = $DEBUG, false
8
+ #require 'minitest/unit'
9
+ #$DEBUG = debug
10
+
11
+ module MiniTest
12
+
13
+ # Base class for TapY and TapJ runners.
14
+ #
15
+ # This is a heavily refactored version of the built-in MiniTest runner. It's
16
+ # about the same speed, from what I can tell, but is significantly easier to
17
+ # extend.
18
+ #
19
+ # Based upon Ryan Davis of Seattle.rb's MiniTest (MIT License).
20
+ #
21
+ # @see https://github.com/seattlerb/minitest MiniTest
22
+ #
23
+ class MiniTap < ::MiniTest::Unit
24
+
25
+ # TAP-Y/J Revision
26
+ REVISION = 2
27
+
28
+ attr_accessor :suite_start_time, :test_start_time, :reporters
29
+
30
+ def initialize
31
+ self.report = {}
32
+ self.errors = 0
33
+ self.failures = 0
34
+ self.skips = 0
35
+ self.test_count = 0
36
+ self.assertion_count = 0
37
+ self.verbose = false
38
+ self.reporters = []
39
+
40
+ @_source_cache = {}
41
+ end
42
+
43
+ # Top level driver, controls all output and filtering.
44
+ def _run args = []
45
+ self.options = process_args(args)
46
+
47
+ self.class.plugins.each do |plugin|
48
+ send plugin
49
+ break unless report.empty?
50
+ end
51
+
52
+ return failures + errors if @test_count > 0 # or return nil...
53
+ rescue Interrupt
54
+ abort 'Interrupted'
55
+ end
56
+
57
+ #
58
+ def _run_anything(type)
59
+ self.start_time = Time.now
60
+
61
+ suites = suites_of_type(type)
62
+ tests = suites.inject({}) do |acc, suite|
63
+ acc[suite] = filtered_tests(suite, type)
64
+ acc
65
+ end
66
+
67
+ self.test_count = tests.inject(0) { |acc, suite| acc + suite[1].length }
68
+
69
+ if test_count > 0
70
+ trigger(:before_suites, suites, type)
71
+
72
+ fix_sync do
73
+ suites.each { |suite| _run_suite(suite, tests[suite]) }
74
+ end
75
+
76
+ trigger(:after_suites, suites, type)
77
+ end
78
+ end
79
+
80
+ def _run_suite(suite, tests)
81
+ unless tests.empty?
82
+ begin
83
+ self.suite_start_time = Time.now
84
+
85
+ trigger(:before_suite, suite)
86
+ suite.startup if suite.respond_to?(:startup)
87
+
88
+ tests.each { |test| _run_test(suite, test) }
89
+ ensure
90
+ suite.shutdown if suite.respond_to?(:shutdown)
91
+ trigger(:after_suite, suite)
92
+ end
93
+ end
94
+ end
95
+
96
+ #
97
+ def _run_test(suite, test)
98
+ self.test_start_time = Time.now
99
+
100
+ trigger(:before_test, suite, test)
101
+
102
+ test_runner = TestRunner.new(suite, test)
103
+ test_runner.run
104
+ add_test_result(suite, test, test_runner)
105
+
106
+ trigger(test_runner.result, suite, test, test_runner)
107
+ end
108
+
109
+ #
110
+ def trigger(callback, *args)
111
+ send("tapout_#{callback}", *args)
112
+ end
113
+
114
+ private
115
+
116
+ #
117
+ def filtered_tests(suite, type)
118
+ filter = options[:filter] || '/./'
119
+ filter = Regexp.new($1) if filter =~ /\/(.*)\//
120
+ suite.send("#{type}_methods").grep(filter)
121
+ end
122
+
123
+ #
124
+ def suites_of_type(type)
125
+ TestCase.send("#{type}_suites")
126
+ end
127
+
128
+ #
129
+ def add_test_result(suite, test, test_runner)
130
+ self.report[suite] ||= {}
131
+ self.report[suite][test.to_sym] = test_runner
132
+
133
+ self.assertion_count += test_runner.assertions
134
+
135
+ case test_runner.result
136
+ when :skip then self.skips += 1
137
+ when :failure then self.failures += 1
138
+ when :error then self.errors += 1
139
+ end
140
+ end
141
+
142
+ #
143
+ def fix_sync
144
+ sync = output.respond_to?(:'sync=') # stupid emacs
145
+ old_sync, output.sync = output.sync, true if sync
146
+ yield
147
+ output.sync = old_sync if sync
148
+ end
149
+
150
+ #
151
+ def tapout_before_suites(suites, type)
152
+ doc = {
153
+ 'type' => 'suite',
154
+ 'start' => self.start_time.strftime('%Y-%m-%d %H:%M:%S'),
155
+ 'count' => self.test_count,
156
+ 'seed' => self.options[:seed],
157
+ 'rev' => REVISION
158
+ }
159
+ return doc
160
+ end
161
+
162
+ #
163
+ def tapout_after_suites(suites, type)
164
+ doc = {
165
+ 'type' => 'tally',
166
+ 'time' => Time.now - self.test_start_time,
167
+ 'counts' => {
168
+ 'total' => self.test_count,
169
+ 'pass' => self.test_count - self.failures - self.errors - self.skips,
170
+ 'fail' => self.failures,
171
+ 'error' => self.errors,
172
+ 'omit' => self.skips,
173
+ 'todo' => 0 # TODO: does minitest support pending tests?
174
+ }
175
+ }
176
+ return doc
177
+ end
178
+
179
+ #
180
+ def tapout_before_suite(suite)
181
+ doc = {
182
+ 'type' => 'case',
183
+ 'subtype' => '',
184
+ 'label' => "#{suite}",
185
+ 'level' => 0
186
+ }
187
+ return doc
188
+ end
189
+
190
+ #
191
+ def tapout_after_suite(suite)
192
+ end
193
+
194
+ #
195
+ def tapout_before_test(suite, test)
196
+ end
197
+
198
+ #
199
+ def tapout_pass(suite, test, test_runner)
200
+ doc = {
201
+ 'type' => 'test',
202
+ 'subtype' => '',
203
+ 'status' => 'pass',
204
+ #'setup': foo instance
205
+ 'label' => "#{test}",
206
+ #'expected' => 2
207
+ #'returned' => 2
208
+ #'file' => 'test/test_foo.rb'
209
+ #'line': 45
210
+ #'source': ok 1, 2
211
+ #'snippet':
212
+ # - 44: ok 0,0
213
+ # - 45: ok 1,2
214
+ # - 46: ok 2,4
215
+ #'coverage':
216
+ # file: lib/foo.rb
217
+ # line: 11..13
218
+ # code: Foo#*
219
+ 'time' => Time.now - self.suite_start_time
220
+ }
221
+ return doc
222
+ end
223
+
224
+ #
225
+ def tapout_skip(suite, test, test_runner)
226
+ e = test_runner.exeception
227
+ e_file, e_line = location(test_runner.exception)
228
+
229
+ doc = {
230
+ 'type' => 'test',
231
+ 'subtype' => '',
232
+ 'status' => 'skip',
233
+ 'label' => "#{test}",
234
+ #'setup' => "foo instance",
235
+ #'expected' => 2,
236
+ #'returned' => 1,
237
+ #'file' => test/test_foo.rb
238
+ #'line' => 45
239
+ #'source' => ok 1, 2
240
+ #'snippet' =>
241
+ # - 44: ok 0,0
242
+ # - 45: ok 1,2
243
+ # - 46: ok 2,4
244
+ #'coverage' =>
245
+ # 'file' => lib/foo.rb
246
+ # 'line' => 11..13
247
+ # 'code' => Foo#*
248
+ 'exception' => {
249
+ 'message' => clean_message(e.message),
250
+ 'file' => e_file,
251
+ 'line' => e_line,
252
+ #'source' => '',
253
+ 'snippet' => code_snippet(e_file, e_line),
254
+ 'backtrace' => filter_backtrace(e.backtrace)
255
+ },
256
+ 'time' => Time.now - self.suite_start_time
257
+ }
258
+ return doc
259
+ end
260
+
261
+ #
262
+ def tapout_failure(suite, test, test_runner)
263
+ e = test_runner.exception
264
+ e_file, e_line = location(test_runner.exception)
265
+
266
+ doc = {
267
+ 'type' => 'test',
268
+ 'subtype' => '',
269
+ 'status' => 'fail',
270
+ 'label' => "#{test}",
271
+ #'setup' => "foo instance",
272
+ #'expected' => 2,
273
+ #'returned' => 1,
274
+ #'file' => test/test_foo.rb
275
+ #'line' => 45
276
+ #'source' => ok 1, 2
277
+ #'snippet' =>
278
+ # - 44: ok 0,0
279
+ # - 45: ok 1,2
280
+ # - 46: ok 2,4
281
+ #'coverage' =>
282
+ # 'file' => lib/foo.rb
283
+ # 'line' => 11..13
284
+ # 'code' => Foo#*
285
+ 'exception' => {
286
+ 'message' => clean_message(e.message),
287
+ 'file' => e_file,
288
+ 'line' => e_line,
289
+ #'source' => '',
290
+ 'snippet' => code_snippet(e_file, e_line),
291
+ 'backtrace' => filter_backtrace(e.backtrace)
292
+ },
293
+ 'time' => Time.now - self.suite_start_time
294
+ }
295
+ return doc
296
+ end
297
+
298
+ #
299
+ def tapout_error(suite, test, test_runner)
300
+ e = test_runner.exception
301
+ e_file, e_line = location(test_runner.exception)
302
+
303
+ doc = {
304
+ 'type' => 'test',
305
+ 'subtype' => '',
306
+ 'status' => 'error',
307
+ 'label' => "#{test}",
308
+ #'setup' => "foo instance",
309
+ #'expected' => 2,
310
+ #'returned' => 1,
311
+ #'file' => test/test_foo.rb
312
+ #'line' => 45
313
+ #'source' => ok 1, 2
314
+ #'snippet' =>
315
+ # - 44: ok 0,0
316
+ # - 45: ok 1,2
317
+ # - 46: ok 2,4
318
+ #'coverage' =>
319
+ # 'file' => lib/foo.rb
320
+ # 'line' => 11..13
321
+ # 'code' => Foo#*
322
+ 'exception' => {
323
+ 'message' => clean_message("#{e.class}: #{e.message}"),
324
+ 'file' => e_file,
325
+ 'line' => e_line,
326
+ #'source' => '',
327
+ 'snippet' => code_snippet(e_file, e_line),
328
+ 'backtrace' => filter_backtrace(e.backtrace)
329
+ },
330
+ 'time' => Time.now - self.suite_start_time
331
+ }
332
+ return doc
333
+ end
334
+
335
+ #
336
+ INTERNALS = /(lib|bin)#{Regexp.escape(File::SEPARATOR)}tapout/
337
+
338
+ #
339
+ def filter_backtrace(bt)
340
+ bt = clean_backtrace(bt)
341
+ bt = MiniTest::filter_backtrace(bt)
342
+ bt
343
+ end
344
+
345
+ # Clean the backtrace of any reference to ko/ paths and code.
346
+ def clean_backtrace(backtrace)
347
+ trace = backtrace.reject{ |bt| bt =~ INTERNALS }
348
+ trace = trace.map do |bt|
349
+ if i = bt.index(':in')
350
+ bt[0...i]
351
+ else
352
+ bt
353
+ end
354
+ end
355
+ trace = backtrace if trace.empty?
356
+ trace = trace.map{ |bt| bt.sub(Dir.pwd+File::SEPARATOR,'') }
357
+ trace
358
+ end
359
+
360
+ # Returns a String of source code.
361
+ def code_snippet(file, line)
362
+ s = []
363
+
364
+ #case snippet
365
+ #when String
366
+ # lines = snippet.lines.to_a
367
+ # index = line - ((lines.size - 1) / 2)
368
+ # lines.each do |line|
369
+ # s << [index, line]
370
+ # index += 1
371
+ # end
372
+ #when Array
373
+ # snippet.each do |h|
374
+ # s << [h.key, h.value]
375
+ # end
376
+ #else
377
+ ##backtrace = exception.backtrace.reject{ |bt| bt =~ INTERNALS }
378
+ ##backtrace.first =~ /(.+?):(\d+(?=:|\z))/ or return ""
379
+ #caller =~ /(.+?):(\d+(?=:|\z))/ or return ""
380
+ #source_file, source_line = $1, $2.to_i
381
+
382
+ if File.file?(file)
383
+ source = source(file)
384
+ radius = 2 # TODO: make customizable (number of surrounding lines to show)
385
+ region = [line - radius, 1].max ..
386
+ [line + radius, source.length].min
387
+
388
+ s = region.map do |n|
389
+ {n => source[n-1].chomp}
390
+ end
391
+ end
392
+ #end
393
+ return s
394
+ end
395
+
396
+ # Cache source file text. This is only used if the TAP-Y stream
397
+ # doesn not provide a snippet and the test file is locatable.
398
+ def source(file)
399
+ @_source_cache[file] ||= (
400
+ File.readlines(file)
401
+ )
402
+ end
403
+
404
+ # Parse source location from caller, caller[0] or an Exception object.
405
+ def parse_source_location(caller)
406
+ case caller
407
+ when Exception
408
+ trace = caller.backtrace.reject{ |bt| bt =~ INTERNALS }
409
+ caller = trace.first
410
+ when Array
411
+ caller = caller.first
412
+ end
413
+ caller =~ /(.+?):(\d+(?=:|\z))/ or return ""
414
+ source_file, source_line = $1, $2.to_i
415
+ returnf source_file, source_line
416
+ end
417
+
418
+ # Get location of exception.
419
+ def location e # :nodoc:
420
+ last_before_assertion = ""
421
+ e.backtrace.reverse_each do |s|
422
+ break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/
423
+ last_before_assertion = s
424
+ end
425
+ file, line = last_before_assertion.sub(/:in .*$/, '').split(':')
426
+ line = line.to_i if line
427
+ return file, line
428
+ end
429
+
430
+ #
431
+ def clean_message(message)
432
+ message.strip #.gsub(/\s*\n\s*/, "\n")
433
+ end
434
+
435
+ end
436
+
437
+ # Runner for individual MiniTest tests.
438
+ #
439
+ # You *should not* create instances of this class directly. Instances of
440
+ # {SuiteRunner} will create these and send them to the reporters.
441
+ #
442
+ # Based upon Ryan Davis of Seattle.rb's MiniTest (MIT License).
443
+ #
444
+ # @see https://github.com/seattlerb/minitest MiniTest
445
+ class TestRunner
446
+ attr_reader :suite, :test, :assertions, :result, :exception
447
+
448
+ def initialize(suite, test)
449
+ @suite = suite
450
+ @test = test
451
+ @assertions = 0
452
+ end
453
+
454
+ def run
455
+ suite_instance = suite.new(test)
456
+ @result, @exception = fix_result(suite_instance.run(self))
457
+ @assertions = suite_instance._assertions
458
+ end
459
+
460
+ def puke(suite, test, exception)
461
+ case exception
462
+ when MiniTest::Skip then [:skip, exception]
463
+ when MiniTest::Assertion then [:failure, exception]
464
+ else [:error, exception]
465
+ end
466
+ end
467
+
468
+ private
469
+
470
+ def fix_result(result)
471
+ result == '.' ? [:pass, nil] : result
472
+ end
473
+ end
474
+
475
+ #
476
+ class TapY < MiniTap
477
+ def initialize
478
+ require 'yaml'
479
+ super
480
+ end
481
+ def tapout_before_suites(suites, type)
482
+ puts super(suites, type).to_yaml
483
+ end
484
+ def tapout_before_suite(suite)
485
+ puts super(suite).to_yaml
486
+ end
487
+ def tapout_pass(suite, test, test_runner)
488
+ puts super(suite, test, test_runner).to_yaml
489
+ end
490
+ def tapout_skip(suite, test, test_runner)
491
+ puts super(suite, test, test_runner).to_yaml
492
+ end
493
+ def tapout_failure(suite, test, test_runner)
494
+ puts super(suite, test, test_runner).to_yaml
495
+ end
496
+ def tapout_error(suite, test, test_runner)
497
+ puts super(suite, test, test_runner).to_yaml
498
+ end
499
+ def tapout_after_suites(suites, type)
500
+ puts super(suites, type).to_yaml
501
+ puts "..."
502
+ end
503
+ end
504
+
505
+ #
506
+ class TapJ < MiniTap
507
+ def initialize
508
+ require 'json'
509
+ super
510
+ end
511
+ def tapout_before_suites(suites, type)
512
+ puts super(suites, type).to_json
513
+ end
514
+ def tapout_before_suite(suite)
515
+ puts super(suite).to_json
516
+ end
517
+ def tapout_pass(suite, test, test_runner)
518
+ puts super(suite, test, test_runner).to_json
519
+ end
520
+ def tapout_skip(suite, test, test_runner)
521
+ puts super(suite, test, test_runner).to_json
522
+ end
523
+ def tapout_failure(suite, test, test_runner)
524
+ puts super(suite, test, test_runner).to_json
525
+ end
526
+ def tapout_error(suite, test, test_runner)
527
+ puts super(suite, test, test_runner).to_json
528
+ end
529
+ def tapout_after_suites(suites, type)
530
+ puts super(suites, type).to_json
531
+ end
532
+ end
533
+
534
+ end
@@ -0,0 +1,4 @@
1
+ require 'minitap'
2
+
3
+ MiniTest::Unit.runner = MiniTest::TapJ.new
4
+
@@ -0,0 +1,3 @@
1
+ require 'minitap'
2
+
3
+ MiniTest::Unit.runner = MiniTest::TapY.new
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: minitap
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Thomas Sawyer
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: tapout
16
+ requirement: &12167740 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *12167740
25
+ - !ruby/object:Gem::Dependency
26
+ name: detroit
27
+ requirement: &12167140 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *12167140
36
+ - !ruby/object:Gem::Dependency
37
+ name: reap
38
+ requirement: &12166280 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *12166280
47
+ description: MiniTap provides a custom MiniTest reporter that outs TAP-Y or TAP-J
48
+ formatted output.
49
+ email:
50
+ - transfire@gmail.com
51
+ executables: []
52
+ extensions: []
53
+ extra_rdoc_files:
54
+ - HISTORY.rdoc
55
+ - README.rdoc
56
+ - COPYING.rdoc
57
+ files:
58
+ - .ruby
59
+ - lib/minitap.rb
60
+ - lib/minitest/tapj.rb
61
+ - lib/minitest/tapy.rb
62
+ - HISTORY.rdoc
63
+ - README.rdoc
64
+ - COPYING.rdoc
65
+ homepage: http://rubyworks.github.com/minitap
66
+ licenses: []
67
+ post_install_message:
68
+ rdoc_options: []
69
+ require_paths:
70
+ - lib
71
+ required_ruby_version: !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ none: false
79
+ requirements:
80
+ - - ! '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ requirements: []
84
+ rubyforge_project:
85
+ rubygems_version: 1.8.5
86
+ signing_key:
87
+ specification_version: 3
88
+ summary: MiniTest TAP-Y/J reporter
89
+ test_files: []