minitest-ci 2.4.0 → 3.0.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/History.txt CHANGED
@@ -1,3 +1,22 @@
1
+ === 3.0.0 / 2013-07-03
2
+
3
+ * 1 major enhancement:
4
+
5
+ * Retool to support minitest 5.
6
+
7
+ * 1 bug fix:
8
+
9
+ * Use inspect to correctly escape test/class names. (eentzel) Fixes #8
10
+
11
+ * 5 unknowns:
12
+
13
+ * Add autotest plugin.
14
+ * Add notes to autotest plugin.
15
+ * Update readme to reflect changes.
16
+ * Use Isolate file.
17
+ * Use error label.
18
+
19
+
1
20
  === 2.4.0 / 2012-11-10
2
21
  This release let's people use either 3.x or 4.x as 4.x doesn't break the
3
22
  needed api
data/Isolate ADDED
@@ -0,0 +1,9 @@
1
+ gem 'minitest', '~> 5.0'
2
+
3
+ env :development do
4
+ gem 'nokogiri', '~> 1.5.0'
5
+ gem 'rdoc', '>= 2.4.2'
6
+ gem 'ZenTest'
7
+ end
8
+
9
+ # vim: ft=ruby
data/Manifest.txt CHANGED
@@ -1,7 +1,10 @@
1
1
  .autotest
2
2
  History.txt
3
+ Isolate
3
4
  Manifest.txt
4
5
  README.txt
5
6
  Rakefile
7
+ lib/autotest/minitest_ci.rb
6
8
  lib/minitest/ci.rb
7
- test/test_minitest_ci.rb
9
+ lib/minitest/ci_plugin.rb
10
+ test/minitest/test_ci.rb
data/README.txt CHANGED
@@ -4,13 +4,13 @@
4
4
 
5
5
  == DESCRIPTION:
6
6
 
7
- CI reporter plugin for MiniTest
7
+ CI reporter plugin for Minitest
8
8
 
9
- This gem was made possible by ATT Interactive.
9
+ This gem was made possible by YP.com
10
10
 
11
11
  == FEATURES/PROBLEMS:
12
12
 
13
- * Uses MiniTest::Unit#record which is only available since version 2.12.0
13
+ * Uses Minitest::Reporter which is only available since version 5
14
14
 
15
15
  == SYNOPSIS:
16
16
 
@@ -21,12 +21,12 @@ for example) at the end of the test run. The report directory is cleaned
21
21
  between test runs. To disable:
22
22
 
23
23
  # test/helper.rb
24
- MiniTest::Ci.auto_clean = false
24
+ Minitest::Ci.clean = false
25
25
 
26
26
  # Rakefile (optional, but recommended!)
27
27
  task :ci_cleanup do
28
28
  require 'minitest/ci'
29
- MiniTest::Ci.clean
29
+ Minitest::Ci.new.start
30
30
  end
31
31
  task :test => %w[ci_cleanup test:one test:two]
32
32
 
data/Rakefile CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'hoe'
5
+ require 'isolate/rake'
5
6
 
6
7
  Hoe.plugin :isolate
7
8
  Hoe.plugin :version, :git
@@ -10,11 +11,6 @@ Hoe.spec 'minitest-ci' do
10
11
  developer 'Brian Henderson', 'bhenderson@attinteractive.com'
11
12
 
12
13
  self.testlib = :none
13
-
14
- extra_deps << ['minitest', '>= 3.0', '< 5.0']
15
- extra_dev_deps << ['nokogiri', '~> 1.5.0']
16
- extra_dev_deps << ['rdoc', '>= 2.4.2']
17
- extra_dev_deps << ['ZenTest']
18
14
  end
19
15
 
20
16
  # vim: syntax=ruby
@@ -0,0 +1,26 @@
1
+ ##
2
+ # Plugin for Autotest to ignore MiniTest::Ci report directory.
3
+ #
4
+ # in your .autotest file:
5
+ #
6
+ # require 'autotest/minitest_ci'
7
+ #
8
+ # # optionally:
9
+ # Autotest::MiniTestCI.report_dir = 'some/other/path/to/reports'
10
+ #
11
+ # I think this plugin can do more than what it does now, but not sure yet.
12
+ # Leaving here to think about it more.
13
+ module Autotest::MiniTestCI
14
+ class << self
15
+ attr_accessor :report_dir
16
+ end
17
+ # MiniTest::Ci.report_dir which is configurable in your test suite is not
18
+ # accessible to autotest so we just have to make it duplicated here. If
19
+ # anyone has any good suggestions other than evaling a file etc. I'm open.
20
+ self.report_dir = 'test/reports'
21
+
22
+ # tell autotest to ignore the report directory.
23
+ Autotest.add_hook :initialize do |at|
24
+ at.add_exception Autotest::MiniTestCI.report_dir
25
+ end
26
+ end
data/lib/minitest/ci.rb CHANGED
@@ -1,118 +1,121 @@
1
- gem 'minitest'
2
- require 'minitest/unit'
3
- #unless MiniTest::Unit::VERSION >= '2.12.0'
4
- unless MiniTest::Unit.public_method_defined? :record
5
- abort 'you are running an unsupported version of MiniTest. try upgrading.'
6
- end
7
-
8
1
  require 'fileutils'
