ci_reporter 1.4 → 1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,11 @@
1
+ == 1.5
2
+
3
+ - Support for RSpec 1.1.1 example groups (which broke ci_reporter 1.4)
4
+ - Change internal model to delegation instead of inheritance, allowing ci_reporter to wrap different output formatters
5
+ - Add 'ci:setup:rspecdoc' task to output specdoc format instead of progress
6
+ - Add support for pending examples; they will be listed in the report XML as successful, but the name will have a '(PENDING)' tag appended
7
+ - Support for RSpec < 0.9 removed as promised; use 1.4 if you still need to use an older version of RSpec
8
+
1
9
  == 1.4
2
10
 
3
11
  - Test::Unit tests that fail in multiple places (setup, test method, and teardown) are now tracked (marcog)
data/Rakefile CHANGED
@@ -30,11 +30,15 @@ end
30
30
  # !@#$ no easy way to empty the default list of prerequisites
31
31
  Rake::Task['default'].send :instance_variable_set, "@prerequisites", FileList[]
32
32
 
33
- task :default => :rcov
33
+ # No RCov on JRuby at the moment
34
+ if RUBY_PLATFORM =~ /java/
35
+ task :default => :spec
36
+ else
37
+ task :default => :rcov
38
+ end
34
39
 
35
40
  Spec::Rake::SpecTask.new do |t|
36
- t.spec_opts ||= []
37
- t.spec_opts << "--diff" << "unified"
41
+ t.spec_opts = ["--diff", "unified"]
38
42
  end
39
43
 
40
44
  Spec::Rake::SpecTask.new("spec:rcov") do |t|
@@ -44,7 +48,7 @@ end
44
48
  RCov::VerifyTask.new(:rcov) do |t|
45
49
  # Can't get threshold up to 100 until the RSpec < 1.0 compatibility
46
50
  # code is dropped
47
- t.threshold = 97
51
+ t.threshold = 99
48
52
  t.require_exact_threshold = false
49
53
  end
50
54
  task "spec:rcov" do
@@ -53,6 +57,7 @@ end
53
57
  task :rcov => "spec:rcov"
54
58
 
55
59
  task :generate_output do
60
+ rm_f "acceptance/reports/*.xml"
56
61
  ENV['CI_REPORTS'] = "acceptance/reports"
57
62
  begin
58
63
  `ruby -Ilib acceptance/test_unit_example_test.rb` rescue nil
@@ -4,13 +4,20 @@
4
4
 
5
5
  namespace :ci do
6
6
  namespace :setup do
7
- task :rspec do
7
+ task :spec_report_cleanup do
8
8
  rm_rf ENV["CI_REPORTS"] || "spec/reports"
9
+ end
10
+
11
+ task :rspec => :spec_report_cleanup do
9
12
  spec_opts = ["--require", "#{File.dirname(__FILE__)}/rspec_loader.rb",
10
13
  "--format", "CI::Reporter::RSpec"].join(" ")
11
14
  ENV["SPEC_OPTS"] = "#{ENV['SPEC_OPTS']} #{spec_opts}"
12
- # Pre RSpec 1.0.6
13
- ENV["RSPECOPTS"] = "#{ENV['RSPECOPTS']} #{spec_opts}"
15
+ end
16
+
17
+ task :rspecdoc => :spec_report_cleanup do
18
+ spec_opts = ["--require", "#{File.dirname(__FILE__)}/rspec_loader.rb",
19
+ "--format", "CI::Reporter::RSpecDoc"].join(" ")
20
+ ENV["SPEC_OPTS"] = "#{ENV['SPEC_OPTS']} #{spec_opts}"
14
21
  end
15
22
  end
16
23
  end
@@ -3,13 +3,19 @@
3
3
  # software license details.
4
4
 
5
5
  require 'ci/reporter/core'
6
+ tried_gem = false
6
7
  begin
