coverband 6.1.2 → 6.1.4

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +1 -0
  3. data/.rubocop.yml +5 -0
  4. data/README.md +6 -14
  5. data/changes.md +21 -0
  6. data/coverband.gemspec +5 -4
  7. data/lib/coverband/adapters/base.rb +5 -22
  8. data/lib/coverband/adapters/file_store.rb +0 -4
  9. data/lib/coverband/adapters/hash_redis_store.rb +20 -106
  10. data/lib/coverband/adapters/memcached_store.rb +0 -4
  11. data/lib/coverband/adapters/null_store.rb +0 -4
  12. data/lib/coverband/adapters/redis_store.rb +9 -22
  13. data/lib/coverband/adapters/stdout_store.rb +0 -4
  14. data/lib/coverband/collectors/abstract_tracker.rb +7 -2
  15. data/lib/coverband/collectors/coverage.rb +7 -18
  16. data/lib/coverband/collectors/delta.rb +1 -1
  17. data/lib/coverband/collectors/view_tracker.rb +6 -2
  18. data/lib/coverband/configuration.rb +7 -21
  19. data/lib/coverband/integrations/background.rb +2 -0
  20. data/lib/coverband/integrations/sidekiq_swarm.rb +8 -0
  21. data/lib/coverband/reporters/base.rb +2 -2
  22. data/lib/coverband/reporters/console_report.rb +13 -3
  23. data/lib/coverband/reporters/json_report.rb +36 -2
  24. data/lib/coverband/utils/dead_methods.rb +1 -1
  25. data/lib/coverband/utils/html_formatter.rb +18 -1
  26. data/lib/coverband/utils/results.rb +13 -0
  27. data/lib/coverband/utils/source_file.rb +4 -3
  28. data/lib/coverband/utils/tasks.rb +97 -15
  29. data/lib/coverband/version.rb +1 -1
  30. data/lib/coverband.rb +4 -2
  31. data/test/benchmarks/benchmark.rake +0 -1
  32. data/test/coverband/adapters/base_test.rb +1 -4
  33. data/test/coverband/adapters/hash_redis_store_test.rb +0 -51
  34. data/test/coverband/adapters/memecached_store_test.rb +26 -0
  35. data/test/coverband/adapters/redis_store_test.rb +0 -8
  36. data/test/coverband/collectors/coverage_test.rb +0 -42
  37. data/test/coverband/collectors/delta_test.rb +24 -26
  38. data/test/coverband/collectors/route_tracker_test.rb +1 -1
  39. data/test/coverband/collectors/view_tracker_test.rb +17 -4
  40. data/test/coverband/configuration_test.rb +6 -23
  41. data/test/coverband/integrations/resque_worker_test.rb +3 -1
  42. data/test/coverband/reporters/base_test.rb +0 -1
  43. data/test/coverband/reporters/json_test.rb +11 -0
  44. data/test/coverband/reporters/web_test.rb +52 -54
  45. data/test/rails5_dummy/config/coverband.rb +0 -1
  46. data/test/rails5_dummy/config/coverband_missing_redis.rb +0 -1
  47. data/test/test_helper.rb +10 -3
  48. data/views/source_file.erb +1 -1
  49. metadata +35 -18
@@ -4,11 +4,12 @@ require File.expand_path("../../test_helper", File.dirname(__FILE__))
4
4
 
5
5
  class ViewTrackerTest < Minitest::Test
6
6
  def tracker_key
7
- "ViewTracker_tracker"
7
+ "coverband_test_ViewTracker_tracker"
8
8
  end
9
9
 
10
10
  def setup
11
11
  super
12
+ Coverband.configuration.ignore += ["app/views/anything/ignore_me.html.erb"]
12
13
  fake_store.raw_store.del(tracker_key)
13
14
  end
14
15
 
@@ -87,18 +88,30 @@ class ViewTrackerTest < Minitest::Test
87
88
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
88
89
  store = fake_store
89
90
  file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
90
- target = [file_path, "not_used"]
91
+ target = [file_path, "not_used.html.erb"]
91
92
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: "dir", target: target)
92
93
  tracker.track_key(identifier: file_path)
93
94
  tracker.save_report