9
2
  require 'cgi'
10
3
 
11
- module MiniTest
12
- module Ci
13
-
14
- VERSION = '2.4.0'
4
+ module Minitest
5
+ class Ci < Reporter
15
6
 
16
- @suites = Hash.new {|h,k| h[k] = []}
7
+ VERSION = '3.0.0'
17
8
 
18
9
  class << self
10
+
11
+ ##
19
12
  # Accessor method to change the report dir if you don't like the
20
13
  # defaults.
14
+
21
15
  attr_accessor :report_dir
22
16
 
17
+ ##
23
18
  # Clean the report_dir between test runs? (defaults to true)
24
- attr_accessor :auto_clean
19
+
20
+ attr_accessor :clean
25
21
  end
22
+
26
23
  self.report_dir = 'test/reports'
27
- self.auto_clean = true
24
+ self.clean = true
25
+
26
+ def initialize *args
27
+ super
28
28
 
29
- def push suite, method, num_assertions, time, error
30
- @suites[suite] << [method, num_assertions, time, error]
29
+ self.results = Hash.new {|h,k| h[k] = []}
31
30
  end
32
31
 
33
- def finish io
32
+ def passed?
33
+ true # don't care?
34
+ end
35
+
36
+ def start # clean
37
+ FileUtils.rm_rf report_dir if clean?
38
+ FileUtils.mkdir_p report_dir
39
+ end
40
+
41
+ def record result
42
+ results[result.class] << result
43
+ end
44
+
45
+ def report
34
46
  io.puts
35
47
  io.puts 'generating ci files'
36
48
 
37
- clean
38
-
39
49
  Dir.chdir report_dir do
40
- @suites.each do |name, suite|
41
- generate_suite name, suite
50
+ results.each do |name, resultz|
51
+ File.open "TEST-#{CGI.escape(name.to_s)}.xml", "w" do |f|
52
+ f.puts generate_results name, resultz
53
+ end
42
54
  end
43
55
  end
44
56
  end
45
57
 
46
- def clean verbose = false
47
- FileUtils.rm_rf report_dir, :verbose => verbose if auto_clean
48
- FileUtils.mkdir_p report_dir, :verbose => verbose
49
- end
50
-
51
58
  private
52
59
 
53
60
  def escape o
54
61
  CGI.escapeHTML(o.to_s)
55
62
  end
56
63
 
57
- def generate_suite name, suite
64
+ def generate_results name, results
58
65
  total_time = assertions = errors = failures = skips = 0
59
- suite.each do |_, a, t, e|
60
- total_time += t
61
- assertions += a
62
- case e
63
- when MiniTest::Skip
66
+ results.each do |result|
67
+ total_time += result.time
68
+ assertions += result.assertions
69
+ # p result.failure.class
70
+ case result.failure
71
+ when Skip
64
72
  skips += 1
65
- when MiniTest::Assertion
66
- failures += 1
67
- when Exception
73
+ when UnexpectedError
68
74
  errors += 1
75
+ when Assertion
76
+ failures += 1
69
77
  end
70
78
  end
71
79
 
72
- File.open "TEST-#{CGI.escape(name.to_s)}.xml", "w" do |f|
73
- f.puts '<?xml version="1.0" encoding="UTF-8"?>'
74
- f.puts "<testsuite time='#{"%6f" % total_time}' skipped='#{skips}' failures='#{failures}' errors='#{errors}' name='#{name}' assertions='#{assertions}' tests='#{suite.count}'>"
75
-
76
- suite.each do |method, asserts, time, error|
77
- f.puts " <testcase time='#{"%6f" % time}' name='#{method}' assertions='#{asserts}'>"
78
- if error
79
- bt = MiniTest::filter_backtrace error.backtrace
80
- f.write " <#{type error} type='#{escape error.class}' message=#{escape( error.message ).inspect}>"
81
- f.puts escape bt.join "\n"
82
- f.puts " </#{type error}>"
80
+ xml = []
81
+
82
+ xml << '<?xml version="1.0" encoding="UTF-8"?>'
83
+ xml << "<testsuite time='%6f' skipped='%d' failures='%d' errors='%d' name=%p assertions='%d' tests='%d'>" %
84
+ [total_time, skips, failures, errors, name.to_s, assertions, results.count]
85
+
86
+ results.each do |result|
87
+ xml << " <testcase time='%6f' name=%p assertions='%s'>" %
88
+ [result.time, result.name, result.assertions]
89
+ if failure = result.failure
90
+ label = failure.result_label.downcase
91
+
92
+ if failure.is_a?(UnexpectedError)
93
+ failure = failure.error
83
94
  end
