coverband 2.0.0 → 2.0.3
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.
- checksums.yaml +5 -5
- data/.gitignore +2 -1
- data/README.md +198 -62
- data/Rakefile +7 -0
- data/changes.md +40 -0
- data/config.ru +4 -0
- data/coverband.gemspec +1 -2
- data/lib/coverband/adapters/memory_cache_store.rb +16 -16
- data/lib/coverband/adapters/redis_store.rb +51 -16
- data/lib/coverband/collectors/base.rb +1 -1
- data/lib/coverband/collectors/coverage.rb +20 -8
- data/lib/coverband/collectors/trace.rb +17 -7
- data/lib/coverband/configuration.rb +31 -6
- data/lib/coverband/reporters/base.rb +2 -2
- data/lib/coverband/reporters/simple_cov_report.rb +6 -1
- data/lib/coverband/reporters/web.rb +152 -0
- data/lib/coverband/s3_report_writer.rb +13 -2
- data/lib/coverband/tasks.rb +0 -46
- data/lib/coverband/version.rb +1 -1
- data/lib/coverband.rb +6 -5
- data/test/benchmarks/benchmark.rake +89 -10
- data/test/test_helper.rb +0 -5
- data/test/unit/adapters_memory_cache_store_test.rb +40 -30
- data/test/unit/adapters_redis_store_test.rb +12 -3
- data/test/unit/collectors_base_test.rb +3 -1
- data/test/unit/collectors_coverage_test.rb +3 -3
- data/test/unit/collectors_trace_test.rb +3 -1
- data/test/unit/reports_console_test.rb +10 -1
- data/test/unit/reports_simple_cov_test.rb +11 -2
- data/test/unit/reports_web_test.rb +37 -0
- data/test/unit/s3_report_writer_test.rb +7 -1
- metadata +7 -26
- data/docs/coverband_details.png +0 -0
- data/docs/coverband_index.png +0 -0
- data/docs/coverband_install.gif +0 -0
- data/lib/coverband/baseline.rb +0 -44
- data/lib/coverband/s3_web.rb +0 -25
- data/test/unit/baseline_test.rb +0 -59
- data/test/unit/s3_web_test.rb +0 -28
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
namespace :benchmarks do
|
|
3
|
-
|
|
4
3
|
# https://github.com/evanphx/benchmark-ips
|
|
5
4
|
# Enable and start GC before each job run. Disable GC afterwards.
|
|
6
5
|
#
|
|
@@ -48,7 +47,7 @@ namespace :benchmarks do
|
|
|
48
47
|
require 'benchmark'
|
|
49
48
|
require 'benchmark/ips'
|
|
50
49
|
|
|
51
|
-
# TODO ok this is interesting and weird
|
|
50
|
+
# TODO: ok this is interesting and weird
|
|
52
51
|
# basically the earlier I require coverage and
|
|
53
52
|
# then require files the larger perf impact
|
|
54
53
|
# this is somewhat expected but can lead to significant perf diffs
|
|
@@ -67,6 +66,16 @@ namespace :benchmarks do
|
|
|
67
66
|
require File.join(File.dirname(__FILE__), 'dog')
|
|
68
67
|
end
|
|
69
68
|
|
|
69
|
+
def benchmark_redis_store
|
|
70
|
+
redis = if ENV['REDIS_TEST_URL']
|
|
71
|
+
Redis.new(url: ENV['REDIS_TEST_URL'])
|
|
72
|
+
else
|
|
73
|
+
Redis.new
|
|
74
|
+
end
|
|
75
|
+
Coverband::Adapters::RedisStore.new(redis,
|
|
76
|
+
redis_namespace: 'coverband_bench')
|
|
77
|
+
end
|
|
78
|
+
|
|
70
79
|
desc 'set up coverband tracepoint Redis'
|
|
71
80
|
task :setup_redis do
|
|
72
81
|
Coverband.configure do |config|
|
|
@@ -76,7 +85,7 @@ namespace :benchmarks do
|
|
|
76
85
|
config.logger = $stdout
|
|
77
86
|
config.collector = 'trace'
|
|
78
87
|
config.memory_caching = ENV['MEMORY_CACHE'] ? true : false
|
|
79
|
-
config.store =
|
|
88
|
+
config.store = benchmark_redis_store
|
|
80
89
|
end
|
|
81
90
|
end
|
|
82
91
|
|
|
@@ -88,7 +97,8 @@ namespace :benchmarks do
|
|
|
88
97
|
config.logger = $stdout
|
|
89
98
|
config.collector = 'trace'
|
|
90
99
|
config.memory_caching = ENV['MEMORY_CACHE'] ? true : false
|
|
91
|
-
|
|
100
|
+
file_path = '/tmp/benchmark_store.json'
|
|
101
|
+
config.store = Coverband::Adapters::FileStore.new(file_path)
|
|
92
102
|
end
|
|
93
103
|
end
|
|
94
104
|
|
|
@@ -104,7 +114,7 @@ namespace :benchmarks do
|
|
|
104
114
|
config.logger = $stdout
|
|
105
115
|
config.collector = 'coverage'
|
|
106
116
|
config.memory_caching = ENV['MEMORY_CACHE'] ? true : false
|
|
107
|
-
config.store =
|
|
117
|
+
config.store = benchmark_redis_store
|
|
108
118
|
end
|
|
109
119
|
end
|
|
110
120
|
|
|
@@ -138,12 +148,12 @@ namespace :benchmarks do
|
|
|
138
148
|
10_000.times { Dog.new.bark }
|
|
139
149
|
end
|
|
140
150
|
|
|
151
|
+
# puts "benchmark for: #{Coverband.configuration.inspect}"
|
|
152
|
+
# puts "store: #{Coverband.configuration.store.inspect}"
|
|
141
153
|
def run_work(hold_work = false)
|
|
142
154
|
suite = GCSuite.new
|
|
143
|
-
#puts "benchmark for: #{Coverband.configuration.inspect}"
|
|
144
|
-
#puts "store: #{Coverband.configuration.store.inspect}"
|
|
145
155
|
Benchmark.ips do |x|
|
|
146
|
-
x.config(:
|
|
156
|
+
x.config(time: 12, warmup: 5, suite: suite)
|
|
147
157
|
x.report 'coverband' do
|
|
148
158
|
Coverband::Collectors::Base.instance.sample do
|
|
149
159
|
work
|
|
@@ -159,6 +169,73 @@ namespace :benchmarks do
|
|
|
159
169
|
Coverband::Collectors::Base.instance.reset_instance
|
|
160
170
|
end
|
|
161
171
|
|
|
172
|
+
def fake_line_numbers
|
|
173
|
+
24.times.each_with_object({}) do |line, line_hash|
|
|
174
|
+
line_hash[(line + 1).to_s] = rand(5)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def fake_report
|
|
179
|
+
2934.times.each_with_object({}) do |file_number, hash|
|
|
180
|
+
hash["file#{file_number + 1}.rb"] = fake_line_numbers
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def adjust_report(report)
|
|
185
|
+
report.keys.each do |file|
|
|
186
|
+
next unless rand < 0.15
|
|
187
|
+
report[file] = fake_line_numbers
|
|
188
|
+
end
|
|
189
|
+
report
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def reporting_speed
|
|
193
|
+
report = fake_report
|
|
194
|
+
store = benchmark_redis_store
|
|
195
|
+
|
|
196
|
+
5.times { store.save_report(report) }
|
|
197
|
+
Benchmark.ips do |x|
|
|
198
|
+
x.config(time: 15, warmup: 5)
|
|
199
|
+
x.report('store_reports') { store.save_report(report) }
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def reporting_memorycache_speed
|
|
204
|
+
report = fake_report
|
|
205
|
+
redis_store = benchmark_redis_store
|
|
206
|
+
cache_store = Coverband::Adapters::MemoryCacheStore.new(redis_store)
|
|
207
|
+
|
|
208
|
+
5.times do
|
|
209
|
+
redis_store.save_report(report)
|
|
210
|
+
cache_store.save_report(report)
|
|
211
|
+
adjust_report(report)
|
|
212
|
+
end
|
|
213
|
+
Benchmark.ips do |x|
|
|
214
|
+
x.config(time: 15, warmup: 5)
|
|
215
|
+
x.report('store_redis_reports') do
|
|
216
|
+
redis_store.save_report(report)
|
|
217
|
+
adjust_report(report)
|
|
218
|
+
end
|
|
219
|
+
x.report('store_cache_reports') do
|
|
220
|
+
cache_store.save_report(report)
|
|
221
|
+
adjust_report(report)
|
|
222
|
+
end
|
|
223
|
+
x.compare!
|
|
224
|
+
end
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
desc 'runs benchmarks on reporting large sets of files to redis'
|
|
228
|
+
task redis_reporting: [:setup] do
|
|
229
|
+
puts 'runs benchmarks on reporting large sets of files to redis'
|
|
230
|
+
reporting_speed
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
desc 'benchmarks: reporting large sets of files to redis using memory cache'
|
|
234
|
+
task cache_reporting: [:setup] do
|
|
235
|
+
puts 'benchmarks: reporting large sets of files to redis using memory cache'
|
|
236
|
+
reporting_memorycache_speed
|
|
237
|
+
end
|
|
238
|
+
|
|
162
239
|
desc 'runs benchmarks on default redis setup'
|
|
163
240
|
task run_redis: [:setup, :setup_redis] do
|
|
164
241
|
puts 'Coverband tracepoint configured with default Redis store'
|
|
@@ -179,11 +256,13 @@ namespace :benchmarks do
|
|
|
179
256
|
|
|
180
257
|
desc 'compare Coverband Ruby Coverage with normal Ruby'
|
|
181
258
|
task :compare_coverage do
|
|
182
|
-
puts 'comparing
|
|
259
|
+
puts 'comparing Coverage loaded/not, this takes some time for output...'
|
|
183
260
|
puts `COVERAGE=true rake benchmarks:run_coverage`
|
|
184
261
|
puts `rake benchmarks:run_coverage`
|
|
185
262
|
end
|
|
186
263
|
end
|
|
187
264
|
|
|
188
265
|
desc 'runs benchmarks'
|
|
189
|
-
task benchmarks: ['benchmarks:run_file',
|
|
266
|
+
task benchmarks: ['benchmarks:run_file',
|
|
267
|
+
'benchmarks:run_redis',
|
|
268
|
+
'benchmarks:compare_coverage']
|
data/test/test_helper.rb
CHANGED
|
@@ -5,52 +5,62 @@ require File.expand_path('../test_helper', File.dirname(__FILE__))
|
|
|
5
5
|
module Coverband
|
|
6
6
|
class MemoryCacheStoreTest < Test::Unit::TestCase
|
|
7
7
|
def setup
|
|
8
|
-
Adapters::MemoryCacheStore.
|
|
9
|
-
@
|
|
8
|
+
Adapters::MemoryCacheStore.clear!
|
|
9
|
+
@redis = Redis.new
|
|
10
|
+
@store = Coverband::Adapters::RedisStore.new(@redis)
|
|
11
|
+
@store.clear!
|
|
10
12
|
@memory_store = Adapters::MemoryCacheStore.new(@store)
|
|
11
13
|
end
|
|
12
14
|
|
|
13
|
-
def data
|
|
14
|
-
{
|
|
15
|
-
'file1' => { 3 => 1, 5 => 2 },
|
|
16
|
-
'file2' => { 1 => 1, 2 => 1 }
|
|
17
|
-
}
|
|
18
|
-
end
|
|
19
|
-
|
|
20
15
|
test 'it passes data into store' do
|
|
16
|
+
data = {
|
|
17
|
+
'file1' => { 1 => 0, 2 => 1, 3 => 0 },
|
|
18
|
+
'file2' => { 1 => 5, 2 => 2 }
|
|
19
|
+
}
|
|
21
20
|
@store.expects(:save_report).with data
|
|
22
|
-
@store.expects(:covered_lines_for_file).with('file1').returns []
|
|
23
|
-
@store.expects(:covered_lines_for_file).with('file2').returns []
|
|
24
21
|
@memory_store.save_report data
|
|
25
22
|
end
|
|
26
23
|
|
|
27
|
-
|
|
24
|
+
|
|
25
|
+
test 'it filters coverage with same exact data' do
|
|
26
|
+
data = {
|
|
27
|
+
'file1' => { 1 => 0, 2 => 1, 3 => 0 },
|
|
28
|
+
'file2' => { 1 => 5, 2 => 2 }
|
|
29
|
+
}
|
|
28
30
|
@store.expects(:save_report).once.with data
|
|
29
|
-
@store.expects(:covered_lines_for_file).with('file1').returns []
|
|
30
|
-
@store.expects(:covered_lines_for_file).with('file2').returns []
|
|
31
31
|
2.times { @memory_store.save_report data }
|
|
32
32
|
end
|
|
33
|
+
|
|
34
|
+
test 'it filters coverage for files with same exact data' do
|
|
35
|
+
|
|
36
|
+
report_first_request = {
|
|
37
|
+
'file1' => { 1 => 0, 2 => 1, 3 => 0 },
|
|
38
|
+
'file2' => { 1 => 5, 2 => 2 }
|
|
39
|
+
}
|
|
33
40
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
'
|
|
37
|
-
'file2' => { 1 => 1, 2 => 1 }
|
|
41
|
+
report_second_request = {
|
|
42
|
+
'file1' => { 1 => 0, 2 => 1, 3 => 0 },
|
|
43
|
+
'file2' => { 1 => 5, 2 => 3 }
|
|
38
44
|
}
|
|
39
|
-
@store.expects(:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
@memory_store.save_report
|
|
45
|
+
@store.expects(:save_report).with({
|
|
46
|
+
'file1' => { 1 => 0, 2 => 1, 3 => 0 },
|
|
47
|
+
'file2' => { 1 => 5, 2 => 2 }
|
|
48
|
+
})
|
|
49
|
+
@store.expects(:save_report).with({
|
|
50
|
+
'file2' => { 1 => 5, 2 => 3 }
|
|
51
|
+
})
|
|
52
|
+
@memory_store.save_report(report_first_request)
|
|
53
|
+
@memory_store.save_report(report_second_request)
|
|
47
54
|
end
|
|
48
55
|
|
|
49
56
|
test 'it initializes cache with what is in store' do
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
57
|
+
data = {
|
|
58
|
+
'file1' => { 1 => 0, 2 => 1, 3 => 0 },
|
|
59
|
+
'file2' => { 1 => 5, 2 => 2 }
|
|
60
|
+
}
|
|
61
|
+
Coverband::Adapters::RedisStore.new(@redis).save_report(data)
|
|
62
|
+
@store.expects(:save_report).never
|
|
63
|
+
@memory_store.save_report(data)
|
|
54
64
|
end
|
|
55
65
|
end
|
|
56
66
|
end
|
|
@@ -17,13 +17,13 @@ class RedisTest < Test::Unit::TestCase
|
|
|
17
17
|
|
|
18
18
|
def test_coverage
|
|
19
19
|
@redis.sadd(BASE_KEY, 'dog.rb')
|
|
20
|
-
@store.send(:
|
|
21
|
-
expected = {
|
|
20
|
+
@store.send(:pipelined_save, combined_report)
|
|
21
|
+
expected = {'dog.rb' => example_hash}
|
|
22
22
|
assert_equal expected, @store.coverage
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def test_covered_lines_for_file
|
|
26
|
-
@store.send(:
|
|
26
|
+
@store.send(:pipelined_save, combined_report)
|
|
27
27
|
assert_equal [["1", "1"], ["2", "2"]], @store.covered_lines_for_file('dog.rb').sort
|
|
28
28
|
end
|
|
29
29
|
|
|
@@ -47,6 +47,15 @@ class RedisTest < Test::Unit::TestCase
|
|
|
47
47
|
|
|
48
48
|
private
|
|
49
49
|
|
|
50
|
+
def combined_report
|
|
51
|
+
{
|
|
52
|
+
"#{BASE_KEY}.dog.rb" => {
|
|
53
|
+
new: example_hash,
|
|
54
|
+
existing: {}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
end
|
|
58
|
+
|
|
50
59
|
def test_data
|
|
51
60
|
{
|
|
52
61
|
'/Users/danmayer/projects/cover_band_server/app.rb' => { 54 => 1, 55 => 2 },
|
|
@@ -49,6 +49,7 @@ class CollectorsBaseTest < Test::Unit::TestCase
|
|
|
49
49
|
coverband.instance_variable_set('@store', nil)
|
|
50
50
|
assert_equal false, coverband.instance_variable_get('@enabled')
|
|
51
51
|
logger.expects(:info).at_least_once
|
|
52
|
+
logger.stubs('debug')
|
|
52
53
|
coverband.sample { 1 + 1 }
|
|
53
54
|
assert_equal true, coverband.instance_variable_get('@enabled')
|
|
54
55
|
end
|
|
@@ -62,8 +63,8 @@ class CollectorsBaseTest < Test::Unit::TestCase
|
|
|
62
63
|
coverband.instance_variable_set('@store', nil)
|
|
63
64
|
assert_equal false, coverband.instance_variable_get('@enabled')
|
|
64
65
|
logger.expects(:info).at_least_once
|
|
66
|
+
logger.stubs('debug')
|
|
65
67
|
coverband.start
|
|
66
|
-
logger.info(1 + 1)
|
|
67
68
|
coverband.stop
|
|
68
69
|
coverband.save
|
|
69
70
|
end
|
|
@@ -74,6 +75,7 @@ class CollectorsBaseTest < Test::Unit::TestCase
|
|
|
74
75
|
coverband.instance_variable_set('@sample_percentage', 100.0)
|
|
75
76
|
coverband.instance_variable_set('@verbose', true)
|
|
76
77
|
Coverband.configuration.logger.stubs('info')
|
|
78
|
+
Coverband.configuration.logger.stubs('debug')
|
|
77
79
|
store = Coverband::Adapters::RedisStore.new(Redis.new)
|
|
78
80
|
coverband.instance_variable_set('@store', store)
|
|
79
81
|
store.expects(:save_report).once.with(has_entries(dog_file => {5 => 5}))
|
|
@@ -61,7 +61,8 @@ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3.0')
|
|
|
61
61
|
coverband.instance_variable_set('@logger', logger)
|
|
62
62
|
coverband.instance_variable_set('@store', nil)
|
|
63
63
|
assert_equal false, coverband.instance_variable_get('@enabled')
|
|
64
|
-
logger.
|
|
64
|
+
logger.stubs('info')
|
|
65
|
+
logger.expects(:debug).at_least_once
|
|
65
66
|
coverband.sample { 1 + 1 }
|
|
66
67
|
assert_equal true, coverband.instance_variable_get('@enabled')
|
|
67
68
|
end
|
|
@@ -74,6 +75,7 @@ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3.0')
|
|
|
74
75
|
coverband.instance_variable_set('@store', nil)
|
|
75
76
|
assert_equal false, coverband.instance_variable_get('@enabled')
|
|
76
77
|
logger.expects(:info).at_least_once
|
|
78
|
+
logger.stubs('debug')
|
|
77
79
|
coverband.start
|
|
78
80
|
logger.info(1 + 1)
|
|
79
81
|
coverband.stop
|
|
@@ -83,8 +85,6 @@ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3.0')
|
|
|
83
85
|
test 'allow reporting to redis start stop save' do
|
|
84
86
|
dog_file = File.expand_path('./dog.rb', File.dirname(__FILE__))
|
|
85
87
|
coverband.instance_variable_set('@sample_percentage', 100.0)
|
|
86
|
-
coverband.instance_variable_set('@verbose', true)
|
|
87
|
-
Coverband.configuration.logger.stubs('info')
|
|
88
88
|
store = Coverband::Adapters::RedisStore.new(Redis.new)
|
|
89
89
|
coverband.instance_variable_set('@store', store)
|
|
90
90
|
|
|
@@ -50,6 +50,7 @@ class CollectorsTraceTest < Test::Unit::TestCase
|
|
|
50
50
|
coverband.instance_variable_set('@store', nil)
|
|
51
51
|
assert_equal false, coverband.instance_variable_get('@enabled')
|
|
52
52
|
logger.expects(:info).at_least_once
|
|
53
|
+
logger.stubs('debug')
|
|
53
54
|
coverband.sample { 1 + 1 }
|
|
54
55
|
assert_equal true, coverband.instance_variable_get('@enabled')
|
|
55
56
|
end
|
|
@@ -63,8 +64,8 @@ class CollectorsTraceTest < Test::Unit::TestCase
|
|
|
63
64
|
coverband.instance_variable_set('@store', nil)
|
|
64
65
|
assert_equal false, coverband.instance_variable_get('@enabled')
|
|
65
66
|
logger.expects(:info).at_least_once
|
|
67
|
+
logger.stubs('debug')
|
|
66
68
|
coverband.start
|
|
67
|
-
logger.info(1 + 1)
|
|
68
69
|
coverband.stop
|
|
69
70
|
coverband.save
|
|
70
71
|
end
|
|
@@ -75,6 +76,7 @@ class CollectorsTraceTest < Test::Unit::TestCase
|
|
|
75
76
|
coverband.instance_variable_set('@sample_percentage', 100.0)
|
|
76
77
|
coverband.instance_variable_set('@verbose', true)
|
|
77
78
|
Coverband.configuration.logger.stubs('info')
|
|
79
|
+
Coverband.configuration.logger.stubs('debug')
|
|
78
80
|
store = Coverband::Adapters::RedisStore.new(Redis.new)
|
|
79
81
|
coverband.instance_variable_set('@store', store)
|
|
80
82
|
store.expects(:save_report).once.with(has_entries(dog_file => { 5 => 5 }))
|
|
@@ -15,6 +15,15 @@ class SimpleCovReportTest < Test::Unit::TestCase
|
|
|
15
15
|
{'1' => '1', '2' => '2'}
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
+
def combined_report
|
|
19
|
+
{
|
|
20
|
+
"#{BASE_KEY}.test/unit/dog.rb" => {
|
|
21
|
+
new: example_hash,
|
|
22
|
+
existing: {}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
end
|
|
26
|
+
|
|
18
27
|
test 'report data' do
|
|
19
28
|
Coverband.configure do |config|
|
|
20
29
|
config.redis = @redis
|
|
@@ -25,7 +34,7 @@ class SimpleCovReportTest < Test::Unit::TestCase
|
|
|
25
34
|
Coverband::Reporters::ConsoleReport.expects(:current_root).returns('./test/unit')
|
|
26
35
|
|
|
27
36
|
@redis.sadd(BASE_KEY, 'test/unit/dog.rb')
|
|
28
|
-
@store.send(:
|
|
37
|
+
@store.send(:pipelined_save, combined_report)
|
|
29
38
|
|
|
30
39
|
report = Coverband::Reporters::ConsoleReport.report(@store)
|
|
31
40
|
expected = {"test/unit/dog.rb"=>[1, 2, nil, nil, nil, nil, nil]}
|
|
@@ -15,6 +15,15 @@ class ReportsSimpleCovTest < Test::Unit::TestCase
|
|
|
15
15
|
{'1' => '1', '2' => '2'}
|
|
16
16
|
end
|
|
17
17
|
|
|
18
|
+
def combined_report
|
|
19
|
+
{
|
|
20
|
+
"#{BASE_KEY}.test/unit/dog.rb" => {
|
|
21
|
+
new: example_hash,
|
|
22
|
+
existing: {}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
end
|
|
26
|
+
|
|
18
27
|
test 'generate scov report' do
|
|
19
28
|
Coverband.configure do |config|
|
|
20
29
|
config.redis = @redis
|
|
@@ -26,7 +35,7 @@ class ReportsSimpleCovTest < Test::Unit::TestCase
|
|
|
26
35
|
Coverband.configuration.logger.stubs('info')
|
|
27
36
|
|
|
28
37
|
@redis.sadd(BASE_KEY, 'test/unit/dog.rb')
|
|
29
|
-
@store.send(:
|
|
38
|
+
@store.send(:pipelined_save, combined_report)
|
|
30
39
|
|
|
31
40
|
SimpleCov.expects(:track_files)
|
|
32
41
|
SimpleCov.expects(:add_not_loaded_files).returns({})
|
|
@@ -48,7 +57,7 @@ class ReportsSimpleCovTest < Test::Unit::TestCase
|
|
|
48
57
|
Coverband::Reporters::SimpleCovReport.expects(:current_root).at_least_once.returns('/tmp/root_dir')
|
|
49
58
|
|
|
50
59
|
@redis.sadd(BASE_KEY, 'test/unit/dog.rb')
|
|
51
|
-
@store.send(:
|
|
60
|
+
@store.send(:pipelined_save, combined_report)
|
|
52
61
|
SimpleCov.expects(:track_files)
|
|
53
62
|
SimpleCov.expects(:add_not_loaded_files).returns('fake_file.rb' => [1])
|
|
54
63
|
SimpleCov::Result.any_instance.expects(:format!)
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require File.expand_path('../test_helper', File.dirname(__FILE__))
|
|
4
|
+
require 'aws-sdk'
|
|
5
|
+
require File.expand_path('../../lib/coverband/reporters/web', File.dirname(__FILE__))
|
|
6
|
+
require 'rack/test'
|
|
7
|
+
|
|
8
|
+
ENV['RACK_ENV'] = 'test'
|
|
9
|
+
|
|
10
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.2.0')
|
|
11
|
+
module Coverband
|
|
12
|
+
class S3WebTest < Test::Unit::TestCase
|
|
13
|
+
include Rack::Test::Methods
|
|
14
|
+
|
|
15
|
+
def app
|
|
16
|
+
Coverband::Reporters::Web.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# TODO add tests for all endpoints
|
|
20
|
+
test 'renders index content' do
|
|
21
|
+
get '/'
|
|
22
|
+
assert last_response.ok?
|
|
23
|
+
assert_match 'Coverband Web Admin Index', last_response.body
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test 'renders show content' do
|
|
27
|
+
Coverband.configuration.s3_bucket = 'coverage-bucket'
|
|
28
|
+
s3 = mock('s3')
|
|
29
|
+
Aws::S3::Client.expects(:new).returns(s3)
|
|
30
|
+
s3.expects(:get_object).with(bucket: 'coverage-bucket', key: 'coverband/index.html').returns mock('response', body: mock('body', read: 'content'))
|
|
31
|
+
get '/show'
|
|
32
|
+
assert last_response.ok?
|
|
33
|
+
assert_equal 'content', last_response.body
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -18,7 +18,13 @@ module Coverband
|
|
|
18
18
|
File.expects(:read).at_least(0).returns("content ./assets/#{html_version}/")
|
|
19
19
|
object.expects(:put).with(body: 'content ')
|
|
20
20
|
Aws::S3::Resource.expects(:new).returns(s3)
|
|
21
|
-
|
|
21
|
+
|
|
22
|
+
s3_writer_options = {
|
|
23
|
+
region: 'us-west-1',
|
|
24
|
+
access_key_id: '',
|
|
25
|
+
secret_access_key: ''
|
|
26
|
+
}
|
|
27
|
+
S3ReportWriter.new('coverage-bucket', s3_writer_options).persist!
|
|
22
28
|
end
|
|
23
29
|
end
|
|
24
30
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: coverband
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.
|
|
4
|
+
version: 2.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Dan Mayer
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-
|
|
11
|
+
date: 2018-10-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: aws-sdk
|
|
@@ -108,20 +108,6 @@ dependencies:
|
|
|
108
108
|
- - ">="
|
|
109
109
|
- !ruby/object:Gem::Version
|
|
110
110
|
version: '0'
|
|
111
|
-
- !ruby/object:Gem::Dependency
|
|
112
|
-
name: sinatra
|
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
|
114
|
-
requirements:
|
|
115
|
-
- - ">="
|
|
116
|
-
- !ruby/object:Gem::Version
|
|
117
|
-
version: '0'
|
|
118
|
-
type: :development
|
|
119
|
-
prerelease: false
|
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
-
requirements:
|
|
122
|
-
- - ">="
|
|
123
|
-
- !ruby/object:Gem::Version
|
|
124
|
-
version: '0'
|
|
125
111
|
- !ruby/object:Gem::Dependency
|
|
126
112
|
name: test-unit
|
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -207,16 +193,13 @@ files:
|
|
|
207
193
|
- README.md
|
|
208
194
|
- Rakefile
|
|
209
195
|
- changes.md
|
|
196
|
+
- config.ru
|
|
210
197
|
- coverband.gemspec
|
|
211
|
-
- docs/coverband_details.png
|
|
212
|
-
- docs/coverband_index.png
|
|
213
|
-
- docs/coverband_install.gif
|
|
214
198
|
- lib/coverband.rb
|
|
215
199
|
- lib/coverband/adapters/base.rb
|
|
216
200
|
- lib/coverband/adapters/file_store.rb
|
|
217
201
|
- lib/coverband/adapters/memory_cache_store.rb
|
|
218
202
|
- lib/coverband/adapters/redis_store.rb
|
|
219
|
-
- lib/coverband/baseline.rb
|
|
220
203
|
- lib/coverband/collectors/base.rb
|
|
221
204
|
- lib/coverband/collectors/coverage.rb
|
|
222
205
|
- lib/coverband/collectors/trace.rb
|
|
@@ -225,8 +208,8 @@ files:
|
|
|
225
208
|
- lib/coverband/reporters/base.rb
|
|
226
209
|
- lib/coverband/reporters/console_report.rb
|
|
227
210
|
- lib/coverband/reporters/simple_cov_report.rb
|
|
211
|
+
- lib/coverband/reporters/web.rb
|
|
228
212
|
- lib/coverband/s3_report_writer.rb
|
|
229
|
-
- lib/coverband/s3_web.rb
|
|
230
213
|
- lib/coverband/tasks.rb
|
|
231
214
|
- lib/coverband/version.rb
|
|
232
215
|
- test/benchmarks/.gitignore
|
|
@@ -237,7 +220,6 @@ files:
|
|
|
237
220
|
- test/unit/adapters_file_store_test.rb
|
|
238
221
|
- test/unit/adapters_memory_cache_store_test.rb
|
|
239
222
|
- test/unit/adapters_redis_store_test.rb
|
|
240
|
-
- test/unit/baseline_test.rb
|
|
241
223
|
- test/unit/collectors_base_test.rb
|
|
242
224
|
- test/unit/collectors_coverage_test.rb
|
|
243
225
|
- test/unit/collectors_trace_test.rb
|
|
@@ -247,8 +229,8 @@ files:
|
|
|
247
229
|
- test/unit/reports_base_test.rb
|
|
248
230
|
- test/unit/reports_console_test.rb
|
|
249
231
|
- test/unit/reports_simple_cov_test.rb
|
|
232
|
+
- test/unit/reports_web_test.rb
|
|
250
233
|
- test/unit/s3_report_writer_test.rb
|
|
251
|
-
- test/unit/s3_web_test.rb
|
|
252
234
|
homepage: https://github.com/danmayer/coverband
|
|
253
235
|
licenses:
|
|
254
236
|
- MIT
|
|
@@ -269,7 +251,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
269
251
|
version: '0'
|
|
270
252
|
requirements: []
|
|
271
253
|
rubyforge_project:
|
|
272
|
-
rubygems_version: 2.
|
|
254
|
+
rubygems_version: 2.5.1
|
|
273
255
|
signing_key:
|
|
274
256
|
specification_version: 4
|
|
275
257
|
summary: Rack middleware to help measure production code usage (LOC runtime usage)
|
|
@@ -282,7 +264,6 @@ test_files:
|
|
|
282
264
|
- test/unit/adapters_file_store_test.rb
|
|
283
265
|
- test/unit/adapters_memory_cache_store_test.rb
|
|
284
266
|
- test/unit/adapters_redis_store_test.rb
|
|
285
|
-
- test/unit/baseline_test.rb
|
|
286
267
|
- test/unit/collectors_base_test.rb
|
|
287
268
|
- test/unit/collectors_coverage_test.rb
|
|
288
269
|
- test/unit/collectors_trace_test.rb
|
|
@@ -292,5 +273,5 @@ test_files:
|
|
|
292
273
|
- test/unit/reports_base_test.rb
|
|
293
274
|
- test/unit/reports_console_test.rb
|
|
294
275
|
- test/unit/reports_simple_cov_test.rb
|
|
276
|
+
- test/unit/reports_web_test.rb
|
|
295
277
|
- test/unit/s3_report_writer_test.rb
|
|
296
|
-
- test/unit/s3_web_test.rb
|
data/docs/coverband_details.png
DELETED
|
Binary file
|
data/docs/coverband_index.png
DELETED
|
Binary file
|
data/docs/coverband_install.gif
DELETED
|
Binary file
|
data/lib/coverband/baseline.rb
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Coverband
|
|
4
|
-
class Baseline
|
|
5
|
-
def self.record
|
|
6
|
-
require 'coverage'
|
|
7
|
-
Coverage.start
|
|
8
|
-
yield
|
|
9
|
-
|
|
10
|
-
project_directory = File.expand_path(Coverband.configuration.root)
|
|
11
|
-
results = Coverage.result
|
|
12
|
-
results = results.reject { |key, _val| !key.match(project_directory) || Coverband.configuration.ignore.any? { |pattern| key.match(/#{pattern}/) } }
|
|
13
|
-
|
|
14
|
-
Coverband.configuration.store.save_report(convert_coverage_format(results))
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def self.parse_baseline(_back_compat = nil)
|
|
18
|
-
Coverband.configuration.store.coverage
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def self.exclude_files(files)
|
|
22
|
-
Coverband.configuration.ignore.each do |ignore|
|
|
23
|
-
path = Coverband.configuration.root + "/#{ignore}"
|
|
24
|
-
excludes = File.directory?(path) ? Dir.glob("#{path}/**/*") : [path]
|
|
25
|
-
files -= excludes
|
|
26
|
-
end
|
|
27
|
-
files
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
private
|
|
31
|
-
|
|
32
|
-
def self.convert_coverage_format(results)
|
|
33
|
-
file_map = {}
|
|
34
|
-
results.each_pair do |file, data|
|
|
35
|
-
lines_map = {}
|
|
36
|
-
data.each_with_index do |hits, index|
|
|
37
|
-
lines_map[(index + 1)] = hits unless hits.nil?
|
|
38
|
-
end
|
|
39
|
-
file_map[file] = lines_map
|
|
40
|
-
end
|
|
41
|
-
file_map
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
end
|
data/lib/coverband/s3_web.rb
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'sinatra/base'
|
|
4
|
-
|
|
5
|
-
module Coverband
|
|
6
|
-
class S3Web < Sinatra::Base
|
|
7
|
-
set :public_folder, proc(){ File.expand_path('public', Gem::Specification.find_by_name('simplecov-html').full_gem_path) }
|
|
8
|
-
|
|
9
|
-
get '/' do
|
|
10
|
-
s3.get_object(bucket: Coverband.configuration.s3_bucket, key: 'coverband/index.html').body.read
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
private
|
|
14
|
-
|
|
15
|
-
def s3
|
|
16
|
-
begin
|
|
17
|
-
require 'aws-sdk'
|
|
18
|
-
rescue StandardError
|
|
19
|
-
Coverband.configuration.logger.error "coverband requires 'aws-sdk' in order use S3ReportWriter."
|
|
20
|
-
return
|
|
21
|
-
end
|
|
22
|
-
@s3 ||= Aws::S3::Client.new
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|