simplecov 0.4.2 → 0.5.2

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.
Files changed (87) hide show
  1. data/.gitignore +4 -1
  2. data/.rvmrc +1 -1
  3. data/.travis.yml +9 -0
  4. data/CHANGELOG.md +64 -0
  5. data/Gemfile +7 -0
  6. data/README.rdoc +83 -66
  7. data/Rakefile +3 -7
  8. data/cucumber.yml +13 -0
  9. data/features/config_adapters.feature +44 -0
  10. data/features/config_autoload.feature +46 -0
  11. data/features/config_command_name.feature +33 -0
  12. data/features/config_coverage_dir.feature +20 -0
  13. data/features/config_deactivate_merging.feature +42 -0
  14. data/features/config_merge_timeout.feature +38 -0
  15. data/features/config_project_name.feature +27 -0
  16. data/features/config_styles.feature +93 -0
  17. data/features/cucumber_basic.feature +29 -0
  18. data/features/merging_test_unit_and_rspec.feature +44 -0
  19. data/features/rspec_basic.feature +31 -0
  20. data/features/rspec_groups_and_filters_basic.feature +29 -0
  21. data/features/rspec_groups_and_filters_complex.feature +35 -0
  22. data/features/rspec_without_simplecov.feature +20 -0
  23. data/features/step_definitions/html_steps.rb +42 -0
  24. data/features/step_definitions/simplecov_steps.rb +61 -0
  25. data/features/step_definitions/transformers.rb +13 -0
  26. data/features/step_definitions/web_steps.rb +64 -0
  27. data/features/support/env.rb +26 -0
  28. data/features/test_unit_basic.feature +34 -0
  29. data/features/test_unit_groups_and_filters_basic.feature +29 -0
  30. data/features/test_unit_groups_and_filters_complex.feature +35 -0
  31. data/features/test_unit_without_simplecov.feature +20 -0
  32. data/lib/simplecov.rb +15 -30
  33. data/lib/simplecov/adapters.rb +3 -26
  34. data/lib/simplecov/command_guesser.rb +2 -2
  35. data/lib/simplecov/configuration.rb +21 -21
  36. data/lib/simplecov/defaults.rb +48 -0
  37. data/lib/simplecov/file_list.rb +44 -0
  38. data/lib/simplecov/filter.rb +5 -5
  39. data/lib/simplecov/formatter.rb +1 -1
  40. data/lib/simplecov/formatter/simple_formatter.rb +1 -1
  41. data/lib/simplecov/jruby_float_fix.rb +1 -1
  42. data/lib/simplecov/merge_helpers.rb +4 -4
  43. data/lib/simplecov/result.rb +33 -30
  44. data/lib/simplecov/result_merger.rb +30 -13
  45. data/lib/simplecov/source_file.rb +78 -21
  46. data/lib/simplecov/version.rb +1 -1
  47. data/simplecov.gemspec +25 -22
  48. data/test/faked_project/Gemfile +6 -0
  49. data/test/faked_project/Rakefile +8 -0
  50. data/test/faked_project/cucumber.yml +13 -0
  51. data/test/faked_project/features/step_definitions/my_steps.rb +23 -0
  52. data/test/faked_project/features/support/env.rb +12 -0
  53. data/test/faked_project/features/test_stuff.feature +6 -0
  54. data/test/faked_project/lib/faked_project.rb +11 -0
  55. data/test/faked_project/lib/faked_project/framework_specific.rb +18 -0
  56. data/test/faked_project/lib/faked_project/meta_magic.rb +24 -0
  57. data/test/faked_project/lib/faked_project/some_class.rb +29 -0
  58. data/test/faked_project/spec/faked_spec.rb +11 -0
  59. data/test/faked_project/spec/meta_magic_spec.rb +10 -0
  60. data/test/faked_project/spec/some_class_spec.rb +10 -0
  61. data/test/faked_project/spec/spec_helper.rb +15 -0
  62. data/test/faked_project/test/faked_test.rb +11 -0
  63. data/test/faked_project/test/meta_magic_test.rb +13 -0
  64. data/test/faked_project/test/some_class_test.rb +15 -0
  65. data/test/faked_project/test/test_helper.rb +16 -0
  66. data/test/fixtures/app/controllers/sample_controller.rb +2 -2
  67. data/test/fixtures/app/models/user.rb +2 -2
  68. data/test/fixtures/frameworks/rspec_bad.rb +1 -1
  69. data/test/fixtures/frameworks/rspec_good.rb +1 -1
  70. data/test/fixtures/frameworks/testunit_bad.rb +1 -1
  71. data/test/fixtures/frameworks/testunit_good.rb +1 -1
  72. data/test/fixtures/resultset1.rb +1 -1
  73. data/test/fixtures/resultset2.rb +1 -1
  74. data/test/fixtures/sample.rb +8 -2
  75. data/test/helper.rb +17 -4
  76. data/test/shoulda_macros.rb +2 -2
  77. data/test/test_1_8_fallbacks.rb +3 -3
  78. data/test/test_command_guesser.rb +3 -3
  79. data/test/test_file_list.rb +24 -0
  80. data/test/test_filters.rb +18 -13
  81. data/test/test_merge_helpers.rb +23 -23
  82. data/test/test_result.rb +40 -31
  83. data/test/test_return_codes.rb +5 -5
  84. data/test/test_source_file.rb +39 -15
  85. data/test/test_source_file_line.rb +22 -22
  86. metadata +191 -53
  87. data/.document +0 -5