94
- assert_equal ["not_used"], tracker.unused_keys
95
+ assert_equal ["not_used.html.erb"], tracker.unused_keys
96
+ end
97
+
98
+ test "report hides partials marked in ignore config" do
99
+ Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
100
+ store = fake_store
101
+ file_path = "#{File.expand_path(Coverband.configuration.root)}/app/views/anything/ignore_me.html.erb"
102
+ target = [file_path, "not_used.html.erb"]
103
+ tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: "dir", target: target)
104
+ tracker.track_key(identifier: file_path)
105
+ tracker.save_report
106
+ assert_equal ["not_used.html.erb"], tracker.unused_keys
107
+ assert_equal [], tracker.used_keys.keys
95
108
  end
96
109
 
97
110
  test "reset store" do
98
111
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
99
112
  store = fake_store
100
113
  store.raw_store.expects(:del).with(tracker_key)
101
- store.raw_store.expects(:del).with("ViewTracker_tracker_time")
114
+ store.raw_store.expects(:del).with("#{tracker_key}_time")
102
115
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: "dir")
103
116
  tracker.track_key(identifier: "file")
104
117
  tracker.reset_recordings
@@ -18,7 +18,7 @@ class BaseTest < Minitest::Test
18
18
 
19
19
  test "ignore works with equal" do
20
20
  Coverband::Collectors::Coverage.instance.reset_instance
21
- expected = ["vendor/", ".erb$", ".slim$", "/tmp", "internal:prelude", "db/schema.rb", "config/environments"]
21
+ expected = ["vendor/", "/tmp", "internal:prelude", "db/schema.rb", ".erb$", ".haml$", ".slim$", "config/environments"].map { |str| Regexp.new(str) }
22
22
  assert_equal expected, Coverband.configuration.ignore
23
23
  end
24
24
 
@@ -28,13 +28,14 @@ class BaseTest < Minitest::Test
28
28
  end
29
29
  Coverband::Collectors::Coverage.instance.reset_instance
30
30
  expected = ["vendor/",
31
- ".erb$",
32
- ".slim$",
33
31
  "/tmp",
34
32
  "internal:prelude",
35
33
  "db/schema.rb",
34
+ ".erb$",
35
+ ".haml$",
36
+ ".slim$",
36
37
  "config/environments",
37
- "config/initializers"]
38
+ "config/initializers"].map { |str| Regexp.new(str) }
38
39
  assert_equal expected, Coverband.configuration.ignore
39
40
  end
40
41
 
@@ -44,7 +45,7 @@ class BaseTest < Minitest::Test
44
45
  config.ignore = ["*invalidRegex*"]
45
46
  end
46
47
  Coverband::Collectors::Coverage.instance.reset_instance
47
- expected = Coverband::Configuration::IGNORE_DEFAULTS << "config/environments"
48
+ expected = (Coverband::Configuration::IGNORE_DEFAULTS << "config/environments").map { |str| Regexp.new(str) }
48
49
  assert_equal expected, Coverband.configuration.ignore
49
50
  end
50
51
 
@@ -121,22 +122,4 @@ class BaseTest < Minitest::Test
121
122
  config.redis_url = "redis://localhost:3333"
122
123
  end
123
124
  end
124
-
125
- test "use_oneshot_lines_coverage" do
126
- refute Coverband.configuration.use_oneshot_lines_coverage
127
-
128
- Coverband.configuration.stubs(:one_shot_coverage_implemented_in_ruby_version?).returns(true)
129
- Coverband.configuration.use_oneshot_lines_coverage = true
130
- assert Coverband.configuration.use_oneshot_lines_coverage
131
-
132
- Coverband.configuration.use_oneshot_lines_coverage = false
133
- refute Coverband.configuration.use_oneshot_lines_coverage
134
-
135
- Coverband.configuration.stubs(:one_shot_coverage_implemented_in_ruby_version?).returns(false)
136
- exception = assert_raises Exception do
137
- Coverband.configuration.use_oneshot_lines_coverage = true
138
- end
139
- assert_equal "One shot line coverage is only available in ruby >= 2.6", exception.message
140
- refute Coverband.configuration.use_oneshot_lines_coverage
141
- end
142
125
  end
@@ -45,7 +45,9 @@ class ResqueWorkerTest < Minitest::Test
45
45
  assert_equal 1, report[Coverband::EAGER_TYPE][relative_job_file]["data"][6]
46
46
  else
47
47
  assert_equal 0, report[Coverband::EAGER_TYPE][relative_job_file]["data"][6]
