minitest-ci 2.4.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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