data/lib/simplecov.rb CHANGED
@@ -1,15 +1,13 @@
1
- require 'rubygems'
2
-
3
1
  #
4
2
  # Code coverage for ruby 1.9. Please check out README for a full introduction.
5
3
  #
6
4
  module SimpleCov
7
5
  # Indicates invalid coverage data
8
6
  class CoverageDataError < StandardError; end;
9
-
7
+
10
8
  class << self
11
9
  attr_accessor :running#, :result # TODO: Remove result?
12
-
10
+
13
11
  #
14
12
  # Sets up SimpleCov to run against your project.
15
13
  # You can optionally specify an adapter to use as well as configuration with a block:
@@ -29,7 +27,7 @@ module SimpleCov
29
27
  #
30
28
  def start(adapter=nil, &block)
31
29
  return false unless SimpleCov.usable?
32
-
30
+
33
31
  require 'coverage'
34
32
  load_adapter(adapter) unless adapter.nil?
35
33
  Coverage.start
@@ -37,7 +35,7 @@ module SimpleCov
37
35
  @result = nil
38
36
  self.running = true
39
37
  end
40
-
38
+
41
39
  #
42
40
  # Returns the result for the current coverage run, merging it across test suites
43
41
  # from cache using SimpleCov::ResultMerger if use_merging is activated (default)
@@ -55,7 +53,7 @@ module SimpleCov
55
53
  ensure
56
54
  self.running = false
57
55
  end
58
-
56
+
59
57
  #
60
58
  # Applies the configured filters to the given array of SimpleCov::SourceFile items
61
59
  #
@@ -64,9 +62,9 @@ module SimpleCov
64
62
  filters.each do |filter|
65
63
  result = result.select {|source_file| filter.passes?(source_file) }
66
64
  end
67
- result
65
+ SimpleCov::FileList.new result
68
66
  end
69
-
67
+
70
68
  #
71
69
  # Applies the configured groups to the given array of SimpleCov::SourceFile items
72
70
  #
@@ -74,22 +72,22 @@ module SimpleCov
74
72
  grouped = {}
75
73
  grouped_files = []
76
74
  groups.each do |name, filter|
77
- grouped[name] = files.select {|source_file| !filter.passes?(source_file)}
75
+ grouped[name] = SimpleCov::FileList.new(files.select {|source_file| !filter.passes?(source_file)})
78
76
  grouped_files += grouped[name]
79
77
  end
