minitap 0.4.1 → 0.5.0
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.
- checksums.yaml +7 -0
- data/.index +11 -10
- data/{QED.md → DEMO.md} +0 -0
- data/HISTORY.md +15 -1
- data/README.md +43 -5
- data/lib/minitap/minitest5.rb +881 -0
- data/lib/minitest/minitap_plugin.rb +28 -0
- metadata +30 -41
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8fd52937451ba7b8dd7e6aa13c046edd8f1e155d
|
4
|
+
data.tar.gz: a6ade0eef28c83ceed201e31bca1ce26a70f6f53
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6711b064107559933f4feed63a07a7502f3ccd7d25c6442d6de1a5d34b606b4f598cd74af0aed3da94446f607818d5d626a7153de5644d4e5f57719b0122d611
|
7
|
+
data.tar.gz: a14469a6138cc9c29454f64710f5172aebc32a9d6d8ab91ee670d5481d2c2fad1aa2854e19467271155c2c373bafe03ea8e58ece9b7c693624dd073503acb96d
|
data/.index
CHANGED
@@ -8,13 +8,10 @@ authors:
|
|
8
8
|
email: transfire@gmail.com
|
9
9
|
organizations: []
|
10
10
|
requirements:
|
11
|
-
- version:
|
11
|
+
- version: 0.3.0+
|
12
12
|
name: tapout
|
13
|
-
-
|
14
|
-
|
15
|
-
- build
|
16
|
-
development: true
|
17
|
-
name: ergo
|
13
|
+
- version: 5.0~
|
14
|
+
name: minitest
|
18
15
|
- groups:
|
19
16
|
- test
|
20
17
|
development: true
|
@@ -23,6 +20,10 @@ requirements:
|
|
23
20
|
- test
|
24
21
|
development: true
|
25
22
|
name: ae
|
23
|
+
- groups:
|
24
|
+
- build
|
25
|
+
development: true
|
26
|
+
name: ergo
|
26
27
|
conflicts: []
|
27
28
|
alternatives: []
|
28
29
|
resources:
|
@@ -54,10 +55,10 @@ customs: []
|
|
54
55
|
paths:
|
55
56
|
lib:
|
56
57
|
- lib
|
57
|
-
summary: TAP-Y/J reporters for MiniTest
|
58
|
-
title: MiniTap
|
59
|
-
version: 0.4.1
|
60
58
|
name: minitap
|
59
|
+
title: MiniTap
|
60
|
+
summary: TAP-Y/J reporters for MiniTest
|
61
61
|
description: MiniTap provides a MiniTest TAP-Y/J report format suitable for use with
|
62
62
|
TAPOUT.
|
63
|
-
|
63
|
+
version: 0.5.0
|
64
|
+
date: '2013-11-15'
|
data/{QED.md → DEMO.md}
RENAMED
File without changes
|
data/HISTORY.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
# RELEASE HISTORY
|
2
2
|
|
3
|
+
## 0.5.0 | 2013-11-15
|
4
|
+
|
5
|
+
The release adds support for MiniTest 5. Minitest completely
|
6
|
+
changes the way custom reporters are handled so this release
|
7
|
+
includes extensive new code. Note that this version is also
|
8
|
+
no longer intended for use with Minitest 4 or older. If you
|
9
|
+
are using Minitest 4, please use Minitap 4.x as well.
|
10
|
+
|
11
|
+
Changes:
|
12
|
+
|
13
|
+
* Add support for Minitest 5.
|
14
|
+
* Deprecate support for Minitest 4.
|
15
|
+
|
16
|
+
|
3
17
|
## 0.4.1 | 2013-03-18
|
4
18
|
|
5
19
|
Minor release improves upon backtrace filtering and makes
|
@@ -9,7 +23,7 @@ are used even though minitap has been requried.
|
|
9
23
|
Changes:
|
10
24
|
|
11
25
|
* Use $RUBY_IGNORE_CALLERS for backtrace filtering.
|
12
|
-
*
|
26
|
+
* Ensure hook methods exist before using them.
|
13
27
|
|
14
28
|
|
15
29
|
## 0.4.0 | 2013-03-17
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# Minitap
|
2
2
|
|
3
3
|
[Website](http://rubyworks.github.com/minitap) |
|
4
4
|
[Documentation](http://rubydoc.info/gems/minitap/frames) |
|
@@ -22,10 +22,48 @@ TAP-Y/J formats.
|
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
### Minitest 5+
|
26
|
+
|
27
|
+
Minitest 5 has a new report system and plug-in API. Minitap takes advantage
|
28
|
+
of this new API to allow the TAP-Y or TAP-J formats to be selected via command-line
|
29
|
+
options instead of requiring that the format be set in the test helper scripts.
|
30
|
+
|
31
|
+
To use simply add `--tapy` or `--tapj` after an isolated `-` separator on the
|
32
|
+
ruby test command invocation, e.g.
|
33
|
+
|
34
|
+
$ ruby -Ilib test/runner.rb - --tapy
|
35
|
+
|
36
|
+
In your test helper scripts be sure you have the standard Minitest line:
|
37
|
+
|
38
|
+
require 'minitest/autorun'
|
39
|
+
|
40
|
+
And remove any old `MiniTest::Unit.runner=` assignments if you are migrating
|
41
|
+
from v4.
|
42
|
+
|
43
|
+
Now to do something interesting with the TAP-Y/J output, you will probably want
|
44
|
+
to install `tapout`:
|
45
|
+
|
46
|
+
$ gem install tapout
|
47
|
+
|
48
|
+
Then pipe the output to the `tapout` command, e.g.
|
49
|
+
|
50
|
+
$ ruby test/some_test.rb - --tapy | tapout progressbar
|
51
|
+
|
52
|
+
And that's all there is too it.
|
53
|
+
|
54
|
+
|
55
|
+
### MiniTest 4
|
56
|
+
|
57
|
+
If you are still using MiniTest 4.x you will need to use Minitap version 4.x
|
58
|
+
as well. In your dependencies be sure to specify this version. For example in
|
59
|
+
your Gemfile:
|
60
|
+
|
61
|
+
gem "minitap", "~> 4.0"
|
62
|
+
|
63
|
+
For Minitest 4 and and older, custom report formats are set by assigning
|
64
|
+
the `MiniTest::Unit.runner` to an instance of a custom runner class.
|
65
|
+
In our case we want to set it to an instance of `MiniTest::TapY` or `MiniTest::TapJ`.
|
66
|
+
So in your project's test helper script add, e.g.
|
29
67
|
|
30
68
|
require 'minitap'
|
31
69
|
MiniTest::Unit.runner = MiniTest::TapY.new
|
@@ -0,0 +1,881 @@
|
|
1
|
+
# MiniTest adaptor for tapout.
|
2
|
+
|
3
|
+
# Have to make sure the latest version of minitest is used.
|
4
|
+
begin; gem 'minitest'; rescue; end
|
5
|
+
|
6
|
+
#require 'minitest/unit'
|
7
|
+
require 'minitap/ignore_callers'
|
8
|
+
require 'stringio'
|
9
|
+
|
10
|
+
# Becuase of some wierdness in MiniTest
|
11
|
+
#debug, $DEBUG = $DEBUG, false
|
12
|
+
#require 'minitest/unit'
|
13
|
+
#$DEBUG = debug
|
14
|
+
|
15
|
+
module Minitest
|
16
|
+
|
17
|
+
##
|
18
|
+
# Base class for TapY and TapJ runners.
|
19
|
+
#
|
20
|
+
class Minitap < StatisticsReporter #Reporter
|
21
|
+
|
22
|
+
# TAP-Y/J Revision
|
23
|
+
REVISION = 4
|
24
|
+
|
25
|
+
# Backtrace patterns to be omitted.
|
26
|
+
IGNORE_CALLERS = $RUBY_IGNORE_CALLERS
|
27
|
+
|
28
|
+
# Test results.
|
29
|
+
#attr_reader :test_results
|
30
|
+
|
31
|
+
attr_reader :test_cases
|
32
|
+
attr_reader :test_count
|
33
|
+
|
34
|
+
attr_accessor :suite_start_time
|
35
|
+
attr_accessor :case_start_time
|
36
|
+
attr_accessor :test_start_time
|
37
|
+
|
38
|
+
# Initialize new Minitap Minitest reporter.
|
39
|
+
def initialize(io = $stdout, options = {})
|
40
|
+
super(io, options)
|
41
|
+
|
42
|
+
#@_stdout = StringIO.new
|
43
|
+
#@_stderr = StringIO.new
|
44
|
+
|
45
|
+
#@test_results = {}
|
46
|
+
#self.assertion_count = 0
|
47
|
+
|
48
|
+
@_source_cache = {}
|
49
|
+
end
|
50
|
+
|
51
|
+
#
|
52
|
+
# Minitest's initial hook ran just before testing begins.
|
53
|
+
#
|
54
|
+
def start
|
55
|
+
super
|
56
|
+
|
57
|
+
@test_cases = Runnable.runnables
|
58
|
+
|
59
|
+
capture_io
|
60
|
+
|
61
|
+
#@_stdout, @_stderr = capture_io do
|
62
|
+
# super_result = super(suite, type)
|
63
|
+
#end
|
64
|
+
|
65
|
+
before_suite(@test_cases)
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# Process a test result.
|
70
|
+
#
|
71
|
+
def record(minitest_result)
|
72
|
+
super(minitest_result)
|
73
|
+
|
74
|
+
result = TestResult.new(minitest_result)
|
75
|
+
|
76
|
+
#if exception #&& ENV['minitap_debug']
|
77
|
+
# STDERR.puts exception
|
78
|
+
# STDERR.puts exception.backtrace.join("\n")
|
79
|
+
#end
|
80
|
+
|
81
|
+
#@test_results[suite] ||= {}
|
82
|
+
#@test_results[suite][test.to_sym] = record
|
83
|
+
|
84
|
+
case_change = false
|
85
|
+
|
86
|
+
if @previous_case != result.test_case
|
87
|
+
case_change = true
|
88
|
+
before_case(result.test_case)
|
89
|
+
end
|
90
|
+
|
91
|
+
#before_test(result)
|
92
|
+
case result.type
|
93
|
+
when :skip
|
94
|
+
test_skip(result)
|
95
|
+
when :pass
|
96
|
+
test_pass(result)
|
97
|
+
when :fail
|
98
|
+
test_fail(result)
|
99
|
+
when :err
|
100
|
+
test_err(result)
|
101
|
+
end
|
102
|
+
after_test(result)
|
103
|
+
|
104
|
+
if case_change
|
105
|
+
after_case(result.test_case)
|
106
|
+
end
|
107
|
+
|
108
|
+
@previous_case = result.test_case
|
109
|
+
end
|
110
|
+
|
111
|
+
#
|
112
|
+
# Minitest's finalization hook.
|
113
|
+
#
|
114
|
+
def report
|
115
|
+
super
|
116
|
+
|
117
|
+
uncapture_io
|
118
|
+
|
119
|
+
after_suite()
|
120
|
+
end
|
121
|
+
|
122
|
+
#
|
123
|
+
# Intermediary Callbacks
|
124
|
+
#
|
125
|
+
|
126
|
+
#
|
127
|
+
def before_suite(test_cases)
|
128
|
+
@suite_start_time = Time.now
|
129
|
+
count_tests!(test_cases)
|
130
|
+
tapout_before_suite()
|
131
|
+
end
|
132
|
+
|
133
|
+
def after_suite() #(test_cases)
|
134
|
+
tapout_after_suite()
|
135
|
+
end
|
136
|
+
|
137
|
+
def before_case(test_case)
|
138
|
+
@case_start_time = Time.now
|
139
|
+
tapout_before_case(test_case)
|
140
|
+
end
|
141
|
+
|
142
|
+
def after_case(test_case)
|
143
|
+
tapout_after_case(test_case)
|
144
|
+
end
|
145
|
+
|
146
|
+
def before_test(result)
|
147
|
+
@test_start_time = Time.now
|
148
|
+
tapout_before_test(result)
|
149
|
+
end
|
150
|
+
|
151
|
+
def after_test(result)
|
152
|
+
tapout_after_test(result)
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_skip(result)
|
156
|
+
tapout_test_skip(result)
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_pass(result)
|
160
|
+
tapout_test_pass(result)
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_fail(result)
|
164
|
+
tapout_test_failure(result)
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_err(result)
|
168
|
+
tapout_test_error(result)
|
169
|
+
end
|
170
|
+
|
171
|
+
=begin
|
172
|
+
def _run_suites(suites, type)
|
173
|
+
#output.puts "# Run options: #{@help}"
|
174
|
+
|
175
|
+
@suites_start_time = Time.now
|
176
|
+
count_tests!(suites, type)
|
177
|
+
trigger_callback(:before_suites, suites, type)
|
178
|
+
super(suites, type)
|
179
|
+
ensure
|
180
|
+
trigger_callback(:after_suites, suites, type)
|
181
|
+
end
|
182
|
+
|
183
|
+
def _run_suite(suite, type)
|
184
|
+
# The only reason this is here is b/c MiniTest wil try to run
|
185
|
+
# base classes like `MiniTest::Spec`. So to prevent that,
|
186
|
+
# if there are no tests to run, we don't bother to process
|
187
|
+
# the "suite" at all.
|
188
|
+
@_suite_tests = suite.send("#{type}_methods")
|
189
|
+
return [0,0] if @_suite_tests.empty?
|
190
|
+
|
191
|
+
begin
|
192
|
+
@suite_start_time = Time.now
|
193
|
+
trigger_callback(:before_suite, suite)
|
194
|
+
|
195
|
+
super_result = nil
|
196
|
+
@_stdout, @_stderr = capture_io do
|
197
|
+
super_result = super(suite, type)
|
198
|
+
end
|
199
|
+
super_result
|
200
|
+
ensure
|
201
|
+
trigger_callback(:after_suite, suite)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def before_test(suite, test)
|
206
|
+
@test_start_time = Time.now
|
207
|
+
trigger_callback(:before_test, suite, test)
|
208
|
+
end
|
209
|
+
|
210
|
+
def after_test(suite, test)
|
211
|
+
#runners = @test_recorder[suite, test.to_sym]
|
212
|
+
#records = @test_results[suite][test.to_sym]
|
213
|
+
record = @test_results[suite][test.to_sym]
|
214
|
+
|
215
|
+
#records.each do |record|
|
216
|
+
# trigger_callback(record.result, suite, test.to_sym, record)
|
217
|
+
#end
|
218
|
+
|
219
|
+
trigger_callback(record.result, suite, test.to_sym, record)
|
220
|
+
|
221
|
+
#trigger_callback(:after_test, suite, test.to_sym)
|
222
|
+
end
|
223
|
+
=end
|
224
|
+
|
225
|
+
# Stub out the three IO methods used by the built-in reporter.
|
226
|
+
def p(*args)
|
227
|
+
args.each{ |a| io.print(a.inspect); puts }
|
228
|
+
end
|
229
|
+
|
230
|
+
def puts(*args)
|
231
|
+
io.puts(*args)
|
232
|
+
end
|
233
|
+
|
234
|
+
def print(*args)
|
235
|
+
io.print(*args)
|
236
|
+
end
|
237
|
+
|
238
|
+
#def status(io = output); end
|
239
|
+
|
240
|
+
private
|
241
|
+
|
242
|
+
#
|
243
|
+
def filtered_tests(test_case) #suite, type
|
244
|
+
filter = options[:filter] || '/./'
|
245
|
+
filter = Regexp.new($1) if filter =~ /\/(.*)\//
|
246
|
+
test_case.runnable_methods.grep(filter)
|
247
|
+
end
|
248
|
+
|
249
|
+
=begin
|
250
|
+
#
|
251
|
+
def add_test_result(suite, test, test_runner)
|
252
|
+
self.report[suite] ||= {}
|
253
|
+
self.report[suite][test.to_sym] = test_runner
|
254
|
+
|
255
|
+
self.assertion_count += test_runner.assertions
|
256
|
+
|
257
|
+
case test_runner.result
|
258
|
+
when :skip then self.skips += 1
|
259
|
+
when :failure then self.failures += 1
|
260
|
+
when :error then self.errors += 1
|
261
|
+
end
|
262
|
+
end
|
263
|
+
=end
|
264
|
+
|
265
|
+
def count_tests!(test_cases)
|
266
|
+
filter = options[:filter] || '/./'
|
267
|
+
filter = Regexp.new $1 if filter =~ /\/(.*)\//
|
268
|
+
|
269
|
+
@test_count = test_cases.inject(0) do |acc, test_case|
|
270
|
+
acc + test_case.runnable_methods.grep(filter).length
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
#
|
275
|
+
# Tapout Records
|
276
|
+
#
|
277
|
+
|
278
|
+
#
|
279
|
+
def tapout_before_suite()
|
280
|
+
doc = {
|
281
|
+
'type' => 'suite',
|
282
|
+
'start' => self.suite_start_time.strftime('%Y-%m-%d %H:%M:%S'),
|
283
|
+
'count' => self.test_count,
|
284
|
+
'seed' => self.options[:seed],
|
285
|
+
'rev' => REVISION
|
286
|
+
}
|
287
|
+
return doc
|
288
|
+
end
|
289
|
+
|
290
|
+
#
|
291
|
+
def tapout_after_suite()
|
292
|
+
doc = {
|
293
|
+
'type' => 'final',
|
294
|
+
'time' => Time.now - self.suite_start_time,
|
295
|
+
'counts' => {
|
296
|
+
'total' => self.test_count,
|
297
|
+
'pass' => self.test_count - self.failures - self.errors - self.skips,
|
298
|
+
'fail' => self.failures,
|
299
|
+
'error' => self.errors,
|
300
|
+
'omit' => self.skips,
|
301
|
+
'todo' => 0 # TODO: does minitest support pending tests?
|
302
|
+
}
|
303
|
+
}
|
304
|
+
return doc
|
305
|
+
end
|
306
|
+
|
307
|
+
#
|
308
|
+
def tapout_before_case(test_case)
|
309
|
+
doc = {
|
310
|
+
'type' => 'case',
|
311
|
+
'subtype' => '',
|
312
|
+
'label' => "#{test_case}",
|
313
|
+
'level' => 0
|
314
|
+
}
|
315
|
+
|
316
|
+
record_stdcom(doc)
|
317
|
+
|
318
|
+
return doc
|
319
|
+
end
|
320
|
+
|
321
|
+
#
|
322
|
+
def tapout_after_case(test_case)
|
323
|
+
end
|
324
|
+
|
325
|
+
#
|
326
|
+
def tapout_before_test(result)
|
327
|
+
end
|
328
|
+
|
329
|
+
#
|
330
|
+
def tapout_after_test(result)
|
331
|
+
end
|
332
|
+
|
333
|
+
# TAP record for pass.
|
334
|
+
#
|
335
|
+
# Returns [Hash].
|
336
|
+
def tapout_test_pass(result) #suite, test, test_runner
|
337
|
+
doc = {
|
338
|
+
'type' => 'test',
|
339
|
+
'subtype' => '',
|
340
|
+
'status' => 'pass',
|
341
|
+
#'setup': foo instance
|
342
|
+
'label' => "#{result.label}",
|
343
|
+
#'expected' => 2
|
344
|
+
#'returned' => 2
|
345
|
+
#'file' => 'test/test_foo.rb'
|
346
|
+
#'line': 45
|
347
|
+
#'source': ok 1, 2
|
348
|
+
#'snippet':
|
349
|
+
# - 44: ok 0,0
|
350
|
+
# - 45: ok 1,2
|
351
|
+
# - 46: ok 2,4
|
352
|
+
#'coverage':
|
353
|
+
# file: lib/foo.rb
|
354
|
+
# line: 11..13
|
355
|
+
# code: Foo#*
|
356
|
+
'time' => Time.now - self.suite_start_time
|
357
|
+
}
|
358
|
+
|
359
|
+
record_stdcom(doc)
|
360
|
+
|
361
|
+
#stdout, stderr = @_stdout, @_stderr
|
362
|
+
#doc['stdout'] = stdout unless stdout.empty?
|
363
|
+
#doc['stderr'] = stderr unless stderr.empty?
|
364
|
+
|
365
|
+
return doc
|
366
|
+
end
|
367
|
+
|
368
|
+
# TAP record for skip.
|
369
|
+
#
|
370
|
+
# Returns [Hash].
|
371
|
+
def tapout_test_skip(result) #suite, test, test_runner
|
372
|
+
e = result.exception
|
373
|
+
e_file, e_line = location(result.exception)
|
374
|
+
r_file = e_file.sub(Dir.pwd+'/', '')
|
375
|
+
|
376
|
+
doc = {
|
377
|
+
'type' => 'test',
|
378
|
+
'subtype' => '',
|
379
|
+
'status' => 'skip',
|
380
|
+
'label' => "#{result.label}",
|
381
|
+
#'setup' => "foo instance",
|
382
|
+
#'expected' => 2,
|
383
|
+
#'returned' => 1,
|
384
|
+
#'file' => test/test_foo.rb
|
385
|
+
#'line' => 45
|
386
|
+
#'source' => ok 1, 2
|
387
|
+
#'snippet' =>
|
388
|
+
# - 44: ok 0,0
|
389
|
+
# - 45: ok 1,2
|
390
|
+
# - 46: ok 2,4
|
391
|
+
#'coverage' =>
|
392
|
+
# 'file' => lib/foo.rb
|
393
|
+
# 'line' => 11..13
|
394
|
+
# 'code' => Foo#*
|
395
|
+
'exception' => {
|
396
|
+
'message' => clean_message(e.message),
|
397
|
+
'class' => e.class.name,
|
398
|
+
'file' => r_file,
|
399
|
+
'line' => e_line,
|
400
|
+
'source' => source(e_file)[e_line-1].strip,
|
401
|
+
'snippet' => code_snippet(e_file, e_line),
|
402
|
+
'backtrace' => filter_backtrace(e.backtrace)
|
403
|
+
},
|
404
|
+
'time' => Time.now - self.suite_start_time
|
405
|
+
}
|
406
|
+
return doc
|
407
|
+
end
|
408
|
+
|
409
|
+
# TAP record for failure.
|
410
|
+
#
|
411
|
+
# Returns [Hash].
|
412
|
+
def tapout_test_failure(result)
|
413
|
+
e = result.exception
|
414
|
+
e_file, e_line = location(result.exception)
|
415
|
+
r_file = e_file.sub(Dir.pwd+'/', '')
|
416
|
+
|
417
|
+
doc = {
|
418
|
+
'type' => 'test',
|
419
|
+
'subtype' => '',
|
420
|
+
'status' => 'fail',
|
421
|
+
'label' => "#{result.label}",
|
422
|
+
#'setup' => "foo instance",
|
423
|
+
#'expected' => 2,
|
424
|
+
#'returned' => 1,
|
425
|
+
#'file' => test/test_foo.rb
|
426
|
+
#'line' => 45
|
427
|
+
#'source' => ok 1, 2
|
428
|
+
#'snippet' =>
|
429
|
+
# - 44: ok 0,0
|
430
|
+
# - 45: ok 1,2
|
431
|
+
# - 46: ok 2,4
|
432
|
+
#'coverage' =>
|
433
|
+
# 'file' => lib/foo.rb
|
434
|
+
# 'line' => 11..13
|
435
|
+
# 'code' => Foo#*
|
436
|
+
'exception' => {
|
437
|
+
'message' => clean_message(e.message),
|
438
|
+
'class' => e.class.name,
|
439
|
+
'file' => r_file,
|
440
|
+
'line' => e_line,
|
441
|
+
'source' => source(e_file)[e_line-1].strip,
|
442
|
+
'snippet' => code_snippet(e_file, e_line),
|
443
|
+
'backtrace' => filter_backtrace(e.backtrace)
|
444
|
+
},
|
445
|
+
'time' => Time.now - self.suite_start_time # result.time
|
446
|
+
}
|
447
|
+
|
448
|
+
record_stdcom(doc)
|
449
|
+
|
450
|
+
#stdout, stderr = @_stdout, @_stderr
|
451
|
+
#doc['stdout'] = stdout unless stdout.empty?
|
452
|
+
#doc['stderr'] = stderr unless stderr.empty?
|
453
|
+
|
454
|
+
return doc
|
455
|
+
end
|
456
|
+
|
457
|
+
# TAP record for error.
|
458
|
+
#
|
459
|
+
# Returns [Hash].
|
460
|
+
def tapout_test_error(result)
|
461
|
+
e = result.exception
|
462
|
+
e_file, e_line = location(e)
|
463
|
+
r_file = e_file.sub(Dir.pwd+'/', '')
|
464
|
+
|
465
|
+
doc = {
|
466
|
+
'type' => 'test',
|
467
|
+
'subtype' => '',
|
468
|
+
'status' => 'error',
|
469
|
+
'label' => "#{result.label}",
|
470
|
+
#'setup' => "foo instance",
|
471
|
+
#'expected' => 2,
|
472
|
+
#'returned' => 1,
|
473
|
+
#'file' => test/test_foo.rb
|
474
|
+
#'line' => 45
|
475
|
+
#'source' => ok 1, 2
|
476
|
+
#'snippet' =>
|
477
|
+
# - 44: ok 0,0
|
478
|
+
# - 45: ok 1,2
|
479
|
+
# - 46: ok 2,4
|
480
|
+
#'coverage' =>
|
481
|
+
# 'file' => lib/foo.rb
|
482
|
+
# 'line' => 11..13
|
483
|
+
# 'code' => Foo#*
|
484
|
+
'exception' => {
|
485
|
+
'message' => clean_message(e.error.message),
|
486
|
+
'class' => e.error.class.name,
|
487
|
+
'file' => r_file,
|
488
|
+
'line' => e_line,
|
489
|
+
'source' => source(e_file)[e_line-1].strip,
|
490
|
+
'snippet' => code_snippet(e_file, e_line),
|
491
|
+
'backtrace' => filter_backtrace(e.backtrace)
|
492
|
+
},
|
493
|
+
'time' => Time.now - self.suite_start_time # result.time
|
494
|
+
}
|
495
|
+
|
496
|
+
record_stdcom(doc)
|
497
|
+
|
498
|
+
#stdout, stderr = @_stdout, @_stderr
|
499
|
+
#doc['stdout'] = stdout unless stdout.empty?
|
500
|
+
#doc['stderr'] = stderr unless stderr.empty?
|
501
|
+
|
502
|
+
return doc
|
503
|
+
end
|
504
|
+
|
505
|
+
# ---------------------------------------------------------------------
|
506
|
+
|
507
|
+
#
|
508
|
+
#
|
509
|
+
#
|
510
|
+
def record_stdcom(doc)
|
511
|
+
begin
|
512
|
+
doc['stdout'] = $stdout.string unless $stdout.length == 0 #empty?
|
513
|
+
doc['stderr'] = $stderr.string unless $stderr.length == 0 #empty?
|
514
|
+
$stdout.close; $stderr.close
|
515
|
+
$stdout, $stderr = StringIO.new, StringIO.new
|
516
|
+
#end
|
517
|
+
rescue => err
|
518
|
+
uncapture_io
|
519
|
+
raise err
|
520
|
+
end
|
521
|
+
end
|
522
|
+
|
523
|
+
#
|
524
|
+
#def filter_backtrace(backtrace)
|
525
|
+
# trace = backtrace
|
526
|
+
# trace = clean_backtrace(trace)
|
527
|
+
# trace = MiniTest::filter_backtrace(trace)
|
528
|
+
# trace
|
529
|
+
#end
|
530
|
+
|
531
|
+
# Clean the backtrace of any reference to test framework itself.
|
532
|
+
def filter_backtrace(backtrace)
|
533
|
+
## remove backtraces that match any pattern in IGNORE_CALLERS
|
534
|
+
trace = backtrace.reject{|b| IGNORE_CALLERS.any?{|i| i=~b}}
|
535
|
+
## remove `:in ...` portion of backtraces
|
536
|
+
trace = trace.map do |bt|
|
537
|
+
i = bt.index(':in')
|
538
|
+
i ? bt[0...i] : bt
|
539
|
+
end
|
540
|
+
## now apply MiniTest's own filter (note: doesn't work if done first, why?)
|
541
|
+
trace = Minitest::filter_backtrace(trace)
|
542
|
+
## if the backtrace is empty now then revert to the original
|
543
|
+
trace = backtrace if trace.empty?
|
544
|
+
## simplify paths to be relative to current workding diectory
|
545
|
+
trace = trace.map{ |bt| bt.sub(Dir.pwd+File::SEPARATOR,'') }
|
546
|
+
return trace
|
547
|
+
end
|
548
|
+
|
549
|
+
# Returns a String of source code.
|
550
|
+
def code_snippet(file, line)
|
551
|
+
s = []
|
552
|
+
if File.file?(file)
|
553
|
+
source = source(file)
|
554
|
+
radius = 2 # TODO: make customizable (number of surrounding lines to show)
|
555
|
+
region = [line - radius, 1].max ..
|
556
|
+
[line + radius, source.length].min
|
557
|
+
|
558
|
+
s = region.map do |n|
|
559
|
+
{n => source[n-1].chomp}
|
560
|
+
end
|
561
|
+
end
|
562
|
+
return s
|
563
|
+
end
|
564
|
+
|
565
|
+
# Cache source file text. This is only used if the TAP-Y stream
|
566
|
+
# doesn not provide a snippet and the test file is locatable.
|
567
|
+
def source(file)
|
568
|
+
@_source_cache[file] ||= (
|
569
|
+
File.readlines(file)
|
570
|
+
)
|
571
|
+
end
|
572
|
+
|
573
|
+
# Parse source location from caller, caller[0] or an Exception object.
|
574
|
+
def parse_source_location(caller)
|
575
|
+
case caller
|
576
|
+
when Exception
|
577
|
+
trace = caller.backtrace.reject{ |bt| bt =~ INTERNALS }
|
578
|
+
caller = trace.first
|
579
|
+
when Array
|
580
|
+
caller = caller.first
|
581
|
+
end
|
582
|
+
caller =~ /(.+?):(\d+(?=:|\z))/ or return ""
|
583
|
+
source_file, source_line = $1, $2.to_i
|
584
|
+
return source_file, source_line
|
585
|
+
end
|
586
|
+
|
587
|
+
# Get location of exception.
|
588
|
+
def location e # :nodoc:
|
589
|
+
last_before_assertion = ""
|
590
|
+
e.backtrace.reverse_each do |s|
|
591
|
+
break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/
|
592
|
+
last_before_assertion = s
|
593
|
+
end
|
594
|
+
file, line = last_before_assertion.sub(/:in .*$/, '').split(':')
|
595
|
+
line = line.to_i if line
|
596
|
+
return file, line
|
597
|
+
end
|
598
|
+
|
599
|
+
#
|
600
|
+
def clean_message(message)
|
601
|
+
message.strip #.gsub(/\s*\n\s*/, "\n")
|
602
|
+
end
|
603
|
+
|
604
|
+
#
|
605
|
+
#def capture_io
|
606
|
+
# ostdout, ostderr = $stdout, $stderr
|
607
|
+
# cstdout, cstderr = StringIO.new, StringIO.new
|
608
|
+
# $stdout, $stderr = cstdout, cstderr
|
609
|
+
#
|
610
|
+
# yield
|
611
|
+
#
|
612
|
+
# return cstdout.string.chomp("\n"), cstderr.string.chomp("\n")
|
613
|
+
#ensure
|
614
|
+
# $stdout = ostdout
|
615
|
+
# $stderr = ostderr
|
616
|
+
#end
|
617
|
+
|
618
|
+
#
|
619
|
+
def capture_io
|
620
|
+
@_stdout, @_stderr = $stdout, $stderr
|
621
|
+
$stdout, $stderr = StringIO.new, StringIO.new
|
622
|
+
end
|
623
|
+
|
624
|
+
#
|
625
|
+
def uncapture_io
|
626
|
+
$stdout, $stderr = @_stdout, @_stderr
|
627
|
+
end
|
628
|
+
|
629
|
+
end
|
630
|
+
|
631
|
+
#
|
632
|
+
# TestResult delegtes to Minitest's own test result object.
|
633
|
+
#
|
634
|
+
class TestResult
|
635
|
+
# Create new TestResult instance.
|
636
|
+
#
|
637
|
+
# result - MiniTest's test result object.
|
638
|
+
#
|
639
|
+
def initialize(result)
|
640
|
+
@result = result
|
641
|
+
end
|
642
|
+
|
643
|
+
def test_case
|
644
|
+
@result.class
|
645
|
+
end
|
646
|
+
alias :testcase :test_case
|
647
|
+
|
648
|
+
# Name of the test.
|
649
|
+
def name
|
650
|
+
@result.name
|
651
|
+
end
|
652
|
+
alias :test :name
|
653
|
+
|
654
|
+
#
|
655
|
+
def label
|
656
|
+
if spec?
|
657
|
+
name.sub(/^test_\d+_/, '').gsub('_', ' ')
|
658
|
+
else
|
659
|
+
name
|
660
|
+
end
|
661
|
+
end
|
662
|
+
|
663
|
+
# Is this a Minitest::Spec?
|
664
|
+
#
|
665
|
+
# Returns [Boolean].
|
666
|
+
def spec?
|
667
|
+
@is_spec ||= (
|
668
|
+
Minitest.const_defined?(:Spec) && @result.class < Minitest::Spec
|
669
|
+
#@result.class.methods.include?(:it) || @result.class.methods.include?('it')
|
670
|
+
)
|
671
|
+
end
|
672
|
+
|
673
|
+
# Number of assertions made by test.
|
674
|
+
#
|
675
|
+
# Returns [Integer].
|
676
|
+
def assertions
|
677
|
+
@result.assertions
|
678
|
+
end
|
679
|
+
|
680
|
+
#
|
681
|
+
def time
|
682
|
+
@result.time
|
683
|
+
end
|
684
|
+
|
685
|
+
#
|
686
|
+
def exception
|
687
|
+
@result.failure
|
688
|
+
end
|
689
|
+
|
690
|
+
# Result type.
|
691
|
+
def type
|
692
|
+
case exception
|
693
|
+
when UnexpectedError
|
694
|
+
:err
|
695
|
+
when Skip
|
696
|
+
:skip
|
697
|
+
when Assertion
|
698
|
+
:fail
|
699
|
+
when nil
|
700
|
+
:pass
|
701
|
+
else
|
702
|
+
:err
|
703
|
+
end
|
704
|
+
end
|
705
|
+
end
|
706
|
+
|
707
|
+
=begin
|
708
|
+
# Runner for individual MiniTest tests.
|
709
|
+
#
|
710
|
+
# You *should not* create instances of this class directly. Instances of
|
711
|
+
# {SuiteRunner} will create these and send them to the reporters.
|
712
|
+
#
|
713
|
+
# Based upon Ryan Davis of Seattle.rb's MiniTest (MIT License).
|
714
|
+
#
|
715
|
+
# @see https://github.com/seattlerb/minitest MiniTest
|
716
|
+
class TestRunner
|
717
|
+
attr_reader :suite, :test, :assertions, :result, :exception
|
718
|
+
attr_reader :stdout, :stderr
|
719
|
+
|
720
|
+
def initialize(suite, test)
|
721
|
+
@suite = suite
|
722
|
+
@test = test
|
723
|
+
@assertions = 0
|
724
|
+
end
|
725
|
+
|
726
|
+
def run
|
727
|
+
suite_instance = suite.new(test)
|
728
|
+
test_result = nil
|
729
|
+
@stdout, @stderr = capture_io do
|
730
|
+
test_result = suite_instance.run(self)
|
731
|
+
end
|
732
|
+
@result, @exception = fix_result(test_result)
|
733
|
+
@assertions = suite_instance._assertions
|
734
|
+
end
|
735
|
+
|
736
|
+
def puke(suite, test, exception)
|
737
|
+
case exception
|
738
|
+
when MiniTest::Skip then [:skip, exception]
|
739
|
+
when MiniTest::Assertion then [:failure, exception]
|
740
|
+
else [:error, exception]
|
741
|
+
end
|
742
|
+
end
|
743
|
+
|
744
|
+
def record(suite, method, assertions, time, error)
|
745
|
+
end
|
746
|
+
|
747
|
+
private
|
748
|
+
|
749
|
+
#
|
750
|
+
def fix_result(result)
|
751
|
+
result == '.' ? [:pass, nil] : result
|
752
|
+
end
|
753
|
+
|
754
|
+
#
|
755
|
+
def capture_io
|
756
|
+
ostdout, ostderr = $stdout, $stderr
|
757
|
+
cstdout, cstderr = StringIO.new, StringIO.new
|
758
|
+
$stdout, $stderr = cstdout, cstderr
|
759
|
+
|
760
|
+
yield
|
761
|
+
|
762
|
+
return cstdout.string.chomp("\n"), cstderr.string.chomp("\n")
|
763
|
+
ensure
|
764
|
+
$stdout = ostdout
|
765
|
+
$stderr = ostderr
|
766
|
+
end
|
767
|
+
end
|
768
|
+
=end
|
769
|
+
|
770
|
+
=begin
|
771
|
+
##
|
772
|
+
# Around advice.
|
773
|
+
#
|
774
|
+
module AroundTestHooks
|
775
|
+
def self.before_test(instance)
|
776
|
+
if before_test = (MiniTest::Unit.runner.method(:before_test) rescue nil)
|
777
|
+
before_test.call(instance.class, instance.__name__)
|
778
|
+
end
|
779
|
+
end
|
780
|
+
|
781
|
+
def self.after_test(instance)
|
782
|
+
# MiniTest < 4.1.0 sends #record after all teardown hooks, so don't call
|
783
|
+
# #after_test here.
|
784
|
+
if MiniTest::Unit::VERSION > "4.1.0"
|
785
|
+
if after_test = (MiniTest::Unit.runner.method(:after_test) rescue nil)
|
786
|
+
after_test.call(instance.class, instance.__name__)
|
787
|
+
end
|
788
|
+
end
|
789
|
+
end
|
790
|
+
|
791
|
+
def before_setup
|
792
|
+
AroundTestHooks.before_test(self)
|
793
|
+
super
|
794
|
+
end
|
795
|
+
|
796
|
+
def after_teardown
|
797
|
+
super
|
798
|
+
AroundTestHooks.after_test(self)
|
799
|
+
end
|
800
|
+
end
|
801
|
+
|
802
|
+
class Unit::TestCase
|
803
|
+
include AroundTestHooks
|
804
|
+
end
|
805
|
+
=end
|
806
|
+
|
807
|
+
##
|
808
|
+
# TAP-Y adapater.
|
809
|
+
#
|
810
|
+
class TapY < Minitap
|
811
|
+
def initialize(io=$stdout, options={})
|
812
|
+
require 'yaml' unless respond_to?(:to_yaml)
|
813
|
+
super(io, options)
|
814
|
+
end
|
815
|
+
|
816
|
+
def tapout_before_suite()
|
817
|
+
wp super().to_yaml
|
818
|
+
end
|
819
|
+
def tapout_before_case(test_case)
|
820
|
+
wp super(test_case).to_yaml
|
821
|
+
end
|
822
|
+
def tapout_test_pass(result)
|
823
|
+
wp super(result).to_yaml
|
824
|
+
end
|
825
|
+
def tapout_test_skip(result)
|
826
|
+
wp super(result).to_yaml
|
827
|
+
end
|
828
|
+
def tapout_test_failure(result)
|
829
|
+
wp super(result).to_yaml
|
830
|
+
end
|
831
|
+
def tapout_test_error(result)
|
832
|
+
wp super(result).to_yaml
|
833
|
+
end
|
834
|
+
def tapout_after_suite()
|
835
|
+
wp super().to_yaml
|
836
|
+
wp "..."
|
837
|
+
end
|
838
|
+
|
839
|
+
def wp(str)
|
840
|
+
io.puts(str)
|
841
|
+
end
|
842
|
+
end
|
843
|
+
|
844
|
+
##
|
845
|
+
# TAP-J adapater.
|
846
|
+
#
|
847
|
+
class TapJ < Minitap
|
848
|
+
def initialize(io=$stdout, options={})
|
849
|
+
require 'json' unless respond_to?(:to_json)
|
850
|
+
super(io, options)
|
851
|
+
end
|
852
|
+
|
853
|
+
def tapout_before_suite()
|
854
|
+
wp super().to_json
|
855
|
+
end
|
856
|
+
def tapout_before_case(test_case)
|
857
|
+
wp super(test_case).to_json
|
858
|
+
end
|
859
|
+
def tapout_test_pass(result)
|
860
|
+
wp super(result).to_json
|
861
|
+
end
|
862
|
+
def tapout_test_skip(result)
|
863
|
+
wp super(result).to_json
|
864
|
+
end
|
865
|
+
def tapout_test_failure(result)
|
866
|
+
wp super(result).to_json
|
867
|
+
end
|
868
|
+
def tapout_test_error(result)
|
869
|
+
wp super(result).to_json
|
870
|
+
end
|
871
|
+
def tapout_after_suite()
|
872
|
+
wp super().to_json
|
873
|
+
end
|
874
|
+
|
875
|
+
def wp(str)
|
876
|
+
io.puts(str)
|
877
|
+
#STDOUT.puts(str)
|
878
|
+
end
|
879
|
+
end
|
880
|
+
|
881
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Minitest
|
2
|
+
|
3
|
+
def self.plugin_minitap_options(opts, options)
|
4
|
+
opts.on "--tapy", "Use TapY reporter." do
|
5
|
+
options[:minitap] = 'tapy'
|
6
|
+
end
|
7
|
+
opts.on "--tapj", "Use TapJ reporter." do
|
8
|
+
options[:minitap] = 'tapj'
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.plugin_minitap_init(options)
|
13
|
+
if options[:minitap]
|
14
|
+
require 'minitap/minitest5'
|
15
|
+
|
16
|
+
self.reporter.reporters.clear
|
17
|
+
|
18
|
+
case options[:minitap] || ENV['rpt']
|
19
|
+
when 'tapj'
|
20
|
+
self.reporter << TapJ.new(options[:io], options)
|
21
|
+
when 'tapy'
|
22
|
+
self.reporter << TapY.new(options[:io], options)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
metadata
CHANGED
@@ -1,94 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: minitap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.5.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- trans
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-11-15 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: tapout
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 0.3.0
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 0.3.0
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: minitest
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version: '0'
|
33
|
+
version: '5.0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version: '0'
|
40
|
+
version: '5.0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
42
|
+
name: qed
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
|
-
name:
|
56
|
+
name: ae
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
70
|
+
name: ergo
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - '>='
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
83
|
description: MiniTap provides a MiniTest TAP-Y/J report format suitable for use with
|
@@ -99,46 +88,46 @@ executables: []
|
|
99
88
|
extensions: []
|
100
89
|
extra_rdoc_files:
|
101
90
|
- LICENSE.txt
|
102
|
-
- HISTORY.md
|
103
|
-
- README.md
|
104
|
-
- QED.md
|
105
91
|
- NOTICE.md
|
92
|
+
- README.md
|
93
|
+
- HISTORY.md
|
94
|
+
- DEMO.md
|
106
95
|
files:
|
107
96
|
- .index
|
108
97
|
- .yardopts
|
109
98
|
- lib/minitap/ignore_callers.rb
|
99
|
+
- lib/minitap/minitest5.rb
|
110
100
|
- lib/minitap/tapj.rb
|
111
101
|
- lib/minitap/tapy.rb
|
112
102
|
- lib/minitap.rb
|
113
|
-
-
|
114
|
-
- README.md
|
115
|
-
- QED.md
|
103
|
+
- lib/minitest/minitap_plugin.rb
|
116
104
|
- NOTICE.md
|
105
|
+
- README.md
|
106
|
+
- HISTORY.md
|
107
|
+
- DEMO.md
|
117
108
|
- LICENSE.txt
|
118
109
|
homepage: http://rubyworks.github.com/minitap
|
119
110
|
licenses:
|
120
111
|
- BSD-2-Clause
|
112
|
+
metadata: {}
|
121
113
|
post_install_message:
|
122
114
|
rdoc_options: []
|
123
115
|
require_paths:
|
124
116
|
- lib
|
125
117
|
required_ruby_version: !ruby/object:Gem::Requirement
|
126
|
-
none: false
|
127
118
|
requirements:
|
128
|
-
- -
|
119
|
+
- - '>='
|
129
120
|
- !ruby/object:Gem::Version
|
130
121
|
version: '0'
|
131
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
-
none: false
|
133
123
|
requirements:
|
134
|
-
- -
|
124
|
+
- - '>='
|
135
125
|
- !ruby/object:Gem::Version
|
136
126
|
version: '0'
|
137
127
|
requirements: []
|
138
128
|
rubyforge_project:
|
139
|
-
rubygems_version:
|
129
|
+
rubygems_version: 2.0.3
|
140
130
|
signing_key:
|
141
|
-
specification_version:
|
131
|
+
specification_version: 4
|
142
132
|
summary: TAP-Y/J reporters for MiniTest
|
143
133
|
test_files: []
|
144
|
-
has_rdoc:
|