coverband 4.0.1 → 4.2.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.
Files changed (90) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +6 -1
  3. data/.travis.yml +8 -2
  4. data/Gemfile +2 -0
  5. data/Gemfile.rails4 +2 -0
  6. data/README.md +135 -157
  7. data/Rakefile +1 -1
  8. data/changes.md +56 -5
  9. data/coverband.gemspec +5 -3
  10. data/lib/coverband/adapters/base.rb +44 -11
  11. data/lib/coverband/adapters/file_store.rb +8 -0
  12. data/lib/coverband/adapters/redis_store.rb +65 -8
  13. data/lib/coverband/at_exit.rb +37 -0
  14. data/lib/coverband/collectors/coverage.rb +43 -72
  15. data/lib/coverband/collectors/delta.rb +67 -0
  16. data/lib/coverband/configuration.rb +71 -2
  17. data/lib/coverband/integrations/background.rb +9 -10
  18. data/lib/coverband/integrations/middleware.rb +3 -2
  19. data/lib/coverband/integrations/rack_server_check.rb +4 -1
  20. data/lib/coverband/integrations/resque.rb +27 -0
  21. data/lib/coverband/reporters/base.rb +24 -36
  22. data/lib/coverband/reporters/html_report.rb +40 -15
  23. data/lib/coverband/reporters/web.rb +52 -10
  24. data/lib/coverband/utils/file_groups.rb +53 -0
  25. data/lib/coverband/utils/file_path_helper.rb +57 -0
  26. data/lib/coverband/utils/gem_list.rb +31 -0
  27. data/lib/coverband/utils/html_formatter.rb +50 -8
  28. data/lib/coverband/utils/railtie.rb +9 -1
  29. data/lib/coverband/utils/result.rb +16 -19
  30. data/lib/coverband/utils/results.rb +63 -0
  31. data/lib/coverband/utils/source_file.rb +23 -1
  32. data/lib/coverband/utils/tasks.rb +17 -17
  33. data/lib/coverband/version.rb +1 -1
  34. data/lib/coverband.rb +32 -2
  35. data/public/application.css +5 -0
  36. data/public/application.js +117 -1640
  37. data/public/dependencies.js +1581 -0
  38. data/public/favicon.png +0 -0
  39. data/test/benchmarks/benchmark.rake +36 -1
  40. data/test/benchmarks/coverage_fork.sh +37 -0
  41. data/test/{unit/adapters_base_test.rb → coverband/adapters/base_test.rb} +1 -1
  42. data/test/{unit/adapters_file_store_test.rb → coverband/adapters/file_store_test.rb} +1 -1
  43. data/test/{unit/adapters_redis_store_test.rb → coverband/adapters/redis_store_test.rb} +28 -11
  44. data/test/coverband/at_exit_test.rb +13 -0
  45. data/test/coverband/collectors/coverage_test.rb +73 -0
  46. data/test/coverband/collectors/delta_test.rb +52 -0
  47. data/test/coverband/configuration_test.rb +67 -0
  48. data/test/{unit → coverband}/coverband_test.rb +7 -0
  49. data/test/coverband/integrations/background_test.rb +31 -0
  50. data/test/{unit → coverband/integrations}/middleware_test.rb +3 -2
  51. data/test/{unit/rack_server_checkout_test.rb → coverband/integrations/rack_server_check_test.rb} +1 -1
  52. data/test/coverband/integrations/resque_worker_test.rb +42 -0
  53. data/test/coverband/integrations/test_resque_job.rb +7 -0
  54. data/test/coverband/reporters/base_test.rb +168 -0
  55. data/test/{unit/reports_console_test.rb → coverband/reporters/console_test.rb} +8 -7
  56. data/test/coverband/reporters/html_test.rb +45 -0
  57. data/test/coverband/reporters/web_test.rb +52 -0
  58. data/test/coverband/utils/file_groups_test.rb +55 -0
  59. data/test/{unit → coverband}/utils/file_list_test.rb +1 -1
  60. data/test/coverband/utils/gem_list_test.rb +48 -0
  61. data/test/{unit → coverband}/utils/source_file_test.rb +1 -1
  62. data/test/{unit → integration}/full_stack_test.rb +25 -12
  63. data/test/{unit → integration}/rails_full_stack_test.rb +27 -7
  64. data/test/rails4_dummy/config/application.rb +1 -1
  65. data/test/rails4_dummy/config/coverband.rb +4 -1
  66. data/test/rails4_dummy/tmp/.keep +0 -0
  67. data/test/rails5_dummy/config/application.rb +1 -1
  68. data/test/rails5_dummy/config/coverband.rb +3 -1
  69. data/test/rails5_dummy/tmp/.keep +0 -0
  70. data/test/rails_test_helper.rb +13 -8
  71. data/test/test_helper.rb +12 -17
  72. data/test/unique_files.rb +23 -0
  73. data/views/file_list.erb +33 -20
  74. data/views/gem_list.erb +54 -0
  75. data/views/layout.erb +13 -4
  76. data/views/settings.erb +35 -0
  77. data/views/source_file.erb +16 -4
  78. data/views/source_file_loader.erb +7 -0
  79. metadata +108 -62
  80. data/test/unit/background_test.rb +0 -29
  81. data/test/unit/collectors_coverage_test.rb +0 -48
  82. data/test/unit/configuration_test.rb +0 -23
  83. data/test/unit/reports_base_test.rb +0 -109
  84. data/test/unit/reports_html_test.rb +0 -29
  85. data/test/unit/reports_web_test.rb +0 -39
  86. /data/test/{unit → coverband}/utils/lines_classifier_test.rb +0 -0
  87. /data/test/{unit → coverband}/utils/result_test.rb +0 -0
  88. /data/test/{unit → coverband}/utils/s3_report_test.rb +0 -0
  89. /data/test/{unit → coverband}/utils/source_file_line_test.rb +0 -0
  90. /data/test/{unit/dog.rb → dog.rb} +0 -0
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ ####
4
+ # A way to access the various coverage data breakdowns
5
+ ####
6
+ module Coverband
7
+ module Utils
8
+ class Results
9
+ attr_accessor :type, :report
10
+
11
+ def initialize(report)
12
+ self.report = report
13
+ self.type = Coverband::MERGED_TYPE
14
+ @results = {}
15
+ end
16
+
17
+ def file_with_type(source_file, results_type)
18
+ return unless get_results(results_type)
19
+
20
+ get_results(results_type).source_files.find { |file| file.filename == source_file.filename }
21
+ end
22
+
23
+ def file_from_path_with_type(full_path, results_type = :merged)
24
+ return unless get_results(results_type)
25
+
26
+ get_results(results_type).source_files.find { |file| file.filename == full_path }
27
+ end
28
+
29
+ def method_missing(method, *args)
30
+ if get_results(type).respond_to?(method)
31
+ get_results(type).send(method, *args)
32
+ else
33
+ super
34
+ end
35
+ end
36
+
37
+ def respond_to_missing?(method)
38
+ if get_results(type).respond_to?(method)
39
+ true
40
+ else
41
+ false
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ ###
48
+ # This is a first version of lazy loading the results
49
+ # for the full advantage we need to push lazy loading to the file level
50
+ # inside Coverband::Utils::Result
51
+ ###
52
+ def get_results(type)
53
+ return nil unless Coverband::ALL_TYPES.include?(type)
54
+
55
+ if @results.key?(type)
56
+ @results[type]
57
+ else
58
+ @results[type] = Coverband::Utils::Result.new(report[type])
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -10,6 +10,7 @@
10
10
  module Coverband