48
- assert_equal 1, report[Coverband::RUNTIME_TYPE][relative_job_file]["data"][6]
48
+ if report[Coverband::RUNTIME_TYPE] && report[Coverband::RUNTIME_TYPE][relative_job_file]
49
+ assert_equal 1, report[Coverband::RUNTIME_TYPE][relative_job_file]["data"][6]
50
+ end
49
51
  end
50
52
  end
51
53
  end
@@ -75,7 +75,6 @@ class ReportsBaseTest < Minitest::Test
75
75
  roots = ['/base/[0-9]*/', '/base/78/app/']
76
76
 
77
77
  Coverband.configuration.stubs(:all_root_paths).returns(roots)
78
- lines_hit = [1, 3, 6]
79
78
  store.stubs(:merged_coverage).returns(coverage)
80
79
  File.expects(:exist?).at_least_once
81
80
  .with('/base/[0-9]*/app/controllers/dashboard_controller.rb')
@@ -45,4 +45,15 @@ class ReportJSONTest < Minitest::Test
45
45
  assert_equal parsed["files"][file].keys, expected_keys
46
46
  end
47
47
  end
48
+
49
+ test "supports merging" do
50
+ @store.send(:save_report, basic_coverage)
51
+ first_report = JSON.parse(Coverband::Reporters::JSONReport.new(@store, for_merged_report: true).report)
52
+
53
+ @store.send(:save_report, increased_basic_coverage)
54
+ second_report = JSON.parse(Coverband::Reporters::JSONReport.new(@store, for_merged_report: true).report)
55
+ data = Coverband::Reporters::JSONReport.new(@store).merge_reports(first_report, second_report)
56
+ assert_equal data[Coverband::RUNTIME_TYPE.to_s]["app_path/dog.rb"]["data"], [0, 4, 10]
57
+ assert_equal data[Coverband::MERGED_TYPE.to_s]["app_path/dog.rb"]["data"], [0, 4, 10]
58
+ end
48
59
  end
@@ -6,75 +6,73 @@ require "rack/test"
6
6
 
7
7
  ENV["RACK_ENV"] = "test"
8
8
 
9
- if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.2.0")
10
- module Coverband
11
- class WebTest < Minitest::Test
12
- include Rack::Test::Methods
9
+ module Coverband
10
+ class WebTest < Minitest::Test
11
+ include Rack::Test::Methods
13
12
 
14
- def app
15
- Coverband::Reporters::Web.new
16
- end
13
+ def app
14
+ Coverband::Reporters::Web.new
15
+ end
17
16
 
18
- def teardown
19
- super
20
- end
17
+ def teardown
18
+ super
19
+ end
21
20
 
22
- test "renders index content" do
23
- get "/"
24
- assert last_response.ok?
25
- assert_match "Coverband Home", last_response.body
26
- end
21
+ test "renders index content" do
22
+ get "/"
23
+ assert last_response.ok?
24
+ assert_match "Coverband Home", last_response.body
25
+ end
27
26
 
28
- test "renders index content for empty path" do
29
- get ""
30
- assert last_response.ok?
31
- assert_match "Coverband Home", last_response.body
32
- end
27
+ test "renders index content for empty path" do
28
+ get ""
29
+ assert last_response.ok?
30
+ assert_match "Coverband Home", last_response.body
31
+ end
33
32
 
34
- test "renders 404" do
35
- get "/show"
36
- assert last_response.not_found?
37
- assert_equal "404 error!", last_response.body
38
- end
33
+ test "renders 404" do
34
+ get "/show"
35
+ assert last_response.not_found?
36
+ assert_equal "404 error!", last_response.body
37
+ end
39
38
 
40
- test "clears coverband" do
41
- post "/clear"
42
- assert_equal 302, last_response.status
43
- end
39
+ test "clears coverband" do
40
+ post "/clear"
41
+ assert_equal 302, last_response.status
44
42
  end
45
43
  end
44
+ end
46
45
 
47
- module Coverband
48
- class AuthWebTest < Minitest::Test
49
- include Rack::Test::Methods
46
+ module Coverband
47
+ class AuthWebTest < Minitest::Test
48
+ include Rack::Test::Methods
50
49
 
51
- def setup
52
- super
53
- @store = Coverband.configuration.store
54
- Coverband.configure do |config|
55
- config.password = "test_pass"
56
- end
50
+ def setup
51
+ super
52
+ @store = Coverband.configuration.store
53
+ Coverband.configure do |config|
54
+ config.password = "test_pass"
57
55
  end