80
78
  if groups.length > 0 and (other_files = files.reject {|source_file| grouped_files.include?(source_file)}).length > 0
81
- grouped["Ungrouped"] = other_files
79
+ grouped["Ungrouped"] = SimpleCov::FileList.new(other_files)
82
80
  end
83
81
  grouped
84
82
  end
85
-
86
- #
83
+
84
+ #
87
85
  # Applies the adapter of given name on SimpleCov configuration
88
86
  #
89
87
  def load_adapter(name)
90
88
  adapters.load(name)
91
89
  end
92
-
90
+
93
91
  #
94
92
  # Checks whether we're on a proper version of ruby (1.9+) and returns false if this is not the case,
95
93
  # also printing an appropriate warning
@@ -110,6 +108,7 @@ require 'simplecov/configuration'
110
108
  SimpleCov.send :extend, SimpleCov::Configuration
111
109
  require 'simplecov/adapters'
112
110
  require 'simplecov/source_file'
111
+ require 'simplecov/file_list'
113
112
  require 'simplecov/result'
114
113
  require 'simplecov/filter'
115
114
  require 'simplecov/formatter'
@@ -118,19 +117,5 @@ require 'simplecov/result_merger'
118
117
  require 'simplecov/command_guesser'
119
118
  require 'simplecov/version'
120
119
 
121
- # Load formatter gem
122
- require 'simplecov-html'
123
-
124
- # Default configuration
125
- SimpleCov.configure do
126
- formatter SimpleCov::Formatter::HTMLFormatter
127
- # Exclude files outside of SimpleCov.root
128
- load_adapter 'root_filter'
129
- end
130
-
131
- at_exit do
132
- # Store the exit status of the test run since it goes away after calling the at_exit proc...
133
- @exit_status = $!.status if $!.is_a?(SystemExit)
134
- SimpleCov.at_exit.call
135
- exit @exit_status if @exit_status # Force exit with stored status (see github issue #5)
136
- end
120
+ # Load default config
121
+ require 'simplecov/defaults'
@@ -1,12 +1,12 @@
1
1
  #
2
- # Adaptars are glorified SimpleCov configuration procs that can be easily
2
+ # Adapters are glorified SimpleCov configuration procs that can be easily
3
3
  # loaded using SimpleCov.start :rails and defined using
4
4
  # SimpleCov.adapters.define :foo do
5
5
  # # SimpleCov configuration here, same as in SimpleCov.configure
6
6
  # end
7
7
  #
8
8
  class SimpleCov::Adapters < Hash
9
- #
9
+ #
10
10
  # Define a SimpleCov adapter:
11
11
  # SimpleCov.adapters.define 'rails' do
12
12
  # # Same as SimpleCov.configure do .. here
@@ -17,7 +17,7 @@ class SimpleCov::Adapters < Hash
17
17
  raise "SimpleCov Adapter '#{name}' is already defined" unless self[name].nil?
18
18
  self[name] = blk
19
19
  end
20
-
20
+
21
21
  #
22
22
  # Applies the adapter of given name on SimpleCov.configure
23
23
  #
@@ -27,26 +27,3 @@ class SimpleCov::Adapters < Hash
27
27
  SimpleCov.configure(&self[name])
28
28
  end
29
29
  end