7
- gem 'rspec'
8
- rescue Gem::LoadError
9
- # Needed for non-gem RSpec (e.g., reporting on RSpec's own specs);
10
- # if spec isn't found, the next require will blow up
8
+ require 'spec'
9
+ require 'spec/runner/formatter/progress_bar_formatter'
10
+ require 'spec/runner/formatter/specdoc_formatter'
11
+ rescue LoadError
12
+ unless tried_gem
13
+ tried_gem = true
14
+ require 'rubygems'
15
+ gem 'rspec'
16
+ retry
17
+ end
11
18
  end
12
- require 'spec'
13
19
 
14
20
  module CI
15
21
  module Reporter
@@ -33,101 +39,78 @@ module CI
33
39
  end
34
40
 
35
41
  # Custom +RSpec+ formatter used to hook into the spec runs and capture results.
36
- class RSpec < Spec::Runner::Formatter::ProgressBarFormatter
37
- def initialize(output, dry_run=false, colour=false, report_mgr=nil)
38
- if respond_to? :dry_run=
39
- super(output)
40
- self.dry_run=dry_run
41
- self.colour=colour
42
- else
43
- super(output, dry_run, colour)
44
- end
45
- @report_manager = report_mgr || ReportManager.new("spec")
42
+ class RSpec < Spec::Runner::Formatter::BaseFormatter
43
+ attr_accessor :report_manager
44
+ attr_accessor :formatter
45
+ def initialize(*args)
46
+ super
47
+ @formatter ||= Spec::Runner::Formatter::ProgressBarFormatter.new(*args)
48
+ @report_manager = ReportManager.new("spec")
46
49
  @suite = nil
47
50
  end
48
51
 
49
- def deprecated
50
- unless @warned
51
- require 'ci/reporter/version'
52
- warn "warning: use of RSpec < 0.9 with CI::Reporter #{CI::Reporter::VERSION} is deprecated;"
53
- warn "a future version will not be compatible."
54
- end
55
- @warned = true
56
- end
57
-
58
52
  def start(spec_count)
59
- super
53
+ @formatter.start(spec_count)
60
54
  end
61
55
 
62
- # Pre-0.9 hook
63
- def add_context(name, first)
64
- super
65
- deprecated
66
- new_suite(name)
67
- end
68
-
69
- # Post-0.9 hook
70
56
  def add_behaviour(name)
71
- super
57
+ @formatter.add_behaviour(name)
72
58
  new_suite(name)
73
59
  end
74
60
 
75
- # Pre-0.9 hook
76
- def spec_started(name)
77
- super
78
- deprecated
79
- case_started(name)
61
+ def add_example_group(example_group)
62
+ @formatter.add_example_group(example_group)
63
+ new_suite(example_group.description)
80
64
  end
81
65
 
82
- # Post-0.9 hook
83
66
  def example_started(name)
84
- super
85
- case_started(name)
86
- end
87
-
88
- # Pre-0.9 hook
89
- def spec_failed(name, counter, failure)
90
- super
91
- deprecated
92
- case_failed(name, counter, failure)
67
+ @formatter.example_started(name)
68
+ spec = TestCase.new name
69
+ @suite.testcases << spec
70
+ spec.start
93
71
  end
94
72
 
95
- # Post-0.9 hook
96
73
  def example_failed(name, counter, failure)
97
- super
98
- case_failed(name, counter, failure)
74
+ @formatter.example_failed(name, counter, failure)
75
+ spec = @suite.testcases.last
76
+ spec.finish
77
+ spec.failures << RSpecFailure.new(failure)
99
78
  end
100
79
 
101
- # Pre-0.9 hook
102
- def spec_passed(name)
103
- super
104
- deprecated
105
- case_passed(name)
80
+ def example_passed(name)
81
+ @formatter.example_passed(name)
82
+ spec = @suite.testcases.last
83
+ spec.finish
106
84
  end
107
85
 
108
- # Post-0.9 hook
109
- def example_passed(name)
110
- super
111
- case_passed(name)
86
+ def example_pending(*args)
87
+ @formatter.example_pending(*args)
88
+ spec = @suite.testcases.last
89
+ spec.finish
90
+ spec.name = "#{spec.name} (PENDING)"
112
91
  end