56
+ end
58
57
 
59
- def app
60
- Coverband::Reporters::Web.new
61
- end
58
+ def app
59
+ Coverband::Reporters::Web.new
60
+ end
62
61
 
63
- def teardown
64
- super
65
- end
62
+ def teardown
63
+ super
64
+ end
66
65
 
67
- test "renders index with basic auth" do
68
- basic_authorize "anything", "test_pass"
69
- get "/"
70
- assert last_response.ok?
71
- assert_match "Coverband Home", last_response.body
72
- end
66
+ test "renders index with basic auth" do
67
+ basic_authorize "anything", "test_pass"
68
+ get "/"
69
+ assert last_response.ok?
70
+ assert_match "Coverband Home", last_response.body
71
+ end
73
72
 
74
- test "renders 401 auth error when not provided" do
75
- get "/"
76
- assert_equal 401, last_response.status
77
- end
73
+ test "renders 401 auth error when not provided" do
74
+ get "/"
75
+ assert_equal 401, last_response.status
78
76
  end
79
77
  end
80
78
  end
@@ -12,5 +12,4 @@ Coverband.configure do |config|
12
12
  config.background_reporting_enabled = true
13
13
  config.track_routes = true
14
14
  config.use_oneshot_lines_coverage = true if ENV["ONESHOT"]
15
- config.simulate_oneshot_lines_coverage = true if ENV["SIMULATE_ONESHOT"]
16
15
  end
@@ -11,5 +11,4 @@ Coverband.configure do |config|
11
11
  config.track_gems = true
12
12
  config.gem_details = true
13
13
  config.use_oneshot_lines_coverage = true if ENV["ONESHOT"]
14
- config.simulate_oneshot_lines_coverage = true if ENV["SIMULATE_ONESHOT"]
15
14
  end
data/test/test_helper.rb CHANGED
@@ -40,7 +40,7 @@ require "spy/integration"
40
40
  require_relative "unique_files"
41
41
  $VERBOSE = original_verbosity
42
42
 
43
- unless ENV["ONESHOT"] || ENV["SIMULATE_ONESHOT"] || $SKIP_SIMPLECOV
43
+ unless ENV["ONESHOT"] || $SKIP_SIMPLECOV
44
44
  SimpleCov.formatter = Coveralls::SimpleCov::Formatter
45
45
  SimpleCov.start do
46
46
  add_filter "test/forked"
@@ -89,8 +89,11 @@ TEST_COVERAGE_FILE = "/tmp/fake_file.json"
89
89
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
90
90
  $LOAD_PATH.unshift(File.dirname(__FILE__))
91
91
 
92
- Mocha::Configuration.prevent(:stubbing_method_unnecessarily)
93
- Mocha::Configuration.prevent(:stubbing_non_existent_method)
92
+ Mocha.configure do |c|
93
+ c.stubbing_method_unnecessarily = :prevent
94
+ c.stubbing_method_on_non_mock_object = :allow
95
+ c.stubbing_method_on_nil = :prevent
96
+ end
94
97
 
95
98
  def test(name, &block)
96
99
  test_name = :"test_#{name.gsub(/\s+/, "_")}"
@@ -122,6 +125,10 @@ def basic_coverage
122
125
  {"app_path/dog.rb" => example_line}
123
126
  end
124
127
 
128
+ def increased_basic_coverage
129
+ {"app_path/dog.rb" => [0, 2, 6]}
130
+ end
131
+
125
132
  def basic_coverage_full_path
126
133
  {basic_coverage_file_full_path => example_line}
127
134
  end
@@ -27,7 +27,7 @@
27
27
  <b><%= source_file.lines_of_code %></b> relevant lines.
28
28
  <b><%= result.runtime_relavent_lines(source_file) %></b> runtime relevant lines.
29
29
  <span class="green"><b><%= source_file.covered_lines.count %></b> lines covered</span> and
30
- <span class="red"><b><%= source_file.missed_lines.count %></b> lines missed.</span>
30
+ <span class="<%= missed_lines_css_class(source_file.missed_lines.count) %>"><b><%= source_file.missed_lines.count %></b> lines missed.</span>
31
31
  </div>
32
32
  <div>