84
- f.puts " </testcase>"
85
- end
86
95
 
87
- f.puts "</testsuite>"
88
- end
89
- end
96
+ klass = failure.class
97
+ msg = failure.message
98
+ bt = Minitest::filter_backtrace failure.backtrace
90
99
 
91
- def type e
92
- case e
93
- when MiniTest::Skip
94
- 'skipped'
95
- else
96
- 'failure'
100
+ xml << " <%s type='%s' message=%s>%s" %
101
+ [label, escape(klass), escape(msg).inspect, escape(bt.join("\n"))]
102
+ xml << " </%s>" % label
103
+ end
104
+ xml << " </testcase>"
97
105
  end
98
- end
99
106
 
100
- extend self
101
- end
107
+ xml << "</testsuite>"
102
108
 
103
- class CiUnit < Unit
109
+ xml
110
+ end
104
111
 
105
- after_tests do
106
- MiniTest::Ci.finish self.output
112
+ def report_dir
113
+ options.fetch(:ci_dir, self.class.report_dir)
107
114
  end
108
115
 
109
- def record suite, method, assertions, time, error
110
- MiniTest::Ci.push suite, method, assertions, time, error
111
- super
116
+ def clean?
117
+ options.fetch(:ci_clean, self.class.clean)
112
118
  end
113
119
 
114
120
  end
115
121
  end
116
-
117
- # use
118
- MiniTest::Unit.runner = MiniTest::CiUnit.new
@@ -0,0 +1,19 @@
1
+ require 'minitest/ci'
2
+
3
+ module Minitest
4
+
5
+ def self.plugin_ci_init options
6
+ self.reporter << Ci.new(options[:io], options)
7
+ end
8
+
9
+ def self.plugin_ci_options opts, options
10
+ opts.on "--ci-dir", "Set the CI report dir. Default to #{Ci.report_dir}" do |dir|
11
+ options[:ci_dir] = dir
12
+ end
13
+
14
+ opts.on "--[no-]ci-clean", "Clean the CI report dir in between test runs. Default #{Ci.clean}" do |clean|
15
+ options[:ci_clean] = clean
16
+ end
17
+ end
18
+
19
+ end
@@ -1,10 +1,11 @@
1
- require "minitest/ci"
2
- require "minitest/spec"
1
+ gem 'minitest'
3
2
  require "minitest/autorun"
3
+ require "minitest/ci"
4
+
4
5
  require 'stringio'
5
6
  require 'nokogiri'
6
7
 
7
- class MockTestSuite < MiniTest::Unit::TestCase
8
+ class MockTestSuite < Minitest::Test
8
9
  def test_raise_error
9
10
  raise 'raise an error'
10
11
  end
@@ -34,36 +35,33 @@ class MockTestSuite < MiniTest::Unit::TestCase
34
35
  end
35
36
  end
36
37
 
37
- SpecWithPunctuation = describe "spec/with::punctuation" do
38
+ SpecWithPunctuation = describe "spec/with::'punctuation'" do
38
39
  it "passes" do
39
40
  pass
40
41
  end
41
42
  end
42
43
 
43
- class TestMinitest
44
- end
44
+ # better way?
45
+ $ci_io = StringIO.new
46
+ Minitest::Ci.clean = false
45
47
 
46
- class TestMinitest::TestCi < MiniTest::Unit::TestCase
47
- @output = StringIO.new
48
- old_out, MiniTest::Unit.output = MiniTest::Unit.output, @output
49
- begin
50
- runner = MiniTest::CiUnit.new
48
+ # setup test files
49
+ reporter = Minitest::Ci.new $ci_io
50
+ reporter.run_and_report do
51
+ Minitest.__run reporter, {}
52
+ end
51
53
 
52
- runner._run_suite MockTestSuite, :test
53
- runner._run_suite SpecWithPunctuation, :test
54
+ Minitest::Runnable.reset
54
55
 