113
92
 
114
93
  def start_dump
115
- super
94
+ @formatter.start_dump
116
95
  end
117
96
 
118
- def dump_failure(counter, failure)
119
- super
97
+ def dump_failure(*args)
98
+ @formatter.dump_failure(*args)
120
99
  end
121
100
 
122
- def dump_summary(duration, example_count, failure_count, not_implemented_count = 0)
123
- begin
124
- super
125
- rescue ArgumentError
126
- super(duration, example_count, failure_count)
127
- end
101
+ def dump_summary(*args)
102
+ @formatter.dump_summary(*args)
128
103
  write_report
129
104
  end
130
105
 
106
+ def dump_pending
107
+ @formatter.dump_pending
108
+ end
109
+
110
+ def close
111
+ @formatter.close
112
+ end
113
+
131
114
  private
132
115
  def write_report
133
116
  @suite.finish
@@ -139,22 +122,12 @@ module CI
139
122
  @suite = TestSuite.new name
140
123
  @suite.start
141
124
  end
125
+ end
142
126
 
143
- def case_started(name)
144
- spec = TestCase.new name
145
- @suite.testcases << spec
146
- spec.start
147
- end
148
-
149
- def case_failed(name, counter, failure)
150
- spec = @suite.testcases.last
151
- spec.finish
152
- spec.failures << RSpecFailure.new(failure)
153
- end
154
-
155
- def case_passed(name)
156
- spec = @suite.testcases.last
157
- spec.finish
127
+ class RSpecDoc < RSpec
128
+ def initialize(*args)
129
+ @formatter = Spec::Runner::Formatter::SpecdocFormatter.new(*args)
130
+ super
158
131
  end
159
132
  end
160
133
  end
@@ -1,5 +1,5 @@
1
1
  module CI
2
2
  module Reporter
3
- VERSION = "1.4"
3
+ VERSION = "1.5"
4
4
  end
5
5
  end
@@ -59,6 +59,11 @@ describe "ci_reporter ci:setup:rspec task" do
59
59
  @rake["ci:setup:rspec"].invoke
60
60
  ENV["SPEC_OPTS"].should =~ /--require.*rspec_loader.*--format.*CI::Reporter::RSpec/
61
61
  end
62
+
63
+ it "should set ENV['SPEC_OPTS'] to include rspec doc formatter if task is ci:setup:rspecdoc" do
64
+ @rake["ci:setup:rspecdoc"].invoke
65
+ ENV["SPEC_OPTS"].should =~ /--require.*rspec_loader.*--format.*CI::Reporter::RSpecDoc/
66
+ end
62
67
 
63
68
  it "should append to ENV['SPEC_OPTS'] if it already contains a value" do
64
69
  ENV["SPEC_OPTS"] = "somevalue".freeze
@@ -11,30 +11,76 @@ describe "The RSpec reporter" do
11
11
  @error.stub!(:expectation_not_met?).and_return(false)
12
12
  @error.stub!(:pending_fixed?).and_return(false)
13
13
  @report_mgr = mock("report manager")
14
- @fmt = CI::Reporter::RSpec.new(StringIO.new(""), false, false, @report_mgr)
14
+ @options = mock("options")
15
+ @args = [@options, StringIO.new("")]
16
+ @args.shift if Spec::VERSION::MAJOR == 1 && Spec::VERSION::MINOR < 1
17
+ @fmt = CI::Reporter::RSpec.new *@args
18
+ @fmt.report_manager = @report_mgr
19
+ @formatter = mock("formatter")
20
+ @fmt.formatter = @formatter
15
21
  end
16
22
 
