journo 0.2.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.
- data/.gitignore +22 -0
- data/.travis.yml +7 -0
- data/.yardopts +6 -0
- data/Gemfile +2 -0
- data/LICENSE +20 -0
- data/README.md +45 -0
- data/Rakefile +11 -0
- data/journo.gemspec +29 -0
- data/lib/journo.rb +15 -0
- data/lib/journo/reporter.rb +35 -0
- data/lib/journo/reporters/default_reporter.rb +103 -0
- data/lib/journo/reporters/progress_reporter.rb +107 -0
- data/lib/journo/reporters/spec_reporter.rb +92 -0
- data/lib/journo/suite_runner.rb +110 -0
- data/lib/journo/test_runner.rb +39 -0
- data/lib/journo/version.rb +3 -0
- data/test/journo/reporter_test.rb +45 -0
- data/test/journo/suite_runner_test.rb +160 -0
- data/test/journo/test_runner_test.rb +91 -0
- data/test/support/fixtures/empty_test_fixture.rb +5 -0
- data/test/support/fixtures/error_test_fixture.rb +9 -0
- data/test/support/fixtures/failure_test_fixture.rb +9 -0
- data/test/support/fixtures/pass_test_fixture.rb +14 -0
- data/test/support/fixtures/skip_test_fixture.rb +9 -0
- data/test/support/fixtures/suite_callback_test_fixture.rb +9 -0
- data/test/support/fixtures/test_case_fixture.rb +38 -0
- data/test/support/test_case.rb +4 -0
- data/test/test_helper.rb +33 -0
- metadata +160 -0
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
coverage
|
2
|
+
rdoc
|
3
|
+
pkg
|
4
|
+
test/tmp
|
5
|
+
test/version_tmp
|
6
|
+
tmp
|
7
|
+
pkg
|
8
|
+
*.gem
|
9
|
+
*.rbc
|
10
|
+
lib/bundler/man
|
11
|
+
spec/reports
|
12
|
+
.config
|
13
|
+
InstalledFiles
|
14
|
+
.bundle
|
15
|
+
|
16
|
+
# YARD artifacts
|
17
|
+
.yardoc
|
18
|
+
_yardoc
|
19
|
+
doc/
|
20
|
+
|
21
|
+
# Gem-specific
|
22
|
+
Gemfile.lock
|
data/.travis.yml
ADDED
data/.yardopts
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Alexander Kern
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
# journo - reporters for MiniTest [](http://stillmaintained.com/CapnKernul/journo) [](http://travis-ci.org/CapnKernul/journo) #
|
2
|
+
|
3
|
+
Allows you to extend MiniTest using reporters rather than monkey-patching.
|
4
|
+
|
5
|
+
## Installation ##
|
6
|
+
|
7
|
+
gem install journo
|
8
|
+
|
9
|
+
## Usage ##
|
10
|
+
|
11
|
+
In your `test_helper.rb` file, add the following lines:
|
12
|
+
|
13
|
+
require 'journo'
|
14
|
+
MiniTest::Unit.runner = Journo::SuiteRunner.new
|
15
|
+
MiniTest::Unit.runner.reporters << Journo::Reporters::ProgressReporter.new
|
16
|
+
|
17
|
+
Now, just run your tests; the reporter you specified will be used and make your
|
18
|
+
output look absolutely gorgeous! If you feel the need to write your own
|
19
|
+
reporter, just subclass `Journo::Reporter` and override the methods you'd
|
20
|
+
like. Take a look at the provided reporters for examples.
|
21
|
+
|
22
|
+
The following reporters are provided:
|
23
|
+
|
24
|
+
Journo::Reporters::DefaultReporter # => Identical to the standard MiniTest reporter
|
25
|
+
Journo::Reporters::SpecReporter # => Turn-like output that reads like a spec
|
26
|
+
Journo::Reporters::ProgressReporter # => Fuubar-like output with a progress bar
|
27
|
+
|
28
|
+
I really like `ProgressReporter`.
|
29
|
+
|
30
|
+
## Note on Patches/Pull Requests ##
|
31
|
+
|
32
|
+
* Fork the project.
|
33
|
+
* Make your feature addition or bug fix.
|
34
|
+
* Add tests for it. This is important so I don't break it in a future version unintentionally.
|
35
|
+
* Commit, but do not mess with the `Rakefile`. If you want to have your own version, that is fine but bump the version in a commit by itself in another branch so I can ignore it when I pull.
|
36
|
+
* Send me a pull request. Bonus points for git flow feature branches.
|
37
|
+
|
38
|
+
## Resources ##
|
39
|
+
|
40
|
+
* [GitHub Repository](https://github.com/CapnKernul/journo)
|
41
|
+
* [Documentation](http://rubydoc.info/github/CapnKernul/journo)
|
42
|
+
|
43
|
+
## License ##
|
44
|
+
|
45
|
+
Journo is licensed under the MIT License. See `LICENSE` for details.
|
data/Rakefile
ADDED
data/journo.gemspec
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'journo/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'journo'
|
7
|
+
s.version = Journo::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ['Alexander Kern']
|
10
|
+
s.email = ['alex@kernul.com']
|
11
|
+
s.homepage = 'https://github.com/CapnKernul/journo'
|
12
|
+
s.summary = %q{Reporters for MiniTest}
|
13
|
+
s.description = %q{Allows you to extend MiniTest using reporters rather than monkey-patching}
|
14
|
+
|
15
|
+
s.rubyforge_project = 'journo'
|
16
|
+
|
17
|
+
s.add_dependency 'minitest', '~> 2.0'
|
18
|
+
s.add_dependency 'ansi'
|
19
|
+
s.add_dependency 'ruby-progressbar'
|
20
|
+
|
21
|
+
s.add_development_dependency 'mocha'
|
22
|
+
s.add_development_dependency 'maruku'
|
23
|
+
s.add_development_dependency 'test_declarative'
|
24
|
+
|
25
|
+
s.files = `git ls-files`.split("\n")
|
26
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
27
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
28
|
+
s.require_paths = ['lib']
|
29
|
+
end
|
data/lib/journo.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'minitest/unit'
|
2
|
+
|
3
|
+
module Journo
|
4
|
+
require 'journo/version'
|
5
|
+
|
6
|
+
autoload :Reporter, 'journo/reporter'
|
7
|
+
autoload :SuiteRunner, 'journo/suite_runner'
|
8
|
+
autoload :TestRunner, 'journo/test_runner'
|
9
|
+
|
10
|
+
module Reporters
|
11
|
+
autoload :DefaultReporter, 'journo/reporters/default_reporter'
|
12
|
+
autoload :SpecReporter, 'journo/reporters/spec_reporter'
|
13
|
+
autoload :ProgressReporter, 'journo/reporters/progress_reporter'
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Journo
|
2
|
+
class Reporter
|
3
|
+
VERSION = '0.1.0'
|
4
|
+
|
5
|
+
def runner
|
6
|
+
MiniTest::Unit.runner
|
7
|
+
end
|
8
|
+
|
9
|
+
def output
|
10
|
+
runner.output
|
11
|
+
end
|
12
|
+
|
13
|
+
def verbose?
|
14
|
+
runner.verbose
|
15
|
+
end
|
16
|
+
|
17
|
+
def print(*args)
|
18
|
+
runner.output.print(*args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def puts(*args)
|
22
|
+
runner.output.puts(*args)
|
23
|
+
end
|
24
|
+
|
25
|
+
def before_suites(suites, type); end
|
26
|
+
def after_suites(suites, type); end
|
27
|
+
def before_suite(suite); end
|
28
|
+
def after_suite(suite); end
|
29
|
+
def before_test(suite, test); end
|
30
|
+
def pass(suite, test, test_runner); end
|
31
|
+
def skip(suite, test, test_runner); end
|
32
|
+
def failure(suite, test, test_runner); end
|
33
|
+
def error(suite, test, test_runner); end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'ansi'
|
2
|
+
|
3
|
+
module Journo
|
4
|
+
module Reporters
|
5
|
+
# A reporter identical to the standard MiniTest reporter.
|
6
|
+
#
|
7
|
+
# Based upon Ryan Davis of Seattle.rb's MiniTest (MIT License).
|
8
|
+
#
|
9
|
+
# @see https://github.com/seattlerb/minitest MiniTest
|
10
|
+
class DefaultReporter < Journo::Reporter
|
11
|
+
def before_suites(suites, type)
|
12
|
+
puts
|
13
|
+
puts "# Running #{type}s:"
|
14
|
+
puts
|
15
|
+
end
|
16
|
+
|
17
|
+
def before_test(suite, test)
|
18
|
+
print "#{suite}##{method} = " if verbose?
|
19
|
+
end
|
20
|
+
|
21
|
+
def pass(suite, test, test_runner)
|
22
|
+
after_test('.')
|
23
|
+
end
|
24
|
+
|
25
|
+
def skip(suite, test, test_runner)
|
26
|
+
after_test('S')
|
27
|
+
end
|
28
|
+
|
29
|
+
def failure(suite, test, test_runner)
|
30
|
+
after_test('F')
|
31
|
+
end
|
32
|
+
|
33
|
+
def error(suite, test, test_runner)
|
34
|
+
after_test('E')
|
35
|
+
end
|
36
|
+
|
37
|
+
def after_suites(suites, type)
|
38
|
+
time = Time.now - runner.start_time
|
39
|
+
|
40
|
+
puts
|
41
|
+
puts
|
42
|
+
puts "Finished #{type}s in %.6fs, %.4f tests/s, %.4f assertions/s." %
|
43
|
+
[time, runner.test_count / time, runner.assertion_count / time]
|
44
|
+
|
45
|
+
i = 0
|
46
|
+
runner.report.each do |suite, tests|
|
47
|
+
tests.each do |test, test_runner|
|
48
|
+
message = message_for(test_runner)
|
49
|
+
if message
|
50
|
+
i += 1
|
51
|
+
puts "\n%3d) %s" % [i, message]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
puts
|
57
|
+
|
58
|
+
puts status
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def after_test(result)
|
64
|
+
time = Time.now - runner.test_start_time
|
65
|
+
|
66
|
+
print '%.2f s = ' % time if verbose?
|
67
|
+
print result
|
68
|
+
puts if verbose?
|
69
|
+
end
|
70
|
+
|
71
|
+
def location(exception)
|
72
|
+
last_before_assertion = ''
|
73
|
+
|
74
|
+
exception.backtrace.reverse_each do |s|
|
75
|
+
break if s =~ /in .(assert|refute|flunk|pass|fail|raise|must|wont)/
|
76
|
+
last_before_assertion = s
|
77
|
+
end
|
78
|
+
|
79
|
+
last_before_assertion.sub(/:in .*$/, '')
|
80
|
+
end
|
81
|
+
|
82
|
+
def message_for(test_runner)
|
83
|
+
suite = test_runner.suite
|
84
|
+
test = test_runner.test
|
85
|
+
e = test_runner.exception
|
86
|
+
|
87
|
+
case test_runner.result
|
88
|
+
when :pass then nil
|
89
|
+
when :skip then "Skipped:\n#{test}(#{suite}) [#{location(e)}]:\n#{e.message}\n"
|
90
|
+
when :failure then "Failure:\n#{test}(#{suite}) [#{location(e)}]:\n#{e.message}\n"
|
91
|
+
when :error
|
92
|
+
bt = MiniTest::filter_backtrace(test_runner.exception.backtrace).join "\n "
|
93
|
+
"Error:\n#{test}(#{suite}):\n#{e.class}: #{e.message}\n #{bt}\n"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def status
|
98
|
+
'%d tests, %d assertions, %d failures, %d errors, %d skips' %
|
99
|
+
[runner.test_count, runner.assertion_count, runner.failures, runner.errors, runner.skips]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'ansi'
|
2
|
+
require 'progressbar'
|
3
|
+
|
4
|
+
module Journo
|
5
|
+
module Reporters
|
6
|
+
# Fuubar-like reporter with a progress bar.
|
7
|
+
#
|
8
|
+
# Based upon Jeff Kreefmeijer's Fuubar (MIT License) and paydro's
|
9
|
+
# monkey-patch.
|
10
|
+
#
|
11
|
+
# @see https://github.com/jeffkreeftmeijer/fuubar Fuubar
|
12
|
+
# @see https://gist.github.com/356945 paydro's monkey-patch
|
13
|
+
class ProgressReporter < Journo::Reporter
|
14
|
+
include ANSI::Code
|
15
|
+
|
16
|
+
INFO_PADDING = 2
|
17
|
+
|
18
|
+
def before_suites(suites, type)
|
19
|
+
puts 'Started'
|
20
|
+
puts
|
21
|
+
|
22
|
+
@color = GREEN
|
23
|
+
@finished_count = 0
|
24
|
+
@progress = ProgressBar.new("0/#{runner.test_count}", runner.test_count, runner.output)
|
25
|
+
@progress.bar_mark = '='
|
26
|
+
end
|
27
|
+
|
28
|
+
def increment
|
29
|
+
with_color do
|
30
|
+
@finished_count += 1
|
31
|
+
@progress.instance_variable_set('@title', "#{@finished_count}/#{runner.test_count}")
|
32
|
+
@progress.inc
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def pass(suite, test, test_runner)
|
37
|
+
increment
|
38
|
+
end
|
39
|
+
|
40
|
+
def skip(suite, test, test_runner)
|
41
|
+
@color = YELLOW unless @color == RED
|
42
|
+
print(yellow { 'SKIP' })
|
43
|
+
print_test_with_time(suite, test)
|
44
|
+
puts
|
45
|
+
puts
|
46
|
+
increment
|
47
|
+
end
|
48
|
+
|
49
|
+
def failure(suite, test, test_runner)
|
50
|
+
@color = RED
|
51
|
+
print(red { 'FAIL' })
|
52
|
+
print_test_with_time(suite, test)
|
53
|
+
puts
|
54
|
+
print_info(test_runner.exception)
|
55
|
+
puts
|
56
|
+
increment
|
57
|
+
end
|
58
|
+
|
59
|
+
def error(suite, test, test_runner)
|
60
|
+
@color = RED
|
61
|
+
print(red { 'ERROR' })
|
62
|
+
print_test_with_time(suite, test)
|
63
|
+
puts
|
64
|
+
print_info(test_runner.exception)
|
65
|
+
puts
|
66
|
+
increment
|
67
|
+
end
|
68
|
+
|
69
|
+
def after_suites(suites, type)
|
70
|
+
with_color { @progress.finish }
|
71
|
+
|
72
|
+
total_time = Time.now - runner.start_time
|
73
|
+
|
74
|
+
puts
|
75
|
+
puts('Finished in %.5fs' % total_time)
|
76
|
+
print('%d tests, %d assertions, ' % [runner.test_count, runner.assertion_count])
|
77
|
+
print(red { '%d failures, %d errors, ' } % [runner.failures, runner.errors])
|
78
|
+
print(yellow { '%d skips' } % runner.skips)
|
79
|
+
puts
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def print_test_with_time(suite, test)
|
85
|
+
total_time = Time.now - runner.test_start_time
|
86
|
+
print(" #{suite}##{test} (%.2fs)#{clr}" % total_time)
|
87
|
+
end
|
88
|
+
|
89
|
+
def print_info(e)
|
90
|
+
e.message.each_line { |line| puts pad(line) }
|
91
|
+
|
92
|
+
trace = MiniTest.filter_backtrace(e.backtrace)
|
93
|
+
trace.each { |line| puts pad(line) }
|
94
|
+
end
|
95
|
+
|
96
|
+
def pad(str)
|
97
|
+
' ' * INFO_PADDING + str
|
98
|
+
end
|
99
|
+
|
100
|
+
def with_color
|
101
|
+
print @color
|
102
|
+
yield
|
103
|
+
print CLEAR
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'ansi'
|
2
|
+
|
3
|
+
module Journo
|
4
|
+
module Reporters
|
5
|
+
# Turn-like reporter that reads like a spec.
|
6
|
+
#
|
7
|
+
# Based upon TwP's turn (MIT License) and paydro's monkey-patch.
|
8
|
+
#
|
9
|
+
# @see https://github.com/TwP/turn turn
|
10
|
+
# @see https://gist.github.com/356945 paydro's monkey-patch
|
11
|
+
class SpecReporter < Journo::Reporter
|
12
|
+
include ANSI::Code
|
13
|
+
|
14
|
+
TEST_PADDING = 2
|
15
|
+
INFO_PADDING = 8
|
16
|
+
MARK_SIZE = 5
|
17
|
+
|
18
|
+
def before_suites(suites, type)
|
19
|
+
puts 'Started'
|
20
|
+
puts
|
21
|
+
end
|
22
|
+
|
23
|
+
def after_suites(suites, type)
|
24
|
+
total_time = Time.now - runner.start_time
|
25
|
+
|
26
|
+
puts('Finished in %.5fs' % total_time)
|
27
|
+
print('%d tests, %d assertions, ' % [runner.test_count, runner.assertion_count])
|
28
|
+
print(red { '%d failures, %d errors, ' } % [runner.failures, runner.errors])
|
29
|
+
print(yellow { '%d skips' } % runner.skips)
|
30
|
+
puts
|
31
|
+
end
|
32
|
+
|
33
|
+
def before_suite(suite)
|
34
|
+
puts suite
|
35
|
+
end
|
36
|
+
|
37
|
+
def after_suite(suite)
|
38
|
+
puts
|
39
|
+
end
|
40
|
+
|
41
|
+
def pass(suite, test, test_runner)
|
42
|
+
print(green { pad_mark('PASS') })
|
43
|
+
print_test_with_time(test)
|
44
|
+
puts
|
45
|
+
end
|
46
|
+
|
47
|
+
def skip(suite, test, test_runner)
|
48
|
+
print(yellow { pad_mark('SKIP') })
|
49
|
+
print_test_with_time(test)
|
50
|
+
puts
|
51
|
+
end
|
52
|
+
|
53
|
+
def failure(suite, test, test_runner)
|
54
|
+
print(red { pad_mark('FAIL') })
|
55
|
+
print_test_with_time(test)
|
56
|
+
puts
|
57
|
+
print_info(test_runner.exception)
|
58
|
+
puts
|
59
|
+
end
|
60
|
+
|
61
|
+
def error(suite, test, test_runner)
|
62
|
+
print(red { pad_mark('ERROR') })
|
63
|
+
print_test_with_time(test)
|
64
|
+
puts
|
65
|
+
print_info(test_runner.exception)
|
66
|
+
puts
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def print_test_with_time(test)
|
72
|
+
total_time = Time.now - runner.test_start_time
|
73
|
+
print(" #{test} (%.2fs)" % total_time)
|
74
|
+
end
|
75
|
+
|
76
|
+
def print_info(e)
|
77
|
+
e.message.each_line { |line| puts pad(line, INFO_PADDING) }
|
78
|
+
|
79
|
+
trace = MiniTest.filter_backtrace(e.backtrace)
|
80
|
+
trace.each { |line| puts pad(line, INFO_PADDING) }
|
81
|
+
end
|
82
|
+
|
83
|
+
def pad(str, size)
|
84
|
+
' ' * size + str
|
85
|
+
end
|
86
|
+
|
87
|
+
def pad_mark(str)
|
88
|
+
pad("%#{MARK_SIZE}s" % str, TEST_PADDING)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module Journo
|
2
|
+
# Runner for MiniTest suites.
|
3
|
+
#
|
4
|
+
# This is a heavily refactored version of the built-in MiniTest runner. It's
|
5
|
+
# about the same speed, from what I can tell, but is significantly easier to
|
6
|
+
# extend.
|
7
|
+
#
|
8
|
+
# Based upon Ryan Davis of Seattle.rb's MiniTest (MIT License).
|
9
|
+
#
|
10
|
+
# @see https://github.com/seattlerb/minitest MiniTest
|
11
|
+
class SuiteRunner < MiniTest::Unit
|
12
|
+
attr_accessor :suite_start_time, :test_start_time, :reporters
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
self.report = {}
|
16
|
+
self.errors = 0
|
17
|
+
self.failures = 0
|
18
|
+
self.skips = 0
|
19
|
+
self.test_count = 0
|
20
|
+
self.assertion_count = 0
|
21
|
+
self.verbose = false
|
22
|
+
self.reporters = []
|
23
|
+
end
|
24
|
+
|
25
|
+
def _run_anything(type)
|
26
|
+
self.start_time = Time.now
|
27
|
+
|
28
|
+
suites = suites_of_type(type)
|
29
|
+
tests = suites.inject({}) do |acc, suite|
|
30
|
+
acc[suite] = filtered_tests(suite, type)
|
31
|
+
acc
|
32
|
+
end
|
33
|
+
|
34
|
+
self.test_count = tests.inject(0) { |acc, suite| acc + suite[1].length }
|
35
|
+
|
36
|
+
if test_count > 0
|
37
|
+
trigger(:before_suites, suites, type)
|
38
|
+
|
39
|
+
fix_sync do
|
40
|
+
suites.each { |suite| _run_suite(suite, tests[suite]) }
|
41
|
+
end
|
42
|
+
|
43
|
+
trigger(:after_suites, suites, type)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def _run_suite(suite, tests)
|
48
|
+
unless tests.empty?
|
49
|
+
begin
|
50
|
+
self.suite_start_time = Time.now
|
51
|
+
|
52
|
+
trigger(:before_suite, suite)
|
53
|
+
suite.startup if suite.respond_to?(:startup)
|
54
|
+
|
55
|
+
tests.each { |test| _run_test(suite, test) }
|
56
|
+
ensure
|
57
|
+
suite.shutdown if suite.respond_to?(:shutdown)
|
58
|
+
trigger(:after_suite, suite)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def _run_test(suite, test)
|
64
|
+
self.test_start_time = Time.now
|
65
|
+
trigger(:before_test, suite, test)
|
66
|
+
|
67
|
+
test_runner = TestRunner.new(suite, test)
|
68
|
+
test_runner.run
|
69
|
+
add_test_result(suite, test, test_runner)
|
70
|
+
|
71
|
+
trigger(test_runner.result, suite, test, test_runner)
|
72
|
+
end
|
73
|
+
|
74
|
+
def trigger(callback, *args)
|
75
|
+
reporters.each { |reporter| reporter.send(callback, *args) }
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def filtered_tests(suite, type)
|
81
|
+
filter = options[:filter] || '/./'
|
82
|
+
filter = Regexp.new($1) if filter =~ /\/(.*)\//
|
83
|
+
suite.send("#{type}_methods").grep(filter)
|
84
|
+
end
|
85
|
+
|
86
|
+
def suites_of_type(type)
|
87
|
+
TestCase.send("#{type}_suites")
|
88
|
+
end
|
89
|
+
|
90
|
+
def add_test_result(suite, test, test_runner)
|
91
|
+
self.report[suite] ||= {}
|
92
|
+
self.report[suite][test.to_sym] = test_runner
|
93
|
+
|
94
|
+
self.assertion_count += test_runner.assertions
|
95
|
+
|
96
|
+
case test_runner.result
|
97
|
+
when :skip then self.skips += 1
|
98
|
+
when :failure then self.failures += 1
|
99
|
+
when :error then self.errors += 1
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def fix_sync
|
104
|
+
sync = output.respond_to?(:'sync=') # stupid emacs
|
105
|
+
old_sync, output.sync = output.sync, true if sync
|
106
|
+
yield
|
107
|
+
output.sync = old_sync if sync
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Journo
|
2
|
+
# Runner for individual MiniTest tests.
|
3
|
+
#
|
4
|
+
# You *should not* create instances of this class directly. Instances of
|
5
|
+
# {SuiteRunner} will create these and send them to the reporters.
|
6
|
+
#
|
7
|
+
# Based upon Ryan Davis of Seattle.rb's MiniTest (MIT License).
|
8
|
+
#
|
9
|
+
# @see https://github.com/seattlerb/minitest MiniTest
|
10
|
+
class TestRunner
|
11
|
+
attr_reader :suite, :test, :assertions, :result, :exception
|
12
|
+
|
13
|
+
def initialize(suite, test)
|
14
|
+
@suite = suite
|
15
|
+
@test = test
|
16
|
+
@assertions = 0
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
suite_instance = suite.new(test)
|
21
|
+
@result, @exception = fix_result(suite_instance.run(self))
|
22
|
+
@assertions = suite_instance._assertions
|
23
|
+
end
|
24
|
+
|
25
|
+
def puke(suite, test, exception)
|
26
|
+
case exception
|
27
|
+
when MiniTest::Skip then [:skip, exception]
|
28
|
+
when MiniTest::Assertion then [:failure, exception]
|
29
|
+
else [:error, exception]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def fix_result(result)
|
36
|
+
result == '.' ? [:pass, nil] : result
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module JournoTest
|
4
|
+
class ReporterTest < TestCase
|
5
|
+
def setup
|
6
|
+
@reporter = Journo::Reporter.new
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'callbacks' do
|
10
|
+
[
|
11
|
+
:before_suites, :after_suite, :before_suite, :after_suite, :before_test,
|
12
|
+
:pass, :skip, :failure, :error
|
13
|
+
].each { |method| assert_respond_to @reporter, method }
|
14
|
+
end
|
15
|
+
|
16
|
+
test '#runner' do
|
17
|
+
assert_kind_of MiniTest::Unit, @reporter.runner
|
18
|
+
end
|
19
|
+
|
20
|
+
test '#output' do
|
21
|
+
assert_equal MiniTest::Unit.output, @reporter.output
|
22
|
+
end
|
23
|
+
|
24
|
+
test '#verbose?' do
|
25
|
+
refute @reporter.verbose?
|
26
|
+
|
27
|
+
begin
|
28
|
+
@reporter.runner.verbose = true
|
29
|
+
assert @reporter.verbose?
|
30
|
+
ensure
|
31
|
+
@reporter.runner.verbose = false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
test '#print' do
|
36
|
+
@reporter.output.expects(:print).with('foo')
|
37
|
+
@reporter.print('foo')
|
38
|
+
end
|
39
|
+
|
40
|
+
test '#puts' do
|
41
|
+
@reporter.output.expects(:puts).with('foo')
|
42
|
+
@reporter.puts('foo')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module JournoTest
|
4
|
+
class SuiteRunnerTest < TestCase
|
5
|
+
def setup
|
6
|
+
@runner = Journo::SuiteRunner.new
|
7
|
+
@reporter = add_reporter
|
8
|
+
end
|
9
|
+
|
10
|
+
test '#report' do
|
11
|
+
assert_equal({}, @runner.report)
|
12
|
+
end
|
13
|
+
|
14
|
+
test '#reporters' do
|
15
|
+
assert_equal [@reporter], @runner.reporters
|
16
|
+
|
17
|
+
reporter2 = add_reporter
|
18
|
+
assert_equal [@reporter, reporter2], @runner.reporters
|
19
|
+
end
|
20
|
+
|
21
|
+
test '#_run_anything with no suites' do
|
22
|
+
stub_suites([])
|
23
|
+
|
24
|
+
@reporter.expects(:before_suites).never
|
25
|
+
@reporter.expects(:after_suites).never
|
26
|
+
|
27
|
+
@runner._run_anything(:test)
|
28
|
+
|
29
|
+
assert_equal 0, @runner.test_count
|
30
|
+
assert_equal 0, @runner.assertion_count
|
31
|
+
assert_instance_of Time, @runner.start_time
|
32
|
+
assert_equal({}, @runner.report)
|
33
|
+
end
|
34
|
+
|
35
|
+
test '#_run_anything with suites' do
|
36
|
+
suites = [Fixtures::PassTestFixture, Fixtures::SkipTestFixture]
|
37
|
+
stub_suites(suites)
|
38
|
+
|
39
|
+
@reporter.expects(:before_suites).with(suites, :test)
|
40
|
+
@reporter.expects(:after_suites).with(suites, :test)
|
41
|
+
|
42
|
+
@runner._run_anything(:test)
|
43
|
+
|
44
|
+
assert_equal 3, @runner.test_count
|
45
|
+
assert_equal 3, @runner.assertion_count
|
46
|
+
assert_instance_of Time, @runner.start_time
|
47
|
+
assert_equal :pass, @runner.report[Fixtures::PassTestFixture][:test_pass].result
|
48
|
+
assert_equal :pass, @runner.report[Fixtures::PassTestFixture][:test_foo].result
|
49
|
+
assert_equal :skip, @runner.report[Fixtures::SkipTestFixture][:test_skip].result
|
50
|
+
end
|
51
|
+
|
52
|
+
test '#_run_anything with a filter' do
|
53
|
+
@runner.options[:filter] = '/foo/'
|
54
|
+
stub_suites([Fixtures::PassTestFixture])
|
55
|
+
|
56
|
+
@runner._run_anything(:test)
|
57
|
+
assert_equal 2, @runner.assertion_count
|
58
|
+
end
|
59
|
+
|
60
|
+
test '#_run_suite without tests' do
|
61
|
+
@reporter.expects(:before_suite).never
|
62
|
+
@reporter.expects(:after_suite).never
|
63
|
+
|
64
|
+
@runner._run_suite(Fixtures::EmptyTestFixture, [])
|
65
|
+
end
|
66
|
+
|
67
|
+
test '#_run_suite with tests' do
|
68
|
+
@reporter.expects(:before_suite).with(Fixtures::PassTestFixture)
|
69
|
+
@reporter.expects(:after_suite).with(Fixtures::PassTestFixture)
|
70
|
+
|
71
|
+
@runner._run_suite(Fixtures::PassTestFixture, [:test_pass, :test_foo])
|
72
|
+
|
73
|
+
assert_equal 3, @runner.assertion_count
|
74
|
+
assert_instance_of Time, @runner.suite_start_time
|
75
|
+
end
|
76
|
+
|
77
|
+
test '#_run_suite with a suite .startup and .shutdown' do
|
78
|
+
suite = Fixtures::SuiteCallbackTestFixture
|
79
|
+
suite.expects(:startup)
|
80
|
+
suite.expects(:shutdown)
|
81
|
+
@runner._run_suite(suite, [:test_foo])
|
82
|
+
end
|
83
|
+
|
84
|
+
test '#_run_test with a passing test' do
|
85
|
+
suite = Fixtures::PassTestFixture
|
86
|
+
test = :test_pass
|
87
|
+
|
88
|
+
@reporter.expects(:before_test).with(suite, test)
|
89
|
+
@reporter.expects(:pass).with(suite, test, instance_of(Journo::TestRunner))
|
90
|
+
|
91
|
+
@runner._run_test(suite, test)
|
92
|
+
|
93
|
+
assert_equal 1, @runner.assertion_count
|
94
|
+
assert_instance_of Time, @runner.test_start_time
|
95
|
+
assert_equal :pass, @runner.report[suite][test].result
|
96
|
+
end
|
97
|
+
|
98
|
+
test '#_run_test with a skipped test' do
|
99
|
+
suite = Fixtures::SkipTestFixture
|
100
|
+
test = :test_skip
|
101
|
+
|
102
|
+
@reporter.expects(:before_test).with(suite, test)
|
103
|
+
@reporter.expects(:skip).with(suite, test, instance_of(Journo::TestRunner))
|
104
|
+
|
105
|
+
@runner._run_test(suite, test)
|
106
|
+
|
107
|
+
assert_equal 0, @runner.assertion_count
|
108
|
+
assert_instance_of Time, @runner.test_start_time
|
109
|
+
assert_equal :skip, @runner.report[suite][test].result
|
110
|
+
end
|
111
|
+
|
112
|
+
test '#_run_test with a failing test' do
|
113
|
+
suite = Fixtures::FailureTestFixture
|
114
|
+
test = :test_failure
|
115
|
+
|
116
|
+
@reporter.expects(:before_test).with(suite, test)
|
117
|
+
@reporter.expects(:failure).with(suite, test, instance_of(Journo::TestRunner))
|
118
|
+
|
119
|
+
@runner._run_test(suite, test)
|
120
|
+
|
121
|
+
assert_equal 0, @runner.assertion_count
|
122
|
+
assert_instance_of Time, @runner.test_start_time
|
123
|
+
assert_equal :failure, @runner.report[suite][test].result
|
124
|
+
end
|
125
|
+
|
126
|
+
test '#_run_test with an error test' do
|
127
|
+
suite = Fixtures::ErrorTestFixture
|
128
|
+
test = :test_error
|
129
|
+
|
130
|
+
@reporter.expects(:before_test).with(suite, test)
|
131
|
+
@reporter.expects(:error).with(suite, test, instance_of(Journo::TestRunner))
|
132
|
+
|
133
|
+
@runner._run_test(suite, test)
|
134
|
+
|
135
|
+
assert_equal 0, @runner.assertion_count
|
136
|
+
assert_instance_of Time, @runner.test_start_time
|
137
|
+
assert_equal :error, @runner.report[suite][test].result
|
138
|
+
end
|
139
|
+
|
140
|
+
test '#trigger' do
|
141
|
+
reporter2 = add_reporter
|
142
|
+
@reporter.expects(:before_suite).with(Fixtures::PassTestFixture)
|
143
|
+
reporter2.expects(:before_suite).with(Fixtures::PassTestFixture)
|
144
|
+
|
145
|
+
@runner.trigger(:before_suite, Fixtures::PassTestFixture)
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
|
150
|
+
def add_reporter
|
151
|
+
reporter = Journo::Reporter.new
|
152
|
+
@runner.reporters << reporter
|
153
|
+
reporter
|
154
|
+
end
|
155
|
+
|
156
|
+
def stub_suites(suites)
|
157
|
+
MiniTest::Unit::TestCase.stubs(:test_suites).returns(suites)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module JournoTest
|
4
|
+
class TestRunnerTest < TestCase
|
5
|
+
def setup
|
6
|
+
@suite = stub
|
7
|
+
@test = :test_foo
|
8
|
+
@runner = Journo::TestRunner.new(@suite, @test)
|
9
|
+
end
|
10
|
+
|
11
|
+
test '#suite' do
|
12
|
+
assert_equal @suite, @runner.suite
|
13
|
+
end
|
14
|
+
|
15
|
+
test '#test' do
|
16
|
+
assert_equal @test, @runner.test
|
17
|
+
end
|
18
|
+
|
19
|
+
test '#run with a passing test' do
|
20
|
+
suite_instance = stub(:_assertions => 3)
|
21
|
+
suite_instance.expects(:run).with(@runner).returns('.')
|
22
|
+
@suite.stubs(:new).with(@test).returns(suite_instance)
|
23
|
+
|
24
|
+
@runner.run
|
25
|
+
|
26
|
+
assert_equal :pass, @runner.result
|
27
|
+
assert_nil @runner.exception
|
28
|
+
assert_equal 3, @runner.assertions
|
29
|
+
end
|
30
|
+
|
31
|
+
test '#run with an skipped test' do
|
32
|
+
error = stub
|
33
|
+
suite_instance = stub(:_assertions => 3)
|
34
|
+
suite_instance.expects(:run).with(@runner).returns([:skip, error])
|
35
|
+
@suite.stubs(:new).with(@test).returns(suite_instance)
|
36
|
+
|
37
|
+
@runner.run
|
38
|
+
|
39
|
+
assert_equal :skip, @runner.result
|
40
|
+
assert_equal error, @runner.exception
|
41
|
+
assert_equal 3, @runner.assertions
|
42
|
+
end
|
43
|
+
|
44
|
+
test '#run with a failing test' do
|
45
|
+
error = stub
|
46
|
+
suite_instance = stub(:_assertions => 3)
|
47
|
+
suite_instance.expects(:run).with(@runner).returns([:failure, error])
|
48
|
+
@suite.stubs(:new).with(@test).returns(suite_instance)
|
49
|
+
|
50
|
+
@runner.run
|
51
|
+
|
52
|
+
assert_equal :failure, @runner.result
|
53
|
+
assert_equal error, @runner.exception
|
54
|
+
assert_equal 3, @runner.assertions
|
55
|
+
end
|
56
|
+
|
57
|
+
test '#run with an errored test' do
|
58
|
+
error = stub
|
59
|
+
suite_instance = stub(:_assertions => 3)
|
60
|
+
suite_instance.expects(:run).with(@runner).returns([:error, error])
|
61
|
+
@suite.stubs(:new).with(@test).returns(suite_instance)
|
62
|
+
|
63
|
+
@runner.run
|
64
|
+
|
65
|
+
assert_equal :error, @runner.result
|
66
|
+
assert_equal error, @runner.exception
|
67
|
+
assert_equal 3, @runner.assertions
|
68
|
+
end
|
69
|
+
|
70
|
+
test '#puke with a skip' do
|
71
|
+
skip = MiniTest::Skip.new
|
72
|
+
result = @runner.puke(@suite, @test, skip)
|
73
|
+
|
74
|
+
assert_equal [:skip, skip], result
|
75
|
+
end
|
76
|
+
|
77
|
+
test '#puke with a failure' do
|
78
|
+
failure = MiniTest::Assertion.new
|
79
|
+
result = @runner.puke(@suite, @test, failure)
|
80
|
+
|
81
|
+
assert_equal [:failure, failure], result
|
82
|
+
end
|
83
|
+
|
84
|
+
test '#puke with an error' do
|
85
|
+
error = RuntimeError.new
|
86
|
+
result = @runner.puke(@suite, @test, error)
|
87
|
+
|
88
|
+
assert_equal [:error, error], result
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module JournoTest
|
2
|
+
module Fixtures
|
3
|
+
class TestCaseFixture
|
4
|
+
attr_writer :_assertions
|
5
|
+
|
6
|
+
def self.test_methods
|
7
|
+
public_instance_methods(true).grep(/^test/)
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(test)
|
11
|
+
@test = test
|
12
|
+
end
|
13
|
+
|
14
|
+
def run(runner)
|
15
|
+
send(@test)
|
16
|
+
'.'
|
17
|
+
rescue MiniTest::Assertion, RuntimeError => e
|
18
|
+
runner.puke(self, @test, e)
|
19
|
+
end
|
20
|
+
|
21
|
+
def skip
|
22
|
+
raise MiniTest::Skip.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def flunk
|
26
|
+
raise MiniTest::Assertion.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def assert(value)
|
30
|
+
self._assertions += 1
|
31
|
+
end
|
32
|
+
|
33
|
+
def _assertions
|
34
|
+
@_assertions ||= 0
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
require 'mocha'
|
4
|
+
require 'test_declarative'
|
5
|
+
require 'journo'
|
6
|
+
|
7
|
+
module JournoTest
|
8
|
+
require File.expand_path('../support/test_case', __FILE__)
|
9
|
+
|
10
|
+
module Fixtures
|
11
|
+
require File.expand_path('../support/fixtures/test_case_fixture', __FILE__)
|
12
|
+
require File.expand_path('../support/fixtures/empty_test_fixture', __FILE__)
|
13
|
+
require File.expand_path('../support/fixtures/error_test_fixture', __FILE__)
|
14
|
+
require File.expand_path('../support/fixtures/failure_test_fixture', __FILE__)
|
15
|
+
require File.expand_path('../support/fixtures/pass_test_fixture', __FILE__)
|
16
|
+
require File.expand_path('../support/fixtures/skip_test_fixture', __FILE__)
|
17
|
+
require File.expand_path('../support/fixtures/suite_callback_test_fixture', __FILE__)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
MiniTest::Unit.runner = Journo::SuiteRunner.new
|
22
|
+
|
23
|
+
# Testing the built-in reporters using automated unit testing would be extremely
|
24
|
+
# brittle. Consequently, there are no unit tests for them. Instead, uncomment
|
25
|
+
# the reporter that you'd like to test and run the full test suite. Make sure to
|
26
|
+
# try them with skipped, failing, and error tests as well!
|
27
|
+
#
|
28
|
+
# Personally, I like the progress reporter. Make sure you don't change that line
|
29
|
+
# when you commit.
|
30
|
+
#
|
31
|
+
# MiniTest::Unit.runner.reporters << Journo::Reporters::DefaultReporter.new
|
32
|
+
# MiniTest::Unit.runner.reporters << Journo::Reporters::SpecReporter.new
|
33
|
+
MiniTest::Unit.runner.reporters << Journo::Reporters::ProgressReporter.new
|
metadata
ADDED
@@ -0,0 +1,160 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: journo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.2.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Alexander Kern
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-05-27 00:00:00 -07:00
|
14
|
+
default_executable:
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: minitest
|
18
|
+
prerelease: false
|
19
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: "2.0"
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: *id001
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ansi
|
29
|
+
prerelease: false
|
30
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: "0"
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: ruby-progressbar
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
42
|
+
none: false
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: mocha
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: "0"
|
58
|
+
type: :development
|
59
|
+
version_requirements: *id004
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: maruku
|
62
|
+
prerelease: false
|
63
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: "0"
|
69
|
+
type: :development
|
70
|
+
version_requirements: *id005
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: test_declarative
|
73
|
+
prerelease: false
|
74
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: "0"
|
80
|
+
type: :development
|
81
|
+
version_requirements: *id006
|
82
|
+
description: Allows you to extend MiniTest using reporters rather than monkey-patching
|
83
|
+
email:
|
84
|
+
- alex@kernul.com
|
85
|
+
executables: []
|
86
|
+
|
87
|
+
extensions: []
|
88
|
+
|
89
|
+
extra_rdoc_files: []
|
90
|
+
|
91
|
+
files:
|
92
|
+
- .gitignore
|
93
|
+
- .travis.yml
|
94
|
+
- .yardopts
|
95
|
+
- Gemfile
|
96
|
+
- LICENSE
|
97
|
+
- README.md
|
98
|
+
- Rakefile
|
99
|
+
- journo.gemspec
|
100
|
+
- lib/journo.rb
|
101
|
+
- lib/journo/reporter.rb
|
102
|
+
- lib/journo/reporters/default_reporter.rb
|
103
|
+
- lib/journo/reporters/progress_reporter.rb
|
104
|
+
- lib/journo/reporters/spec_reporter.rb
|
105
|
+
- lib/journo/suite_runner.rb
|
106
|
+
- lib/journo/test_runner.rb
|
107
|
+
- lib/journo/version.rb
|
108
|
+
- test/journo/reporter_test.rb
|
109
|
+
- test/journo/suite_runner_test.rb
|
110
|
+
- test/journo/test_runner_test.rb
|
111
|
+
- test/support/fixtures/empty_test_fixture.rb
|
112
|
+
- test/support/fixtures/error_test_fixture.rb
|
113
|
+
- test/support/fixtures/failure_test_fixture.rb
|
114
|
+
- test/support/fixtures/pass_test_fixture.rb
|
115
|
+
- test/support/fixtures/skip_test_fixture.rb
|
116
|
+
- test/support/fixtures/suite_callback_test_fixture.rb
|
117
|
+
- test/support/fixtures/test_case_fixture.rb
|
118
|
+
- test/support/test_case.rb
|
119
|
+
- test/test_helper.rb
|
120
|
+
has_rdoc: true
|
121
|
+
homepage: https://github.com/CapnKernul/journo
|
122
|
+
licenses: []
|
123
|
+
|
124
|
+
post_install_message:
|
125
|
+
rdoc_options: []
|
126
|
+
|
127
|
+
require_paths:
|
128
|
+
- lib
|
129
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
130
|
+
none: false
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: "0"
|
135
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
|
+
none: false
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: "0"
|
141
|
+
requirements: []
|
142
|
+
|
143
|
+
rubyforge_project: journo
|
144
|
+
rubygems_version: 1.6.2
|
145
|
+
signing_key:
|
146
|
+
specification_version: 3
|
147
|
+
summary: Reporters for MiniTest
|
148
|
+
test_files:
|
149
|
+
- test/journo/reporter_test.rb
|
150
|
+
- test/journo/suite_runner_test.rb
|
151
|
+
- test/journo/test_runner_test.rb
|
152
|
+
- test/support/fixtures/empty_test_fixture.rb
|
153
|
+
- test/support/fixtures/error_test_fixture.rb
|
154
|
+
- test/support/fixtures/failure_test_fixture.rb
|
155
|
+
- test/support/fixtures/pass_test_fixture.rb
|
156
|
+
- test/support/fixtures/skip_test_fixture.rb
|
157
|
+
- test/support/fixtures/suite_callback_test_fixture.rb
|
158
|
+
- test/support/fixtures/test_case_fixture.rb
|
159
|
+
- test/support/test_case.rb
|
160
|
+
- test/test_helper.rb
|