55
- @@test_suites.delete MockTestSuite
56
- MiniTest::Ci.finish runner.output
57
- ensure
58
- MiniTest::Unit.output = old_out
59
- end
56
+ class TestMinitest; end
57
+ class TestMinitest::TestCi < Minitest::Test
60
58
 
61
- def self.output
62
- @output
59
+ def output
60
+ $ci_io
63
61
  end
64
62
 
65
63
  def setup
66
- file = "#{MiniTest::Ci.report_dir}/TEST-MockTestSuite.xml"
64
+ file = "test/reports/TEST-MockTestSuite.xml"
67
65
  @file = File.read file
68
66
  @doc = Nokogiri.parse @file
69
67
  @doc = @doc.at_xpath('/testsuite')
@@ -78,37 +76,51 @@ class TestMinitest::TestCi < MiniTest::Unit::TestCase
78
76
  assert_equal "MockTestSuite", @doc['name']
79
77
  end
80
78
 
81
- def test_testcase
79
+ def test_testcase_count
82
80
  assert_equal 7, @doc.children.count {|c| Nokogiri::XML::Element === c}
83
81
  @doc.children.each do |c|
84
82
  next unless Nokogiri::XML::Element === c
85
83
  assert_equal 'testcase', c.name
86
84
  end
85
+ end
87
86
 
87
+ def test_testcase_passed
88
88
  passed = @doc.at_xpath('/testsuite/testcase[@name="test_pass"]')
89
89
  assert_equal 0, passed.children.count {|c| Nokogiri::XML::Element === c}
90
90
  assert_equal '1', passed['assertions']
91
+ end
91
92
 
93
+ def test_testcase_skipped
92
94
  skipped = @doc.at_xpath('/testsuite/testcase[@name="test_skip_assertion"]')
93
95
  assert_equal 'skip assertion', skipped.at_xpath('skipped')['message']
94
96
  assert_equal '0', skipped['assertions']
97
+ end
95
98
 
99
+ def test_testcase_failures
96
100
  failure = @doc.at_xpath('/testsuite/testcase[@name="test_fail_assertion"]')
97
101
  assert_equal 'fail assertion', failure.at_xpath('failure')['message']
98
102
  assert_equal '1', failure['assertions']
103
+ end
99
104
 
105
+ def test_testcase_errors
100
106
  error = @doc.at_xpath('/testsuite/testcase[@name="test_raise_error"]')
101
- assert_equal 'raise an error', error.at_xpath('failure')['message']
107
+ assert_equal 'raise an error', error.at_xpath('error')['message']
102
108
  assert_equal '0', error['assertions']
109
+ end
103
110
 
111
+ def test_testcase_error_with_invalid_chars
104
112
  error = @doc.at_xpath('/testsuite/testcase[@name="test_invalid_characters_in_message"]')