17
- it "should create a test suite with one success and one failure" do
23
+ it "should use a progress bar formatter by default" do
24
+ fmt = CI::Reporter::RSpec.new *@args
25
+ fmt.formatter.should be_instance_of(Spec::Runner::Formatter::ProgressBarFormatter)
26
+ end
27
+
28
+ it "should use a specdoc formatter for RSpecDoc" do
29
+ fmt = CI::Reporter::RSpecDoc.new *@args
30
+ fmt.formatter.should be_instance_of(Spec::Runner::Formatter::SpecdocFormatter)
31
+ end
32
+
33
+ it "should create a test suite with one success, one failure, and one pending" do
18
34
  @report_mgr.should_receive(:write_report).and_return do |suite|
19
- suite.testcases.length.should == 2
20
- suite.testcases.first.should_not be_failure
21
- suite.testcases.first.should_not be_error
22
- suite.testcases.last.should be_error
35
+ suite.testcases.length.should == 3
36
+ suite.testcases[0].should_not be_failure
37
+ suite.testcases[0].should_not be_error
38
+ suite.testcases[1].should be_error
39
+ suite.testcases[2].name.should =~ /\(PENDING\)/
23
40
  end
24
41
 
25
- @fmt.start(2)
26
- @fmt.add_behaviour("A context")
42
+ example_group = mock "example group"
43
+ example_group.stub!(:description).and_return "A context"
44
+
45
+ @formatter.should_receive(:start).with(3)
46
+ @formatter.should_receive(:add_example_group).with(example_group)
47
+ @formatter.should_receive(:example_started).exactly(3).times
48
+ @formatter.should_receive(:example_passed).once
49
+ @formatter.should_receive(:example_failed).once
50
+ @formatter.should_receive(:example_pending).once
51
+ @formatter.should_receive(:start_dump).once
52
+ @formatter.should_receive(:dump_failure).once
53
+ @formatter.should_receive(:dump_summary).once
54
+ @formatter.should_receive(:dump_pending).once
55
+ @formatter.should_receive(:close).once
56
+
57
+ @fmt.start(3)
58
+ @fmt.add_example_group(example_group)
27
59
  @fmt.example_started("should pass")
28
60
  @fmt.example_passed("should pass")
29
61
  @fmt.example_started("should fail")
30
62
  @fmt.example_failed("should fail", 1, @error)
31
- @fmt.dump_summary(0.1, 2, 1)
63
+ @fmt.example_started("should be pending")
64
+ @fmt.example_pending("A context", "should be pending", "Not Yet Implemented")
65
+ @fmt.start_dump
66
+ @fmt.dump_failure(1, mock("failure"))
67
+ @fmt.dump_summary(0.1, 3, 1, 1)
68
+ @fmt.dump_pending
69
+ @fmt.close
32
70
  end
33
71
 
34
- it "should report deprecation when called with RSpec < 0.9" do
35
- @fmt.should_receive(:warn).exactly(2).times
36
- @fmt.deprecated
37
- @fmt.deprecated
38
- @fmt.deprecated
72
+ it "should support RSpec 1.0.8 #add_behavior" do
73
+ @formatter.should_receive(:start)
74
+ @formatter.should_receive(:add_behaviour).with("A context")
75
+ @formatter.should_receive(:example_started).once
76
+ @formatter.should_receive(:example_passed).once
77
+ @formatter.should_receive(:dump_summary)
78
+ @report_mgr.should_receive(:write_report)
79
+
80
+ @fmt.start(2)
81
+ @fmt.add_behaviour("A context")
82
+ @fmt.example_started("should pass")
83
+ @fmt.example_passed("should pass")
84
+ @fmt.dump_summary(0.1, 1, 0, 0)
39
85
  end
40
86
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
3
3
  specification_version: 1
4
4
  name: ci_reporter
5
5
  version: !ruby/object:Gem::Version
6
- version: "1.4"
7
- date: 2007-11-23 00:00:00 -06:00
6
+ version: "1.5"
7
+ date: 2008-01-12 00:00:00 -06:00
8
8
  summary: CI::Reporter allows you to generate reams of XML for use with continuous integration systems.
9
9
  require_paths:
10
10
  - lib