30
-
31
- SimpleCov.adapters.define 'root_filter' do
32
- # Exclude all files outside of simplecov root
33
- add_filter do |src|
34
- !(src.filename =~ /^#{SimpleCov.root}/)
35
- end
36
- end
37
-
38
- SimpleCov.adapters.define 'rails' do
39
- add_filter '/test/'
40
- add_filter '/features/'
41
- add_filter '/spec/'
42
- add_filter '/config/'
43
- add_filter '/db/'
44
- add_filter '/autotest/'
45
- add_filter '/vendor/bundle/'
46
-
47
- add_group 'Controllers', 'app/controllers'
48
- add_group 'Models', 'app/models'
49
- add_group 'Helpers', 'app/helpers'
50
- add_group 'Libraries', 'lib'
51
- add_group 'Plugins', 'vendor/plugins'
52
- end
@@ -12,10 +12,10 @@ module SimpleCov::CommandGuesser
12
12
  "Unit Tests"
13
13
  when /cucumber/, /features/
14
14
  "Cucumber Features"
15
- when /#{'spec/'}/
15
+ when /spec/
16
16
  "RSpec"
17
17
  else
18
18
  return command
19
19
  end
20
20
  end
21
- end
21
+ end
@@ -6,7 +6,7 @@ require 'fileutils'
6
6
  #
7
7
  module SimpleCov::Configuration
8
8
  attr_writer :filters, :groups, :formatter
9
-
9
+
10
10
  #
11
11
  # The root for the project. This defaults to the
12
12
  # current working directory.
@@ -17,7 +17,7 @@ module SimpleCov::Configuration
17
17
  return @root if @root and root.nil?
18
18
  @root = File.expand_path(root || Dir.getwd)
19
19
  end
20
-
20
+
21
21
  #
22
22
  # The name of the output and cache directory. Defaults to 'coverage'
23
23
  #
@@ -27,7 +27,7 @@ module SimpleCov::Configuration
27
27
  return @coverage_dir if @coverage_dir and dir.nil?
28
28
  @coverage_dir = (dir || 'coverage')
29
29
  end
30
-
30
+
31
31
  #
32
32
  # Returns the full path to the output directory using SimpleCov.root
33
33
  # and SimpleCov.coverage_dir, so you can adjust this by configuring those
@@ -38,14 +38,14 @@ module SimpleCov::Configuration
38
38
  FileUtils.mkdir_p coverage_path
39
39
  coverage_path
40
40
  end
41
-
42
- #
41
+
42
+ #
43
43
  # Returns the list of configured filters. Add filters using SimpleCov.add_filter.
44
44
  #
45
45
  def filters
46
46
  @filters ||= []
47
47
  end
48
-
48
+
49
49
  # The name of the command (a.k.a. Test Suite) currently running. Used for result
50
50
  # merging and caching. It first tries to make a guess based upon the command line
51
51
  # arguments the current test suite is running on and should automatically detect
@@ -60,7 +60,7 @@ module SimpleCov::Configuration
60
60
  @name ||= SimpleCov::CommandGuesser.guess("#{$0} #{ARGV.join(" ")}")
61
61
  @name
62
62
  end
63
-
63
+
64
64
  #
65
65
  # Gets or sets the configured formatter.
66
66
  #
@@ -72,21 +72,21 @@ module SimpleCov::Configuration
72
72
  raise "No formatter configured. Please specify a formatter using SimpleCov.formatter = SimpleCov::Formatter::SimpleFormatter" unless @formatter
73
73
  @formatter
74
74
  end
75
-
75
+
76
76
  #
77
77
  # Returns the configured groups. Add groups using SimpleCov.add_group
78
78
  #
79
79
  def groups
80
80
  @groups ||= {}
81
81
  end
82
-
82
+
83
83
  #
84
84
  # Returns the hash of available adapters
85
85
  #
86
86
  def adapters
87
87
  @adapters ||= SimpleCov::Adapters.new
88
88
  end
89
-
89
+
90
90
  #
91
91
  # Allows you to configure simplecov in a block instead of prepending SimpleCov to all config methods
92
92
  # you're calling.
@@ -102,7 +102,7 @@ module SimpleCov::Configuration
102
102
  return false unless SimpleCov.usable?
103
103
  instance_exec(&block)
104
104
  end
105
-
105
+
106
106
  #
107
107
  # Gets or sets the behavior to process coverage results.
108
108
  #
@@ -119,7 +119,7 @@ module SimpleCov::Configuration
119
119
  @at_exit = block if block_given?
120
120
  @at_exit ||= Proc.new { SimpleCov.result.format! }
121
121
  end
122
-
122
+
123
123
  #
124
124
  # Returns the project name - currently assuming the last dirname in
125
125
  # the SimpleCov.root is this.
@@ -129,7 +129,7 @@ module SimpleCov::Configuration
129
129
  @project_name = new_name if new_name.kind_of?(String)
130
130
  @project_name ||= File.basename(root.split('/').last).capitalize.gsub('_', ' ')
131
131
  end
132
-
132
+
133
133
  #
134
134
  # Defines whether to use result merging so all your test suites (test:units, test:functionals, cucumber, ...)
135
135
  # are joined and combined into a single coverage report
@@ -138,10 +138,10 @@ module SimpleCov::Configuration
138
138
  @use_merging = use unless use.nil? # Set if param given
139
139
  @use_merging = true if @use_merging != false
140
140
  end
141
-
141
+
142
142
  #
143
143
  # Defines them maximum age (in seconds) of a resultset to still be included in merged results.
144
- # i.e. If you run cucumber features, then later rake test, if the stored cucumber resultset is
144
+ # i.e. If you run cucumber features, then later rake test, if the stored cucumber resultset is
145
145
  # more seconds ago than specified here, it won't be taken into account when merging (and is also
146
146
  # purged from the resultset cache)
147
147
  #
@@ -155,11 +155,11 @@ module SimpleCov::Configuration
155
155
  @merge_timeout = seconds if !seconds.nil? and seconds.kind_of?(Fixnum)
156
156
  @merge_timeout ||= 600
157
157
  end
158
-
158
+
159
159
  #
160
160
  # Add a filter to the processing chain.
161
161
  # There are three ways to define a filter:
162
- #
162
+ #
163
163
  # * as a String that will then be matched against all source files' file paths,
164
164
  # SimpleCov.add_filter 'app/models' # will reject all your models
165
165
  # * as a block which will be passed the source file in question and should either
@@ -173,7 +173,7 @@ module SimpleCov::Configuration
173
173
  def add_filter(filter_argument=nil, &filter_proc)
174
174
  filters << parse_filter(filter_argument, &filter_proc)
175
175
  end
176
-
176
+
177
177
  #
178
178
  # Define a group for files. Works similar to add_filter, only that the first
179
179
  # argument is the desired group name and files PASSING the filter end up in the group
@@ -182,7 +182,7 @@ module SimpleCov::Configuration
182
182
  def add_group(group_name, filter_argument=nil, &filter_proc)
183
183
  groups[group_name] = parse_filter(filter_argument, &filter_proc)
184
184
  end
185
-
185
+
186
186
  #
187
187
  # The actal filter processor. Not meant for direct use
188
188
  #
@@ -195,6 +195,6 @@ module SimpleCov::Configuration
195
195
  SimpleCov::BlockFilter.new(filter_proc)
196
196
  else
197
197
  raise ArgumentError, "Please specify either a string or a block to filter with"
198
- end
198
+ end
199
199
  end
200
- end
200
+ end
@@ -0,0 +1,48 @@
1
+ # Load default formatter gem
2
+ require 'simplecov-html'
3
+
4
+ SimpleCov.adapters.define 'root_filter' do
5
+ # Exclude all files outside of simplecov root
6
+ add_filter do |src|
7
+ !(src.filename =~ /^#{SimpleCov.root}/)
8
+ end
9
+ end
10
+
11
+ SimpleCov.adapters.define 'test_frameworks' do
12
+ add_filter '/test/'
13
+ add_filter '/features/'
14
+ add_filter '/spec/'
15
+ add_filter '/autotest/'
16
+ end
17
+
18
+ SimpleCov.adapters.define 'rails' do
19
+ load_adapter 'test_frameworks'
20
+
21
+ add_filter '/config/'
22
+ add_filter '/db/'
23
+ add_filter '/vendor/bundle/'
24
+
25
+ add_group 'Controllers', 'app/controllers'
26
+ add_group 'Models', 'app/models'
27
+ add_group 'Helpers', 'app/helpers'
28
+ add_group 'Libraries', 'lib'
29
+ add_group 'Plugins', 'vendor/plugins'
30
+ end
31
+
32
+ # Default configuration
33
+ SimpleCov.configure do
34
+ formatter SimpleCov::Formatter::HTMLFormatter
35
+ # Exclude files outside of SimpleCov.root
36
+ load_adapter 'root_filter'
37
+ end
38
+
39
+ at_exit do
40
+ # Store the exit status of the test run since it goes away after calling the at_exit proc...
41
+ @exit_status = $!.status if $!.is_a?(SystemExit)
42
+ SimpleCov.at_exit.call
43
+ exit @exit_status if @exit_status # Force exit with stored status (see github issue #5)
44
+ end
45
+
46
+ # Autoload config from .simplecov if present
47
+ config_path = File.join(SimpleCov.root, '.simplecov')
48
+ load config_path if File.exist?(config_path)
@@ -0,0 +1,44 @@
1
+ # An array of SimpleCov SourceFile instances with additional collection helper
2
+ # methods for calculating coverage across them etc.
3
+ class SimpleCov::FileList < Array
4
+ # Returns the count of lines that have coverage
5
+ def covered_lines
6
+ return 0.0 if empty?
7
+ map {|f| f.covered_lines.count }.inject(&:+)
8
+ end
9
+
10
+ # Returns the count of lines that have been missed
11
+ def missed_lines
12
+ return 0.0 if empty?
13
+ map {|f| f.missed_lines.count }.inject(&:+)
14
+ end
15
+
16
+ # Returns the count of lines that are not relevant for coverage
17
+ def never_lines
18
+ return 0.0 if empty?
19
+ map {|f| f.never_lines.count }.inject(&:+)
20
+ end
21
+
22
+ # Returns the count of skipped lines
23
+ def skipped_lines
24
+ return 0.0 if empty?
25
+ map {|f| f.skipped_lines.count }.inject(&:+)
26
+ end
27
+
28
+ # Returns the overall amount of relevant lines of code across all files in this list
29
+ def lines_of_code
30
+ covered_lines + missed_lines
31
+ end
32
+
33
+ # Computes the coverage based upon lines covered and lines missed
34
+ def covered_percent
35
+ return 100.0 if empty? or lines_of_code == 0
36
+ covered_lines * 100.0 / lines_of_code
37
+ end
38
+
39
+ # Computes the strength (hits / line) based upon lines covered and lines missed
40
+ def covered_strength
41
+ return 0 if empty? or lines_of_code == 0
42
+ map {|f| f.covered_strength }.inject(&:+) / size
43
+ end
44
+ end
@@ -2,7 +2,7 @@ module SimpleCov
2
2
  #
3
3
  # Base filter class. Inherit from this to create custom filters,
4
4
  # and overwrite the passes?(source_file) instance method
5
- #
5
+ #
6
6
  # # A sample class that rejects all source files.
7
7
  # class StupidFilter < SimpleCov::Filter
8
8
  # def passes?(source_file)
@@ -15,12 +15,12 @@ module SimpleCov
15
15
  def initialize(filter_argument)
16
16
  @filter_argument = filter_argument
17
17
  end
18
-
18
+
19
19
  def passes?(source_file)
20
20
  raise "The base filter class is not intended for direct use"
21
21
  end
22
22
  end
23
-
23
+
24
24
  class StringFilter < SimpleCov::Filter
25
25
  # Returns true when the given source file's filename matches the
26
26
  # string configured when initializing this Filter with StringFilter.new('somestring)
@@ -28,7 +28,7 @@ module SimpleCov
28
28
  !(source_file.filename =~ /#{filter_argument}/)
29
29
  end
30
30
  end
31
-
31
+
32
32
  class BlockFilter < SimpleCov::Filter
33
33
  # Returns true if the block given when initializing this filter with BlockFilter.new {|src_file| ... }
34
34
  # returns true for the given source file.
@@ -36,4 +36,4 @@ module SimpleCov
36
36
  !filter_argument.call(source_file)
37
37
  end
38
38
  end
39
- end
39
+ end