11
11
  module Utils
12
12
  class SourceFile
13
+ include Coverband::Utils::FilePathHelper
13
14
  # Representation of a single line in a source file including
14
15
  # this specific line's source code, line_number and code coverage,
15
16
  # with the coverage being either nil (coverage not applicable, e.g. comment
@@ -133,7 +134,7 @@ module Coverband
133
134
 
134
135
  # Warning to identify condition from Issue #56
135
136
  def coverage_exceeding_source_warn
136
- warn "Warning: coverage data provided by Coverage [#{coverage.size}] exceeds number of lines in #{filename} [#{src.size}]"
137
+ warn "Warning: coverage data from Coverage [#{coverage.size}] exceeds line count in #{filename} [#{src.size}]"
137
138
  end
138
139
 
139
140
  # Access SimpleCov::SourceFile::Line source lines by line number
@@ -210,6 +211,27 @@ module Coverband
210
211
  end
211
212
  end
212
213
 
214
+ # a bug that existed in simplecov was not checking that root
215
+ # was at the start of the file name
216
+ # I had previously patched this in my local Rails app
217
+ def short_name
218
+ filename.sub(/^#{Coverband.configuration.root}/, '.')
219
+ .sub(%r{^.*\/gems}, '.')
220
+ .gsub(%r{^\.\/}, '')
221
+ end
222
+
223
+ def relative_path
224
+ full_path_to_relative(filename)
225
+ end
226
+
227
+ def gem?
228
+ filename =~ %r{^.*\/gems\/}
229
+ end
230
+
231
+ def gem_name
232
+ gem? ? short_name.split('/').first : nil
233
+ end
234
+
213
235
  private
214
236
 
215
237
  # ruby 1.9 could use Float#round(places) instead
@@ -3,27 +3,17 @@
3
3
  namespace :coverband do
4
4
  Coverband.configure
5
5
 
6
- ###
7
- # NOTE: If your project has set many simplecov filters.
8
- # You might want to override them and clear the filters.
9
- # Or run the task `coverage_no_filters` below.
10
- ###
11
- desc 'report runtime Coverband code coverage'
12
- task coverage: :environment do
13
- if Coverband.configuration.reporter == 'scov'
14
- Coverband::Reporters::HTMLReport.report(Coverband.configuration.store)
15
- else
16
- Coverband::Reporters::ConsoleReport.report(Coverband.configuration.store)
17
- end
6
+ def environment
7
+ Rake.application['environment'].invoke if Rake::Task.task_defined?('environment')
18
8
  end
19
9
 
20
- desc 'report runtime coverband code coverage after disabling simplecov filters'
21
- task coverage_no_filters: :environment do
10
+ desc 'report runtime Coverband code coverage'
11
+ task :coverage do
12
+ environment
22
13
  if Coverband.configuration.reporter == 'scov'
23
- clear_simplecov_filters
24
14
  Coverband::Reporters::HTMLReport.report(Coverband.configuration.store)
25
15
  else
26
- puts 'coverage without filters only makes sense for SimpleCov reports'
16
+ Coverband::Reporters::ConsoleReport.report(Coverband.configuration.store)
27
17
  end
28
18
  end
29
19
 
@@ -31,7 +21,17 @@ namespace :coverband do
31
21
  # clear data helpful for development or after configuration issues
32
22
  ###
33
23
  desc 'reset Coverband coverage data, helpful for development, debugging, etc'
34
- task clear: :environment do
24
+ task :clear do
25
+ environment
35
26
  Coverband.configuration.store.clear!
36
27
  end
28
+
29
+ ###
30
+ # clear data helpful for development or after configuration issues
31
+ ###
32
+ desc 'upgrade previous Coverband datastore to latest format'
33
+ task :migrate do
34
+ environment
35
+ Coverband.configuration.store.migrate!
36
+ end
37
37
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Coverband
4
- VERSION = '4.0.1'
4
+ VERSION = '4.2.0'
5
5
  end
data/lib/coverband.rb CHANGED
@@ -3,9 +3,10 @@
3
3
  require 'logger'
4
4
  require 'json'
5
5
  require 'redis'
6
-
7
6
  require 'coverband/version'
7
+ require 'coverband/at_exit'
8
8
  require 'coverband/configuration'
9
+ require 'coverband/utils/file_path_helper'
9
10
  require 'coverband/adapters/base'
10
11
  require 'coverband/adapters/redis_store'
11
12
  require 'coverband/adapters/file_store'
@@ -13,9 +14,11 @@ require 'coverband/utils/s3_report'
13
14
  require 'coverband/utils/html_formatter'
14
15
  require 'coverband/utils/result'
15
16
  require 'coverband/utils/file_list'
17
+ require 'coverband/utils/gem_list'
16
18
  require 'coverband/utils/source_file'
19
+ require 'coverband/utils/file_groups'
17
20
  require 'coverband/utils/lines_classifier'
18
- require 'coverband/utils/railtie' if defined? ::Rails::Railtie
21
+ require 'coverband/utils/results'
19
22
  require 'coverband/collectors/coverage'
20
23
  require 'coverband/reporters/base'
21
24
  require 'coverband/reporters/html_report'
@@ -28,6 +31,11 @@ require 'coverband/integrations/background'
28
31
 
29
32
  module Coverband
30
33
  CONFIG_FILE = './config/coverband.rb'
34
+ RUNTIME_TYPE = nil
35
+ EAGER_TYPE = :eager_loading
36
+ MERGED_TYPE = :merged
37
+ TYPES = [RUNTIME_TYPE, EAGER_TYPE]
38
+ ALL_TYPES = TYPES + [:merged]
31
39
 
32
40
  class << self
33
41
  attr_accessor :configuration_data
@@ -43,6 +51,11 @@ module Coverband
43
51
  else
44
52
  configuration.logger&.debug('using default configuration')
45
53
  end
54
+ coverage.reset_instance
55
+ end
56
+
57
+ def self.report_coverage(force_report = false)
58
+ Coverband::Collectors::Coverage.instance.report_coverage(force_report)
46
59
  end
47
60
 
48
61
  def self.configuration
@@ -51,13 +64,30 @@ module Coverband
51
64
 
52
65
  def self.start
53
66
  Coverband::Collectors::Coverage.instance
67
+ # TODO Railtie sets up at_exit after forks, via middleware, perhaps this hsould be
68
+ # added if not rails or if rails but not rackserverrunning
69
+ AtExit.register
54
70
  Background.start if configuration.background_reporting_enabled && !RackServerCheck.running?
55
71
  end
56
72
 
73
+ def self.eager_loading_coverage!
74
+ coverage.eager_loading!
75
+ end
76
+
77
+ def self.runtime_coverage!
78
+ coverage.runtime!
79
+ end
80
+
81
+ def self.coverage
82
+ Coverband::Collectors::Coverage.instance
83
+ end
84
+
57
85
  unless ENV['COVERBAND_DISABLE_AUTO_START']
58
86
  # Coverband should be setup as early as possible
59
87
  # to capture usage of things loaded by initializers or other Rails engines
60
88
  configure
61
89
  start
90
+ require 'coverband/utils/railtie' if defined? ::Rails::Railtie
91
+ require 'coverband/integrations/resque' if defined? Resque
62
92
  end
63
93
  end
@@ -748,6 +748,11 @@ td {
748
748
  text-align: center;
749
749
  border-radius: 6px; }
750
750
 
751
+ .loader {
752
+ text-align: center;
753
+ }
754
+
755
+
751
756
  #header {
752
757
  color: #FFF;
753
758
  font-size: 12px;