105
- assert_match( /^#<Object/, error.at_xpath('failure')['message'] )
113
+ assert_match( /^#<Object/, error.at_xpath('error')['message'] )
106
114
  assert_equal '0', error['assertions']
115
+ end
107
116
 
117
+ def test_testcase_error_with_invalid_name
108
118
  error = @doc.at_xpath('/testsuite/testcase[@name="test_invalid_error_name"]')
109
- assert_match( /^#<Class/, error.at_xpath('failure')['message'] )
119
+ assert_match( /^#<Class/, error.at_xpath('error')['message'] )
110
120
  assert_equal '0', error['assertions']
121
+ end
111
122
 
123
+ def test_testcase_error_with_bad_chars
112
124
  error = @doc.at_xpath('/testsuite/testcase[@name="test_escaping_failure_message"]')
113
125
  msg = "failed: doesn't like single or \"double\" quotes or symbols such as <"
114
126
  assert_equal msg, error.at_xpath('failure')['message']
@@ -116,8 +128,9 @@ class TestMinitest::TestCi < MiniTest::Unit::TestCase
116
128
  end
117
129
 
118
130
  def test_output
119
- self.class.output.rewind
120
- assert_match( /generating ci files/, self.class.output.read )
131
+ output.rewind
132
+ expected = "\ngenerating ci files\n"
133
+ assert_equal expected, output.read
121
134
  end
122
135
 
123
136
  def test_filtering_backtraces
@@ -125,8 +138,9 @@ class TestMinitest::TestCi < MiniTest::Unit::TestCase
125
138
  refute_match( /lib\/minitest/, error.inner_text )
126
139
  end
127
140
 
128
- def test_testname
129
- assert File.file?(File.join(MiniTest::Ci.report_dir,
130
- "TEST-spec%2Fwith%3A%3Apunctuation.xml"))
141
+ def test_suitename
142
+ file = File.read "test/reports/TEST-spec%2Fwith%3A%3A%27punctuation%27.xml"
143
+ suite = Nokogiri.parse(file).at_xpath('/testsuite')
144
+ assert_equal "spec/with::'punctuation'", suite['name']
131
145
  end
132
146
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest-ci
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 3.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,17 +9,14 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-11 00:00:00.000000000 Z
12
+ date: 2013-07-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: minitest
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '3.0'
22
- - - <
19
+ - - ~>
23
20
  - !ruby/object:Gem::Version
24
21
  version: '5.0'
25
22
  type: :runtime
@@ -27,20 +24,17 @@ dependencies:
27
24
  version_requirements: !ruby/object:Gem::Requirement
28
25
  none: false
29
26
  requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
32
- version: '3.0'
33
- - - <
27
+ - - ~>
34
28
  - !ruby/object:Gem::Version
35
29
  version: '5.0'
36
30
  - !ruby/object:Gem::Dependency
37
- name: rdoc
31
+ name: nokogiri
38
32
  requirement: !ruby/object:Gem::Requirement
39
33
  none: false
40
34
  requirements:
41
35
  - - ~>
42
36
  - !ruby/object:Gem::Version
43
- version: '3.10'
37
+ version: 1.5.0
44
38
  type: :development
45
39
  prerelease: false
46
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -48,23 +42,23 @@ dependencies:
48
42
  requirements:
49
43
  - - ~>
50
44
  - !ruby/object:Gem::Version
51
- version: '3.10'
45
+ version: 1.5.0
52
46
  - !ruby/object:Gem::Dependency
53
- name: nokogiri
47
+ name: rdoc
54
48
  requirement: !ruby/object:Gem::Requirement
55
49
  none: false
56
50
  requirements:
57
- - - ~>
51
+ - - ! '>='
58
52
  - !ruby/object:Gem::Version
59
- version: 1.5.0
53
+ version: 2.4.2
60
54
  type: :development
61
55
  prerelease: false
62
56
  version_requirements: !ruby/object:Gem::Requirement
63
57
  none: false
64
58
  requirements:
65
- - - ~>
59
+ - - ! '>='
66
60
  - !ruby/object:Gem::Version
67
- version: 1.5.0
61
+ version: 2.4.2
68
62
  - !ruby/object:Gem::Dependency
69
63
  name: ZenTest
70
64
  requirement: !ruby/object:Gem::Requirement
@@ -88,7 +82,7 @@ dependencies:
88
82
  requirements:
89
83
  - - ~>
90
84
  - !ruby/object:Gem::Version
91
- version: '3.0'
85
+ version: '3.5'
92
86
  type: :development
93
87
  prerelease: false
94
88
  version_requirements: !ruby/object:Gem::Requirement
@@ -96,11 +90,11 @@ dependencies:
96
90
  requirements:
97
91
  - - ~>
98
92
  - !ruby/object:Gem::Version
99
- version: '3.0'
100
- description: ! 'CI reporter plugin for MiniTest
93
+ version: '3.5'
94
+ description: ! 'CI reporter plugin for Minitest
101
95
 
102
96
 
103
- This gem was made possible by ATT Interactive.'
97
+ This gem was made possible by YP.com'
104
98
  email:
105
99
  - bhenderson@attinteractive.com
106
100
  executables: []
@@ -112,11 +106,14 @@ extra_rdoc_files:
112
106
  files:
113
107
  - .autotest
114
108
  - History.txt
109
+ - Isolate
115
110
  - Manifest.txt
116
111
  - README.txt
117
112
  - Rakefile
113
+ - lib/autotest/minitest_ci.rb
118
114
  - lib/minitest/ci.rb
119
- - test/test_minitest_ci.rb
115
+ - lib/minitest/ci_plugin.rb
116
+ - test/minitest/test_ci.rb
120
117
  - .gemtest
121
118
  homepage: https://github.com/bhenderson/minitest-ci
122
119
  licenses: []
@@ -140,9 +137,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
137
  version: '0'
141
138
  requirements: []
142
139
  rubyforge_project: minitest-ci
143
- rubygems_version: 1.8.24
140
+ rubygems_version: 1.8.25
144
141
  signing_key:
145
142
  specification_version: 3
146
- summary: CI reporter plugin for MiniTest This gem was made possible by ATT Interactive.
143
+ summary: CI reporter plugin for Minitest This gem was made possible by YP.com
147
144
  test_files:
148
- - test/test_minitest_ci.rb
145
+ - test/minitest/test_ci.rb