simplecov-bamboo 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 80adccfff338182a3a76d33a590497cfe17bd26b
4
+ data.tar.gz: b2b6c96a57103cfd84b82c11f9a23e2ad16d0878
5
+ SHA512:
6
+ metadata.gz: 7af7a6c67ce0d1a5dd21866f86c0377c9ce98890c2b2685605488c6c23a8ce9345a8e51f74b73b03af9914afdd67cdef77c961592ceb3e452c0931b03c465759
7
+ data.tar.gz: e45f82186313ab9642a3a46320948c00f065632d9b21b559e58c6abd02e1a41e0c2b3ee5ff94faded8a687ee4f29962003ed7461e53d14a328745fe9c567fa63
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,27 @@
1
+ .rvmrc
2
+ .bundle
3
+ Gemfile.lock
4
+
5
+ ## MAC OS
6
+ .DS_Store
7
+
8
+ ## TEXTMATE
9
+ *.tmproj
10
+ tmtags
11
+
12
+ ## EMACS
13
+ *~
14
+ \#*
15
+ .\#*
16
+
17
+ ## VIM
18
+ *.swp
19
+
20
+ ## PROJECT::GENERAL
21
+ coverage
22
+ rdoc
23
+ pkg
24
+ .sass-cache
25
+
26
+ ## PROJECT::SPECIFIC
27
+ target
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source :rubygems
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ # Use local copy of simplecov in development when checked out, fetch from git otherwise
7
+ if File.directory?(File.dirname(__FILE__) + '/../simplecov')
8
+ gem 'simplecov', :path => File.dirname(__FILE__) + '/../simplecov'
9
+ else
10
+ gem 'simplecov', :git => 'https://github.com/colszowka/simplecov'
11
+ end
12
+
13
+ gem 'guard-bundler'
14
+ gem 'guard-rake'
15
+ end
@@ -0,0 +1,12 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'bundler' do
5
+ watch('Gemfile')
6
+ # Uncomment next line if Gemfile contain `gemspec' command
7
+ # watch(/^.+\.gemspec/)
8
+ end
9
+
10
+ guard 'rake', :task => 'assets:compile' do
11
+ watch(%r{^assets\/})
12
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010-2011 Christoph Olszowka
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.
@@ -0,0 +1,56 @@
1
+ # Bamboo formatter for SimpleCov
2
+
3
+ ***Note: To learn more about SimpleCov, check out the main repo at https://github.com/colszowka/simplecov***
4
+
5
+ SimpleCov-Bamboo is a result formatter for SimpleCov that helps one to integrate SimpleCov into the [Atlassian
6
+ Bamboo](https://www.atlassian.com/software/bamboo) Continuous Integration Server.
7
+
8
+ The formatter creates a file called *clover.xml* in the coverage directory, which contains a minimal subset of the coverage information generated by clover. It also uses the default HTMLGenerator to generates the HTML Coverage Report to *target/site/clover*, which is the location expected by Bamboo.
9
+
10
+ ## Getting Started
11
+
12
+ 1. Add the SimpleCov-Bamboo gem to test group your Gemfile:
13
+
14
+ gem 'simplecov-bamboo', :require => false,
15
+ :github => "darylrobbins/simplecov-bamboo", :group => "test"
16
+
17
+ Note the :github reference is currently required as this gem is not yet part of the Gem repository.
18
+
19
+ 2. Configure SimpleCov in your test helper:
20
+
21
+ SimpleCov.coverage_dir('target/coverage') # optional
22
+ SimpleCov.formatter = SimpleCov::Formatter::BambooFormatter
23
+
24
+ 3. Configure Bamboo to process Clover coverage information
25
+
26
+ See: https://confluence.atlassian.com/display/BAMBOO/Using+Bamboo+with+Clover
27
+
28
+ On the miscellaneous tab when configuring your build job (not the plan):
29
+
30
+ - Check 'Use Clover to collect Code Coverage for this build.'
31
+ - Select 'Clover is already integrated into this build and a clover.xml file will be produced'
32
+ - Enter your coverage directory into the 'Clover XML Location' field; for example: target/coverage
33
+
34
+ ### Results
35
+
36
+ After the next build, you can now browse your coverage information for the build:
37
+
38
+ - See the Clover tab of the Build Plan Details for coverage and loc trends for the porject; and for a link to the latest coverage report.
39
+ - You can also access the coverage report for a particular build result. Navigate to the build result and select the results for the job, where the coverage report was published. You may need to expand the Tree Navigation bar on the left of the page to select the job results. From the job results, select the Clover tab to view the coverage report.
40
+
41
+ ## Background
42
+
43
+ For code coverage reporting, Bamboo has native support for Clover (Java and Groovy) and NCover (.NET). Unfortunately, there is no native (or plugin support) for displaying Ruby coverage information.
44
+
45
+ I first looked at building a Bamboo plugin to support SimpleCov, but determined it would be much easier to just transform the SimpleCov output to be Clover-like.
46
+
47
+ There is actually on a very small amount of information that is processed by Bamboo directly in the clover.xml results file: total elements, covered elements, and non-comment lines of code (at the entire project level). So, I generate the minimal clover.xml file.
48
+
49
+ The second thing that Bamboo is expecting is an HTML coverage report to be published to target/site/clover, so I also invoke the HTMLFormatter and force it to produce it's output at that location.
50
+
51
+ ## Compatibility
52
+
53
+ I have tested this project with Bamboo 5.0, but it should likely work with earlier versions. Native Clover support has been in-place since Bamboo 2.4.
54
+
55
+ ## Credits
56
+ Code based on SimpleCov/SimpleCov-HTML by Christoph Olszowka. Modified by Daryl Robbins to generate the results expected by Bamboo.
@@ -0,0 +1,32 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ # See https://github.com/colszowka/simplecov/issues/171
5
+ desc "Set permissions on all files so they are compatible with both user-local and system-wide installs"
6
+ task :fix_permissions do
7
+ system 'bash -c "find . -type f -exec chmod 644 {} \; && find . -type d -exec chmod 755 {} \;"'
8
+ end
9
+ # Enforce proper permissions on each build
10
+ Rake::Task[:build].prerequisites.unshift :fix_permissions
11
+
12
+ require 'rake/testtask'
13
+ Rake::TestTask.new(:test) do |test|
14
+ test.libs << 'lib' << 'test'
15
+ test.pattern = 'test/**/test_*.rb'
16
+ test.verbose = true
17
+ end
18
+
19
+ task :default => :test
20
+
21
+ namespace :assets do
22
+ desc "Compiles all assets"
23
+ task :compile do
24
+ puts "Compiling assets"
25
+ require 'sprockets'
26
+ assets = Sprockets::Environment.new
27
+ assets.append_path 'assets/javascripts'
28
+ assets.append_path 'assets/stylesheets'
29
+ assets['application.js'].write_to('public/application.js')
30
+ assets['application.css'].write_to('public/application.css')
31
+ end
32
+ end
@@ -0,0 +1,61 @@
1
+ require 'erb'
2
+ require 'cgi'
3
+ require 'fileutils'
4
+ require 'digest/sha1'
5
+ require 'time'
6
+ require 'nokogiri'
7
+
8
+ # Ensure we are using a compatible version of SimpleCov
9
+ if Gem::Version.new(SimpleCov::VERSION) < Gem::Version.new("0.7.1")
10
+ raise RuntimeError, "The version of SimpleCov you are using is too old. Please update with `gem install simplecov` or `bundle update simplecov`"
11
+ end
12
+
13
+
14
+ class SimpleCov::Formatter::BambooFormatter
15
+
16
+ def format(result)
17
+
18
+ # First, generate HTML report
19
+ BambooHTMLFormatter.new.format(result)
20
+
21
+ # Second, generate the Clover summary report
22
+ generateCloverReport(result)
23
+
24
+ end
25
+
26
+ private
27
+
28
+ class BambooHTMLFormatter < SimpleCov::Formatter::HTMLFormatter
29
+
30
+ def output_path
31
+ "target/site/clover"
32
+ end
33
+
34
+ end
35
+
36
+ def generateCloverReport(result)
37
+
38
+ builder = Nokogiri::XML::Builder.new do
39
+ coverage(generated: Time.now.to_i, clover: "3.1.12") {
40
+ project(timestamp: Time.now.to_i) {
41
+ metrics(elements: result.total_lines, coveredelements: result.covered_lines, ncloc: result.total_lines)
42
+ }
43
+ }
44
+ end
45
+
46
+ File.open(File.join(output_path, "clover.xml"), "w+") do |file|
47
+ file.puts builder.to_xml
48
+ end
49
+
50
+ end
51
+
52
+
53
+ def output_path
54
+ SimpleCov.coverage_path
55
+ end
56
+
57
+ end
58
+
59
+
60
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__)))
61
+ require 'simplecov-bamboo/version'
@@ -0,0 +1,7 @@
1
+ module SimpleCov
2
+ module Formatter
3
+ class BambooFormatter
4
+ VERSION = "0.1.0"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require 'simplecov-bamboo/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "simplecov-bamboo"
7
+ s.version = SimpleCov::Formatter::BambooFormatter::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Daryl Robbins"]
10
+ s.email = ["daryl at robbins dot name"]
11
+ s.homepage = "https://github.com/darylrobbins/simplecov-bamboo"
12
+ s.summary = %Q{SimpleCov/Bamboo Integration}
13
+ s.description = %Q{Integrate SimpleCov results into Atlassian Bamboo CI server}
14
+ s.license = 'MIT'
15
+
16
+ s.rubyforge_project = "simplecov-bamboo"
17
+
18
+ s.add_runtime_dependency 'nokogiri'
19
+ s.add_runtime_dependency 'simplecov'
20
+ s.add_runtime_dependency 'simplecov-html'
21
+
22
+ s.add_development_dependency 'rake'
23
+ s.add_development_dependency 'sprockets'
24
+ s.add_development_dependency 'sass'
25
+
26
+ s.add_development_dependency 'appraisal', '~> 0.5.1'
27
+ s.add_development_dependency 'rspec', '~> 2.13.0'
28
+ s.add_development_dependency 'shoulda', '~> 3.4.0'
29
+
30
+ s.files = `git ls-files`.split("\n")
31
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
32
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
33
+ s.require_paths = ["lib"]
34
+ end
@@ -0,0 +1,10 @@
1
+ # Foo class
2
+ class Foo
3
+ def initialize
4
+ @foo = 'baz'
5
+ end
6
+
7
+ def bar
8
+ @foo
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ # Foo class
2
+ class Foo
3
+ def initialize
4
+ @foo = 'baz'
5
+ end
6
+
7
+ def bar
8
+ @foo
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ # Foo class
2
+ class Foo
3
+ def initialize
4
+ @foo = 'baz'
5
+ end
6
+
7
+ def bar
8
+ @foo
9
+ end
10
+
11
+ #:nocov:
12
+ def skipped
13
+ @foo * 2
14
+ end
15
+ #:nocov:
16
+ end
@@ -0,0 +1,36 @@
1
+ require 'bundler/setup'
2
+ require 'simplecov'
3
+ require 'test/unit'
4
+ require 'shoulda'
5
+
6
+ require 'simplecov-bamboo'
7
+
8
+ SimpleCov.coverage_dir('tmp/coverage')
9
+
10
+ class Test::Unit::TestCase
11
+ def source_fixture(filename)
12
+ File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', filename))
13
+ end
14
+
15
+ # Keep 1.8-rubies from complaining about missing tests in each file that covers only 1.9 functionality
16
+ def default_test
17
+ end
18
+ end
19
+
20
+ require 'shoulda_macros'
21
+ Test::Unit::TestCase.send :extend, ShouldaMacros
22
+
23
+ # Taken from http://stackoverflow.com/questions/4459330/how-do-i-temporarily-redirect-stderr-in-ruby
24
+ require "stringio"
25
+
26
+ def capture_stderr
27
+ # The output stream must be an IO-like object. In this case we capture it in
28
+ # an in-memory IO object so we can return the string value. You can assign any
29
+ # IO object here.
30
+ previous_stderr, $stderr = $stderr, StringIO.new
31
+ yield
32
+ $stderr.string
33
+ ensure
34
+ # Restore the previous value of stderr (typically equal to STDERR).
35
+ $stderr = previous_stderr
36
+ end
@@ -0,0 +1,19 @@
1
+ module ShouldaMacros
2
+ def should_be(boolean_flag)
3
+ should "be #{boolean_flag}" do
4
+ assert_equal true, subject.send(boolean_flag)
5
+ end
6
+ end
7
+
8
+ def should_not_be(boolean_flag)
9
+ should "not be #{boolean_flag}" do
10
+ assert_equal false, subject.send(boolean_flag)
11
+ end
12
+ end
13
+
14
+ def should_have(attr_name, expectation)
15
+ should "have #{attr_name} == #{expectation.inspect}" do
16
+ assert_equal expectation, subject.send(attr_name)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,56 @@
1
+ require 'helper'
2
+
3
+ class TestBambooFormatter < Test::Unit::TestCase
4
+ context "With a (mocked) Coverage.result" do
5
+ setup do
6
+ SimpleCov.filters = []
7
+ SimpleCov.groups = {}
8
+ SimpleCov.formatter = nil
9
+ @original_result = {source_fixture('sample.rb') => [nil, 1, 1, 1, nil, nil, 1, 1, nil, nil],
10
+ source_fixture('app/models/user.rb') => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil],
11
+ source_fixture('app/controllers/sample_controller.rb') => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil]}
12
+ end
13
+
14
+ context "a simple cov result initialized from that" do
15
+ setup { @result = SimpleCov::Result.new(@original_result) }
16
+
17
+ should "have 3 filenames" do
18
+ assert_equal 3, @result.filenames.count
19
+ end
20
+
21
+ should "have 3 source files" do
22
+ assert_equal 3, @result.source_files.count
23
+ assert @result.source_files.all? {|s| s.instance_of?(SimpleCov::SourceFile)}, "Not all instances are of SimpleCov::SourceFile type"
24
+ end
25
+
26
+ should "return an instance of SimpleCov::FileList for source_files and files" do
27
+ assert_equal SimpleCov::FileList, @result.source_files.class
28
+ assert_equal SimpleCov::FileList, @result.files.class
29
+ end
30
+
31
+ should "have files equal to source_files" do
32
+ assert_equal @result.files, @result.source_files
33
+ end
34
+
35
+ should "have accurate covered percent" do
36
+ # in our fixture, there are 13 covered line (result in 1) in all 15 relevant line (result in non-nil)
37
+ assert_equal 100.0*13/15, @result.covered_percent
38
+ end
39
+
40
+ end
41
+
42
+
43
+
44
+ context "and bamboo formatter being used" do
45
+ setup do
46
+ @result = SimpleCov::Result.new(@original_result)
47
+ SimpleCov.formatter = SimpleCov::Formatter::BambooFormatter
48
+ end
49
+
50
+ should "return an array containing formatted string with result.format!" do
51
+ @result.format!
52
+ end
53
+ end
54
+ end
55
+
56
+ end if SimpleCov.usable?
metadata ADDED
@@ -0,0 +1,192 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simplecov-bamboo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Daryl Robbins
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: simplecov
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: simplecov-html
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sprockets
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sass
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: appraisal
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ~>
102
+ - !ruby/object:Gem::Version
103
+ version: 0.5.1
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ~>
109
+ - !ruby/object:Gem::Version
110
+ version: 0.5.1
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 2.13.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: 2.13.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: shoulda
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: 3.4.0
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: 3.4.0
139
+ description: Integrate SimpleCov results into Atlassian Bamboo CI server
140
+ email:
141
+ - daryl at robbins dot name
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - .document
147
+ - .gitignore
148
+ - Gemfile
149
+ - Guardfile
150
+ - LICENSE
151
+ - README.md
152
+ - Rakefile
153
+ - lib/simplecov-bamboo.rb
154
+ - lib/simplecov-bamboo/version.rb
155
+ - simplecov-bamboo.gemspec
156
+ - test/fixtures/app/controllers/sample_controller.rb
157
+ - test/fixtures/app/models/user.rb
158
+ - test/fixtures/sample.rb
159
+ - test/helper.rb
160
+ - test/shoulda_macros.rb
161
+ - test/test_simple_cov-bamboo.rb
162
+ homepage: https://github.com/darylrobbins/simplecov-bamboo
163
+ licenses:
164
+ - MIT
165
+ metadata: {}
166
+ post_install_message:
167
+ rdoc_options: []
168
+ require_paths:
169
+ - lib
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - '>='
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - '>='
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ requirements: []
181
+ rubyforge_project: simplecov-bamboo
182
+ rubygems_version: 2.0.3
183
+ signing_key:
184
+ specification_version: 4
185
+ summary: SimpleCov/Bamboo Integration
186
+ test_files:
187
+ - test/fixtures/app/controllers/sample_controller.rb
188
+ - test/fixtures/app/models/user.rb
189
+ - test/fixtures/sample.rb
190
+ - test/helper.rb
191
+ - test/shoulda_macros.rb
192
+ - test/test_simple_cov-bamboo.rb