33
33
  Coverage first seen: <%= source_file.first_updated_at %>, last activity recorded:
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coverband
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.1.2
4
+ version: 6.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dan Mayer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-04-28 00:00:00.000000000 Z
12
+ date: 2024-10-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: benchmark-ips
@@ -85,16 +85,16 @@ dependencies:
85
85
  name: minitest
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '='
88
+ - - ">="
89
89
  - !ruby/object:Gem::Version
90
- version: 5.18.1
90
+ version: '0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
- version: 5.18.1
97
+ version: '0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: minitest-fork_executor
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -127,16 +127,16 @@ dependencies:
127
127
  name: mocha
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - "~>"
130
+ - - ">="
131
131
  - !ruby/object:Gem::Version
132
- version: 1.7.0
132
+ version: '0'
133
133
  type: :development
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - "~>"
137
+ - - ">="
138
138
  - !ruby/object:Gem::Version
139
- version: 1.7.0
139
+ version: '0'
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: rack
142
142
  requirement: !ruby/object:Gem::Requirement
@@ -197,30 +197,30 @@ dependencies:
197
197
  name: standard
198
198
  requirement: !ruby/object:Gem::Requirement
199
199
  requirements:
200
- - - '='
200
+ - - ">="
201
201
  - !ruby/object:Gem::Version
202
- version: 1.34.0
202
+ version: 1.35.1
203
203
  type: :development
204
204
  prerelease: false
205
205
  version_requirements: !ruby/object:Gem::Requirement
206
206
  requirements:
207
- - - '='
207
+ - - ">="
208
208
  - !ruby/object:Gem::Version
209
- version: 1.34.0
209
+ version: 1.35.1
210
210
  - !ruby/object:Gem::Dependency
211
211
  name: rubocop
212
212
  requirement: !ruby/object:Gem::Requirement
213
213
  requirements:
214
- - - '='
214
+ - - ">="
215
215
  - !ruby/object:Gem::Version
216
- version: 1.60.0
216
+ version: '0'
217
217
  type: :development
218
218
  prerelease: false
219
219
  version_requirements: !ruby/object:Gem::Requirement
220
220
  requirements:
221
- - - '='
221
+ - - ">="
222
222
  - !ruby/object:Gem::Version
223
- version: 1.60.0
223
+ version: '0'
224
224
  - !ruby/object:Gem::Dependency
225
225
  name: coveralls
226
226
  requirement: !ruby/object:Gem::Requirement
@@ -249,6 +249,20 @@ dependencies:
249
249
  - - ">="
250
250
  - !ruby/object:Gem::Version
251
251
  version: '0'
252
+ - !ruby/object:Gem::Dependency
253
+ name: dalli
254
+ requirement: !ruby/object:Gem::Requirement
255
+ requirements:
256
+ - - ">="
257
+ - !ruby/object:Gem::Version
258
+ version: '0'
259
+ type: :development
260
+ prerelease: false
261
+ version_requirements: !ruby/object:Gem::Requirement
262
+ requirements:
263
+ - - ">="
264
+ - !ruby/object:Gem::Version
265
+ version: '0'
252
266
  - !ruby/object:Gem::Dependency
253
267
  name: redis
254
268
  requirement: !ruby/object:Gem::Requirement
@@ -277,6 +291,7 @@ files:
277
291
  - ".github/workflows/main.yml"
278
292
  - ".gitignore"
279
293
  - ".jrubyrc"
294
+ - ".rubocop.yml"
280
295
  - ".standard.yml"
281
296
  - CODE_OF_CONDUCT.md
282
297
  - CONTRIBUTING.md
@@ -317,6 +332,7 @@ files:
317
332
  - lib/coverband/integrations/rack_server_check.rb
318
333
  - lib/coverband/integrations/report_middleware.rb
319
334
  - lib/coverband/integrations/resque.rb
335
+ - lib/coverband/integrations/sidekiq_swarm.rb
320
336
  - lib/coverband/reporters/base.rb
321
337
  - lib/coverband/reporters/console_report.rb
322
338
  - lib/coverband/reporters/html_report.rb
@@ -382,6 +398,7 @@ files:
382
398
  - test/coverband/adapters/base_test.rb
383
399
  - test/coverband/adapters/file_store_test.rb
384
400
  - test/coverband/adapters/hash_redis_store_test.rb
401
+ - test/coverband/adapters/memecached_store_test.rb
385
402
  - test/coverband/adapters/null_store_test.rb
386
403
  - test/coverband/adapters/redis_store_test.rb
387
404
  - test/coverband/adapters/web_service_store_test.rb