coverband 4.1.0.beta → 4.1.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.
- checksums.yaml +4 -4
- data/README.md +9 -0
- data/changes.md +20 -0
- data/lib/coverband.rb +5 -0
- data/lib/coverband/adapters/base.rb +20 -4
- data/lib/coverband/adapters/file_store.rb +8 -0
- data/lib/coverband/adapters/redis_store.rb +33 -2
- data/lib/coverband/at_exit.rb +1 -1
- data/lib/coverband/configuration.rb +16 -2
- data/lib/coverband/integrations/background.rb +6 -1
- data/lib/coverband/integrations/resque.rb +7 -1
- data/lib/coverband/reporters/base.rb +4 -47
- data/lib/coverband/reporters/html_report.rb +1 -1
- data/lib/coverband/reporters/web.rb +1 -1
- data/lib/coverband/utils/file_path_helper.rb +57 -0
- data/lib/coverband/utils/railtie.rb +1 -1
- data/lib/coverband/utils/tasks.rb +9 -0
- data/lib/coverband/version.rb +1 -1
- data/test/benchmarks/benchmark.rake +5 -1
- data/test/unit/collectors_coverage_test.rb +5 -0
- data/test/unit/configuration_test.rb +13 -3
- data/test/unit/full_stack_test.rb +4 -2
- data/test/unit/rails_full_stack_test.rb +4 -3
- data/test/unit/rails_gems_full_stack_test.rb +2 -1
- data/test/unit/reports_base_test.rb +10 -10
- data/test/unit/reports_console_test.rb +5 -4
- data/test/unit/resque_worker_test.rb +8 -7
- data/views/layout.erb +1 -1
- data/views/settings.erb +7 -2
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7070c0b3648d9f4fe856175711373dbddc19df4
|
4
|
+
data.tar.gz: d31f4e2ae34e9ad28cbf93fa6e7bcebeb99a9c52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 630244e791fe41a7f5d53b89a6d2782764252fd6f8f7eecb37eab9259928bf422e1a2a6282dc046e0c6fdbc7d2b3581c8a1eeb9584670848fc1b678b5ab0629e
|
7
|
+
data.tar.gz: b03947618d4e2b51a27a84438de3c5cc5d1da4f9a5024e4d9d6cf00d39f652874ecc0f0c0ae2a6d475b90a8bfa792c133a01696084f337f4c7146d567a8044f9
|
data/README.md
CHANGED
@@ -198,6 +198,15 @@ ENV['AWS_ACCESS_KEY_ID']
|
|
198
198
|
ENV['AWS_SECRET_ACCESS_KEY']
|
199
199
|
```
|
200
200
|
|
201
|
+
### Coverage Data Migration
|
202
|
+
|
203
|
+
Between the release of 4.0 and 4.1 our data format changed. This resets all your coverage data. If you want to restore your previous coverage data, feel free to migrate.
|
204
|
+
|
205
|
+
`rake coverband:migrate`
|
206
|
+
|
207
|
+
* We will be working to support migrations going forward, when possible
|
208
|
+
|
209
|
+
|
201
210
|
### Clear Coverage
|
202
211
|
|
203
212
|
Now that Coverband uses MD5 hashes there should be no reason to manually clear coverage unless one is testing, changing versions, possibly debugging Coverband itself.
|
data/changes.md
CHANGED
@@ -73,14 +73,34 @@ Feature Ideas:
|
|
73
73
|
- out of the box support for resque
|
74
74
|
- readme improvements
|
75
75
|
- fix on regression of merging directory changing deployments
|
76
|
+
- fixes for duplicate root paths
|
76
77
|
- pilot release of Gems tracking (disabled by default)
|
77
78
|
- todos
|
78
79
|
- support multiple gem paths (various version managers setup multiple gem paths)
|
79
80
|
- speed up page load by allowing multiple pages
|
80
81
|
- added web settings and debug views
|
82
|
+
- added support for seeing coverage data size consumed in redis
|
83
|
+
- support coverage data migrations from 4.0.x to 4.1.0
|
84
|
+
- fixes for heroku /tmp asset building
|
81
85
|
|
82
86
|
# Released
|
83
87
|
|
88
|
+
### Coverband 4.1.0
|
89
|
+
|
90
|
+
- default disabled web clear, add config option to allow it
|
91
|
+
- out of the box support for resque
|
92
|
+
- readme improvements
|
93
|
+
- fix on regression of merging directory changing deployments
|
94
|
+
- fixes for duplicate root paths
|
95
|
+
- pilot release of Gems tracking (disabled by default)
|
96
|
+
- todos
|
97
|
+
- support multiple gem paths (various version managers setup multiple gem paths)
|
98
|
+
- speed up page load by allowing multiple pages
|
99
|
+
- added web settings and debug views
|
100
|
+
- added support for seeing coverage data size consumed in redis
|
101
|
+
- support coverage data migrations from 4.0.x to 4.1.0
|
102
|
+
- fixes for heroku /tmp asset building
|
103
|
+
|
84
104
|
### Coverband 4.0.1
|
85
105
|
|
86
106
|
- drops Simplecov runtime dependency
|
data/lib/coverband.rb
CHANGED
@@ -7,6 +7,7 @@ require 'redis'
|
|
7
7
|
require 'coverband/version'
|
8
8
|
require 'coverband/at_exit'
|
9
9
|
require 'coverband/configuration'
|
10
|
+
require 'coverband/utils/file_path_helper'
|
10
11
|
require 'coverband/adapters/base'
|
11
12
|
require 'coverband/adapters/redis_store'
|
12
13
|
require 'coverband/adapters/file_store'
|
@@ -49,6 +50,10 @@ module Coverband
|
|
49
50
|
end
|
50
51
|
end
|
51
52
|
|
53
|
+
def self.report_coverage(force_report = false)
|
54
|
+
Coverband::Collectors::Coverage.instance.report_coverage(force_report)
|
55
|
+
end
|
56
|
+
|
52
57
|
def self.configuration
|
53
58
|
self.configuration_data ||= Configuration.new
|
54
59
|
end
|
@@ -3,6 +3,8 @@
|
|
3
3
|
module Coverband
|
4
4
|
module Adapters
|
5
5
|
class Base
|
6
|
+
include Coverband::Utils::FilePathHelper
|
7
|
+
|
6
8
|
def initialize
|
7
9
|
@file_hash_cache = {}
|
8
10
|
end
|
@@ -11,13 +13,25 @@ module Coverband
|
|
11
13
|
raise 'abstract'
|
12
14
|
end
|
13
15
|
|
16
|
+
def migrate!
|
17
|
+
raise 'abstract'
|
18
|
+
end
|
19
|
+
|
20
|
+
def size
|
21
|
+
raise 'abstract'
|
22
|
+
end
|
23
|
+
|
24
|
+
def size_in_mib
|
25
|
+
format('%.2f', (size.to_f / 2**20))
|
26
|
+
end
|
27
|
+
|
14
28
|
# Note: This could lead to slight race on redis
|
15
29
|
# where multiple processes pull the old coverage and add to it then push
|
16
30
|
# the Coverband 2 had the same issue,
|
17
31
|
# and the tradeoff has always been acceptable
|
18
32
|
def save_report(report)
|
19
33
|
data = report.dup
|
20
|
-
merge_reports(data, get_report)
|
34
|
+
data = merge_reports(data, get_report)
|
21
35
|
save_coverage(data)
|
22
36
|
end
|
23
37
|
|
@@ -49,6 +63,7 @@ module Coverband
|
|
49
63
|
end
|
50
64
|
|
51
65
|
def expand_report(report)
|
66
|
+
expanded = {}
|
52
67
|
report_time = Time.now.to_i
|
53
68
|
report.each_pair do |key, line_data|
|
54
69
|
extended_data = {
|
@@ -57,12 +72,13 @@ module Coverband
|
|
57
72
|
'file_hash' => file_hash(key),
|
58
73
|
'data' => line_data
|
59
74
|
}
|
60
|
-
|
75
|
+
expanded[full_path_to_relative(key)] = extended_data
|
61
76
|
end
|
77
|
+
expanded
|
62
78
|
end
|
63
79
|
|
64
|
-
def merge_reports(new_report, old_report)
|
65
|
-
new_report = expand_report(new_report)
|
80
|
+
def merge_reports(new_report, old_report, options = {})
|
81
|
+
new_report = expand_report(new_report) unless options[:skip_expansion]
|
66
82
|
keys = (new_report.keys + old_report.keys).uniq
|
67
83
|
keys.each do |file|
|
68
84
|
new_report[file] = if new_report[file] &&
|
@@ -20,6 +20,14 @@ module Coverband
|
|
20
20
|
File.delete(path) if File.exist?(path)
|
21
21
|
end
|
22
22
|
|
23
|
+
def size
|
24
|
+
File.size?(path).to_i
|
25
|
+
end
|
26
|
+
|
27
|
+
def migrate!
|
28
|
+
raise NotImplementedError, "FileStore doesn't support migrations"
|
29
|
+
end
|
30
|
+
|
23
31
|
private
|
24
32
|
|
25
33
|
attr_accessor :path
|
@@ -11,25 +11,56 @@ module Coverband
|
|
11
11
|
# used to store data to redis. It is changed only when breaking changes to our
|
12
12
|
# redis format are required.
|
13
13
|
###
|
14
|
-
REDIS_STORAGE_FORMAT_VERSION = '
|
14
|
+
REDIS_STORAGE_FORMAT_VERSION = 'coverband_3_2'
|
15
15
|
|
16
16
|
def initialize(redis, opts = {})
|
17
17
|
super()
|
18
18
|
@redis = redis
|
19
19
|
@ttl = opts[:ttl]
|
20
20
|
@redis_namespace = opts[:redis_namespace]
|
21
|
+
@format_version = REDIS_STORAGE_FORMAT_VERSION
|
21
22
|
end
|
22
23
|
|
23
24
|
def clear!
|
24
25
|
@redis.del(base_key)
|
25
26
|
end
|
26
27
|
|
28
|
+
def size
|
29
|
+
@redis.get(REDIS_STORAGE_FORMAT_VERSION).bytesize
|
30
|
+
end
|
31
|
+
|
32
|
+
###
|
33
|
+
# Current implementation moves from coverband3_1 to coverband_3_2
|
34
|
+
# In the future this can be made more general and support a more specific
|
35
|
+
# version format.
|
36
|
+
###
|
37
|
+
def migrate!
|
38
|
+
reset_base_key
|
39
|
+
@format_version = 'coverband3_1'
|
40
|
+
previous_data = get_report
|
41
|
+
if previous_data.empty?
|
42
|
+
puts 'no previous data to migrate found'
|
43
|
+
exit 0
|
44
|
+
end
|
45
|
+
relative_path_report = previous_data.each_with_object({}) do |(key, vals), fixed_report|
|
46
|
+
fixed_report[full_path_to_relative(key)] = vals
|
47
|
+
end
|
48
|
+
clear!
|
49
|
+
reset_base_key
|
50
|
+
@format_version = REDIS_STORAGE_FORMAT_VERSION
|
51
|
+
save_coverage(merge_reports(get_report, relative_path_report, skip_expansion: true))
|
52
|
+
end
|
53
|
+
|
27
54
|
private
|
28
55
|
|
29
56
|
attr_reader :redis
|
30
57
|
|
58
|
+
def reset_base_key
|
59
|
+
@base_key = nil
|
60
|
+
end
|
61
|
+
|
31
62
|
def base_key
|
32
|
-
@base_key ||= [
|
63
|
+
@base_key ||= [@format_version, @redis_namespace].compact.join('.')
|
33
64
|
end
|
34
65
|
|
35
66
|
def save_coverage(data)
|
data/lib/coverband/at_exit.rb
CHANGED
@@ -11,7 +11,7 @@ module Coverband
|
|
11
11
|
@at_exit_registered = true
|
12
12
|
at_exit do
|
13
13
|
::Coverband::Background.stop
|
14
|
-
Coverband
|
14
|
+
Coverband.report_coverage(true)
|
15
15
|
Coverband.configuration.logger&.debug('Coverband: Reported coverage before exit')
|
16
16
|
end
|
17
17
|
end
|
@@ -20,7 +20,10 @@ module Coverband
|
|
20
20
|
def reset
|
21
21
|
@root = Dir.pwd
|
22
22
|
@root_paths = []
|
23
|
-
|
23
|
+
# Heroku when building assets runs code from a dynamic directory
|
24
|
+
# /tmp was added to avoid coverage from /tmp/build directories during
|
25
|
+
# heroku asset compilation
|
26
|
+
@ignore = %w[vendor .erb$ .slim$ /tmp]
|
24
27
|
@additional_files = []
|
25
28
|
@reporting_frequency = 0.0
|
26
29
|
@verbose = false
|
@@ -121,7 +124,18 @@ module Coverband
|
|
121
124
|
Gem::PathSupport.new(ENV).path.select { |path| File.exist?(path) }
|
122
125
|
end
|
123
126
|
|
124
|
-
|
127
|
+
def current_root
|
128
|
+
File.expand_path(Coverband.configuration.root)
|
129
|
+
end
|
130
|
+
|
131
|
+
def all_root_paths
|
132
|
+
roots = Coverband.configuration.root_paths.dup
|
133
|
+
roots += Coverband.configuration.gem_paths.dup if Coverband.configuration.track_gems
|
134
|
+
roots << "#{Coverband.configuration.current_root}/"
|
135
|
+
roots
|
136
|
+
end
|
137
|
+
|
138
|
+
SKIPPED_SETTINGS = %w(@s3_secret_access_key @store)
|
125
139
|
def to_h
|
126
140
|
instance_variables
|
127
141
|
.each_with_object('gem_paths': gem_paths) do |var, hash|
|
@@ -5,6 +5,7 @@ module Coverband
|
|
5
5
|
@semaphore = Mutex.new
|
6
6
|
|
7
7
|
def self.stop
|
8
|
+
return unless @thread
|
8
9
|
@semaphore.synchronize do
|
9
10
|
if @thread
|
10
11
|
@thread.exit
|
@@ -13,6 +14,10 @@ module Coverband
|
|
13
14
|
end
|
14
15
|
end
|
15
16
|
|
17
|
+
def self.running?
|
18
|
+
!!@thread
|
19
|
+
end
|
20
|
+
|
16
21
|
def self.start
|
17
22
|
return if @thread
|
18
23
|
|
@@ -23,7 +28,7 @@ module Coverband
|
|
23
28
|
sleep_seconds = Coverband.configuration.background_reporting_sleep_seconds
|
24
29
|
@thread = Thread.new do
|
25
30
|
loop do
|
26
|
-
Coverband
|
31
|
+
Coverband.report_coverage(true)
|
27
32
|
logger&.debug("Coverband: Reported coverage via thread. Sleeping #{sleep_seconds}s") if Coverband.configuration.verbose
|
28
33
|
sleep(sleep_seconds)
|
29
34
|
end
|
@@ -4,12 +4,18 @@ Resque.after_fork do |job|
|
|
4
4
|
Coverband.start
|
5
5
|
end
|
6
6
|
|
7
|
+
Resque.before_first_fork do
|
8
|
+
Coverband.configuration.background_reporting_enabled = false
|
9
|
+
Coverband::Background.stop
|
10
|
+
Coverband::Collectors::Coverage.instance.report_coverage(true)
|
11
|
+
end
|
12
|
+
|
7
13
|
module Coverband
|
8
14
|
module ResqueWorker
|
9
15
|
def perform
|
10
16
|
super
|
11
17
|
ensure
|
12
|
-
Coverband
|
18
|
+
Coverband.report_coverage(true)
|
13
19
|
end
|
14
20
|
end
|
15
21
|
end
|
@@ -8,8 +8,10 @@ module Coverband
|
|
8
8
|
###
|
9
9
|
class Base
|
10
10
|
class << self
|
11
|
+
include Coverband::Utils::FilePathHelper
|
11
12
|
def report(store, _options = {})
|
12
|
-
|
13
|
+
all_roots = Coverband.configuration.all_root_paths
|
14
|
+
scov_style_report = get_current_scov_data_imp(store, all_roots)
|
13
15
|
|
14
16
|
if Coverband.configuration.verbose
|
15
17
|
msg = "report:\n #{scov_style_report.inspect}"
|
@@ -20,17 +22,6 @@ module Coverband
|
|
20
22
|
|
21
23
|
protected
|
22
24
|
|
23
|
-
def root_paths
|
24
|
-
roots = Coverband.configuration.root_paths
|
25
|
-
roots += Coverband.configuration.gem_paths if Coverband.configuration.track_gems
|
26
|
-
roots << "#{current_root}/"
|
27
|
-
roots
|
28
|
-
end
|
29
|
-
|
30
|
-
def current_root
|
31
|
-
File.expand_path(Coverband.configuration.root)
|
32
|
-
end
|
33
|
-
|
34
25
|
def fix_file_names(report_hash, roots)
|
35
26
|
if Coverband.configuration.verbose
|
36
27
|
Coverband.configuration.logger.info "fixing root: #{roots.join(', ')}"
|
@@ -38,7 +29,7 @@ module Coverband
|
|
38
29
|
|
39
30
|
# normalize names across servers
|
40
31
|
report_hash.each_with_object({}) do |(key, vals), fixed_report|
|
41
|
-
filename =
|
32
|
+
filename = relative_path_to_full(key, roots)
|
42
33
|
fixed_report[filename] = if fixed_report.key?(filename) && fixed_report[filename]['data'] && vals['data']
|
43
34
|
merged_data = merge_arrays(fixed_report[filename]['data'], vals['data'])
|
44
35
|
vals['data'] = merged_data
|
@@ -64,40 +55,6 @@ module Coverband
|
|
64
55
|
merged
|
65
56
|
end
|
66
57
|
|
67
|
-
###
|
68
|
-
# filename_from_key code takes:
|
69
|
-
# key: which is a full path the same as reported by Coverage
|
70
|
-
# roots: if a collection of all possible full app paths
|
71
|
-
# EX: [Coverband.configuration.root_paths, "#{current_root}/"]
|
72
|
-
# The LAST item should be the current file system root
|
73
|
-
# it expands that expands and adds a '/' as that isn't there from Dir.pwd
|
74
|
-
#
|
75
|
-
# NOTEs on configuration.root_paths usage
|
76
|
-
# strings: matching is pretty simple for full string paths
|
77
|
-
# regex: to get regex to work for changing deploy directories
|
78
|
-
# the regex must be double escaped in double quotes
|
79
|
-
# (if using \d for example)
|
80
|
-
# or use single qoutes
|
81
|
-
# example: '/box/apps/app_name/releases/\d+/'
|
82
|
-
# example: '/var/local/company/company.d/[0-9]*/'
|
83
|
-
###
|
84
|
-
def filename_from_key(key, roots)
|
85
|
-
relative_filename = key
|
86
|
-
local_filename = relative_filename
|
87
|
-
roots.each do |root|
|
88
|
-
relative_filename = relative_filename.gsub(/^#{root}/, './')
|
89
|
-
end
|
90
|
-
# the filename for our reports is expected to be a full path.
|
91
|
-
# roots.last should be roots << current_root}/
|
92
|
-
# a fully expanded path of config.root
|
93
|
-
# filename = filename.gsub('./', roots.last)
|
94
|
-
# above only works for app files
|
95
|
-
# we need to rethink some of this logic
|
96
|
-
# gems aren't at project root and can have multiple locations
|
97
|
-
local_root = roots.find { |root| File.exist?(relative_filename.gsub('./', root)) }
|
98
|
-
local_root ? relative_filename.gsub('./', local_root) : local_filename
|
99
|
-
end
|
100
|
-
|
101
58
|
###
|
102
59
|
# why do we need to merge covered files data?
|
103
60
|
# basically because paths on machines or deployed hosts could be different, so
|
@@ -11,7 +11,7 @@ module Coverband
|
|
11
11
|
base_path = options.fetch(:base_path) { nil }
|
12
12
|
|
13
13
|
# list all files, even if not tracked by Coverband (0% coverage)
|
14
|
-
tracked_glob = "#{current_root}/{app,lib,config}/**/*.{rb}"
|
14
|
+
tracked_glob = "#{Coverband.configuration.current_root}/{app,lib,config}/**/*.{rb}"
|
15
15
|
report_files = Coverband::Utils::Result.add_not_loaded_files(scov_style_report, tracked_glob)
|
16
16
|
# apply coverband filters
|
17
17
|
filtered_report_files = {}
|
@@ -66,7 +66,7 @@ module Coverband
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def collect_coverage
|
69
|
-
Coverband
|
69
|
+
Coverband.report_coverage(true)
|
70
70
|
notice = 'coverband coverage collected'
|
71
71
|
[301, { 'Location' => "#{base_path}?notice=#{notice}" }, []]
|
72
72
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
####
|
4
|
+
# Helper functions for shared logic related to file path manipulation
|
5
|
+
####
|
6
|
+
module Coverband
|
7
|
+
module Utils
|
8
|
+
module FilePathHelper
|
9
|
+
###
|
10
|
+
# Takes a full path and converts to a relative path
|
11
|
+
###
|
12
|
+
def full_path_to_relative(full_path)
|
13
|
+
relative_filename = full_path
|
14
|
+
Coverband.configuration.all_root_paths.each do |root|
|
15
|
+
relative_filename = relative_filename.gsub(/^#{root}/, './')
|
16
|
+
# once we have a relative path break out of the loop
|
17
|
+
break if relative_filename.start_with? './'
|
18
|
+
end
|
19
|
+
relative_filename
|
20
|
+
end
|
21
|
+
|
22
|
+
###
|
23
|
+
# relative_path_to_full code takes:
|
24
|
+
# relative_path: which is a full path the same as reported by Coverage
|
25
|
+
# roots: if a collection of all possible full app paths
|
26
|
+
# EX: [Coverband.configuration.root_paths, "#{current_root}/"]
|
27
|
+
# The LAST item should be the current file system root
|
28
|
+
# it expands that expands and adds a '/' as that isn't there from Dir.pwd
|
29
|
+
#
|
30
|
+
# NOTEs on configuration.root_paths usage
|
31
|
+
# strings: matching is pretty simple for full string paths
|
32
|
+
# regex: to get regex to work for changing deploy directories
|
33
|
+
# the regex must be double escaped in double quotes
|
34
|
+
# (if using \d for example)
|
35
|
+
# or use single qoutes
|
36
|
+
# example: '/box/apps/app_name/releases/\d+/'
|
37
|
+
# example: '/var/local/company/company.d/[0-9]*/'
|
38
|
+
###
|
39
|
+
def relative_path_to_full(relative_path, roots)
|
40
|
+
relative_filename = relative_path
|
41
|
+
local_filename = relative_filename
|
42
|
+
roots.each do |root|
|
43
|
+
relative_filename = relative_filename.gsub(/^#{root}/, './')
|
44
|
+
end
|
45
|
+
# the filename for our reports is expected to be a full path.
|
46
|
+
# roots.last should be roots << current_root}/
|
47
|
+
# a fully expanded path of config.root
|
48
|
+
# filename = filename.gsub('./', roots.last)
|
49
|
+
# above only works for app files
|
50
|
+
# we need to rethink some of this logic
|
51
|
+
# gems aren't at project root and can have multiple locations
|
52
|
+
local_root = roots.find { |root| File.exist?(relative_filename.gsub('./', root)) }
|
53
|
+
local_root ? relative_filename.gsub('./', local_root) : local_filename
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -25,4 +25,13 @@ namespace :coverband do
|
|
25
25
|
environment
|
26
26
|
Coverband.configuration.store.clear!
|
27
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
|
28
37
|
end
|
data/lib/coverband/version.rb
CHANGED
@@ -134,7 +134,7 @@ namespace :benchmarks do
|
|
134
134
|
x.config(time: 12, warmup: 5, suite: suite)
|
135
135
|
x.report 'coverband' do
|
136
136
|
work
|
137
|
-
Coverband
|
137
|
+
Coverband.report_coverage(true)
|
138
138
|
end
|
139
139
|
x.report 'no coverband' do
|
140
140
|
work
|
@@ -176,6 +176,10 @@ namespace :benchmarks do
|
|
176
176
|
@file_hash_cache[file] = Digest::MD5.file(__FILE__).hexdigest
|
177
177
|
end
|
178
178
|
end
|
179
|
+
|
180
|
+
def store.full_path_to_relative(file)
|
181
|
+
file
|
182
|
+
end
|
179
183
|
end
|
180
184
|
|
181
185
|
def reporting_speed
|
@@ -44,5 +44,10 @@ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3.0')
|
|
44
44
|
@coverband.reset_instance
|
45
45
|
@coverband.report_coverage
|
46
46
|
end
|
47
|
+
|
48
|
+
test 'default tmp ignores' do
|
49
|
+
heroku_build_file = '/tmp/build_81feca8c72366e4edf020dc6f1937485/config/initializers/assets.rb'
|
50
|
+
assert_equal false, @coverband.send(:track_file?, heroku_build_file)
|
51
|
+
end
|
47
52
|
end
|
48
53
|
end
|
@@ -16,22 +16,32 @@ class BaseTest < Minitest::Test
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
test 'defaults
|
19
|
+
test 'defaults' do
|
20
20
|
coverband = Coverband::Collectors::Coverage.instance.reset_instance
|
21
21
|
assert_equal ['vendor', 'internal:prelude', 'schema.rb'], coverband.instance_variable_get('@ignore_patterns')
|
22
22
|
end
|
23
23
|
|
24
|
-
test 'gem_paths
|
24
|
+
test 'gem_paths' do
|
25
25
|
Coverband::Collectors::Coverage.instance.reset_instance
|
26
26
|
assert Coverband.configuration.gem_paths.first != nil
|
27
27
|
end
|
28
28
|
|
29
|
-
test 'groups
|
29
|
+
test 'groups' do
|
30
30
|
Coverband::Collectors::Coverage.instance.reset_instance
|
31
31
|
Coverband.configuration.track_gems = true
|
32
32
|
assert_equal %w(App Gems), Coverband.configuration.groups.keys
|
33
33
|
end
|
34
34
|
|
35
|
+
test 'all_root_paths' do
|
36
|
+
Coverband::Collectors::Coverage.instance.reset_instance
|
37
|
+
current_paths = Coverband.configuration.root_paths.dup
|
38
|
+
# verify previous bug fix
|
39
|
+
# it would extend the root_paths instance variable on each invokation
|
40
|
+
Coverband.configuration.all_root_paths
|
41
|
+
Coverband.configuration.all_root_paths
|
42
|
+
assert_equal current_paths, Coverband.configuration.root_paths
|
43
|
+
end
|
44
|
+
|
35
45
|
test 's3 options' do
|
36
46
|
Coverband::Collectors::Coverage.instance.reset_instance
|
37
47
|
Coverband.configure do |config|
|
@@ -6,6 +6,7 @@ require 'rack'
|
|
6
6
|
class FullStackTest < Minitest::Test
|
7
7
|
REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
|
8
8
|
TEST_RACK_APP = '../fake_app/basic_rack.rb'
|
9
|
+
RELATIVE_FILE = './fake_app/basic_rack.rb'
|
9
10
|
|
10
11
|
def setup
|
11
12
|
super
|
@@ -15,6 +16,7 @@ class FullStackTest < Minitest::Test
|
|
15
16
|
config.store = Coverband::Adapters::RedisStore.new(Redis.new)
|
16
17
|
config.s3_bucket = nil
|
17
18
|
config.background_reporting_enabled = false
|
19
|
+
config.root_paths = ["#{File.expand_path('../', File.dirname(__FILE__))}/"]
|
18
20
|
end
|
19
21
|
Coverband.configuration.store.clear!
|
20
22
|
Coverband.start
|
@@ -29,13 +31,13 @@ class FullStackTest < Minitest::Test
|
|
29
31
|
assert_equal 'Hello Rack!', results.last
|
30
32
|
sleep(0.1)
|
31
33
|
expected = [nil, nil, 1, nil, 1, 1, 1, nil, nil]
|
32
|
-
assert_equal expected, Coverband.configuration.store.coverage[
|
34
|
+
assert_equal expected, Coverband.configuration.store.coverage[RELATIVE_FILE]['data']
|
33
35
|
|
34
36
|
# additional calls increase count by 1
|
35
37
|
middleware.call(request)
|
36
38
|
sleep(0.1)
|
37
39
|
expected = [nil, nil, 1, nil, 1, 1, 2, nil, nil]
|
38
|
-
assert_equal expected, Coverband.configuration.store.coverage[
|
40
|
+
assert_equal expected, Coverband.configuration.store.coverage[RELATIVE_FILE]['data']
|
39
41
|
end
|
40
42
|
|
41
43
|
test 'call app with gem tracking' do
|
@@ -10,6 +10,7 @@ class RailsFullStackTest < Minitest::Test
|
|
10
10
|
super
|
11
11
|
# The normal relative directory lookup of coverband won't work for our dummy rails project
|
12
12
|
Coverband.configure("./test/rails#{Rails::VERSION::MAJOR}_dummy/config/coverband.rb")
|
13
|
+
Coverband.configuration.background_reporting_enabled = false
|
13
14
|
Coverband.start
|
14
15
|
end
|
15
16
|
|
@@ -21,8 +22,8 @@ class RailsFullStackTest < Minitest::Test
|
|
21
22
|
|
22
23
|
test 'this is how we do it' do
|
23
24
|
visit '/dummy/show'
|
25
|
+
Coverband.report_coverage(true)
|
24
26
|
assert_content('I am no dummy')
|
25
|
-
sleep 0.2
|
26
27
|
visit '/coverage'
|
27
28
|
within page.find('a', text: /dummy_controller.rb/).find(:xpath, '../..') do
|
28
29
|
assert_selector('td', text: '100.0 %')
|
@@ -46,7 +47,7 @@ class RailsFullStackTest < Minitest::Test
|
|
46
47
|
3.times do
|
47
48
|
visit '/dummy/show'
|
48
49
|
assert_content('I am no dummy')
|
49
|
-
Coverband
|
50
|
+
Coverband.report_coverage(true)
|
50
51
|
end
|
51
52
|
|
52
53
|
previous_out = $stdout
|
@@ -57,7 +58,7 @@ class RailsFullStackTest < Minitest::Test
|
|
57
58
|
15.times do
|
58
59
|
visit '/dummy/show'
|
59
60
|
assert_content('I am no dummy')
|
60
|
-
Coverband
|
61
|
+
Coverband.report_coverage(true)
|
61
62
|
# this is expected to retain memory across requests
|
62
63
|
# clear it to remove the false positive from test
|
63
64
|
Coverband::Collectors::Coverage.instance.send(:add_previous_results, nil)
|
@@ -12,6 +12,7 @@ class RailsGemsFullStackTest < Minitest::Test
|
|
12
12
|
Coverband.configure("./test/rails#{Rails::VERSION::MAJOR}_dummy/config/coverband.rb")
|
13
13
|
Coverband.configuration.track_gems = true
|
14
14
|
Coverband.configuration.gem_details = true
|
15
|
+
Coverband.configuration.background_reporting_enabled = false
|
15
16
|
Coverband.start
|
16
17
|
require 'rainbow'
|
17
18
|
Rainbow('this text is red').red
|
@@ -26,7 +27,7 @@ class RailsGemsFullStackTest < Minitest::Test
|
|
26
27
|
test 'this is how gem it' do
|
27
28
|
visit '/dummy/show'
|
28
29
|
assert_content('I am no dummy')
|
29
|
-
|
30
|
+
Coverband.report_coverage(true)
|
30
31
|
visit '/coverage'
|
31
32
|
assert_content('Coverband Admin')
|
32
33
|
assert_content('Gems')
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require File.expand_path('../test_helper', File.dirname(__FILE__))
|
4
4
|
|
5
5
|
class ReportsBaseTest < Minitest::Test
|
6
|
-
test '
|
6
|
+
test 'relative_path_to_full fix filename from a key with a swappable path' do
|
7
7
|
Coverband.configure do |config|
|
8
8
|
config.reporter = 'std_out'
|
9
9
|
config.root = '/full/remote_app/path'
|
@@ -16,10 +16,10 @@ class ReportsBaseTest < Minitest::Test
|
|
16
16
|
expected_path = '/full/remote_app/path/is/a/path.rb'
|
17
17
|
File.expects(:exist?).with(key).returns(false)
|
18
18
|
File.expects(:exist?).with(expected_path).returns(true)
|
19
|
-
assert_equal expected_path, Coverband::Reporters::Base.send(:
|
19
|
+
assert_equal expected_path, Coverband::Reporters::Base.send(:relative_path_to_full, key, roots)
|
20
20
|
end
|
21
21
|
|
22
|
-
test '
|
22
|
+
test 'relative_path_to_full fix filename a changing deploy path with quotes' do
|
23
23
|
Coverband.configure do |config|
|
24
24
|
config.reporter = 'std_out'
|
25
25
|
config.root = '/full/remote_app/path'
|
@@ -30,14 +30,14 @@ class ReportsBaseTest < Minitest::Test
|
|
30
30
|
roots = ["/box/apps/app_name/releases/\\d+/", '/full/remote_app/path/']
|
31
31
|
File.expects(:exist?).with('/box/apps/app_name/releases/\\d+/app/models/user.rb').returns(false)
|
32
32
|
File.expects(:exist?).with(expected_path).returns(true)
|
33
|
-
assert_equal expected_path, Coverband::Reporters::Base.send(:
|
33
|
+
assert_equal expected_path, Coverband::Reporters::Base.send(:relative_path_to_full, key, roots)
|
34
34
|
File.expects(:exist?).with('/box/apps/app_name/releases/\\d+/app/models/user.rb').returns(false)
|
35
35
|
File.expects(:exist?).with(expected_path).returns(true)
|
36
36
|
roots = ['/box/apps/app_name/releases/\d+/', '/full/remote_app/path/']
|
37
|
-
assert_equal expected_path, Coverband::Reporters::Base.send(:
|
37
|
+
assert_equal expected_path, Coverband::Reporters::Base.send(:relative_path_to_full, key, roots)
|
38
38
|
end
|
39
39
|
|
40
|
-
test '
|
40
|
+
test 'relative_path_to_full fix filename a changing deploy path real world examples' do
|
41
41
|
current_app_root = '/var/local/company/company.d/79'
|
42
42
|
Coverband.configure do |config|
|
43
43
|
config.reporter = 'std_out'
|
@@ -50,14 +50,14 @@ class ReportsBaseTest < Minitest::Test
|
|
50
50
|
File.expects(:exist?).with('/var/local/company/company.d/[0-9]*/app/controllers/dashboard_controller.rb').returns(false)
|
51
51
|
File.expects(:exist?).with(expected_path).returns(true)
|
52
52
|
roots = ['/var/local/company/company.d/[0-9]*/', "#{current_app_root}/"]
|
53
|
-
assert_equal expected_path, Coverband::Reporters::Base.send(:
|
53
|
+
assert_equal expected_path, Coverband::Reporters::Base.send(:relative_path_to_full, key, roots)
|
54
54
|
File.expects(:exist?).with('/var/local/company/company.d/[0-9]*/app/controllers/dashboard_controller.rb').returns(false)
|
55
55
|
File.expects(:exist?).with(expected_path).returns(true)
|
56
56
|
roots = ["/var/local/company/company.d/[0-9]*/", "#{current_app_root}/"]
|
57
|
-
assert_equal expected_path, Coverband::Reporters::Base.send(:
|
57
|
+
assert_equal expected_path, Coverband::Reporters::Base.send(:relative_path_to_full, key, roots)
|
58
58
|
end
|
59
59
|
|
60
|
-
test '
|
60
|
+
test 'relative_path_to_full leave filename from a key with a local path' do
|
61
61
|
Coverband.configure do |config|
|
62
62
|
config.reporter = 'std_out'
|
63
63
|
config.root = '/full/remote_app/path'
|
@@ -68,7 +68,7 @@ class ReportsBaseTest < Minitest::Test
|
|
68
68
|
roots = ['/app/', '/full/remote_app/path/']
|
69
69
|
|
70
70
|
expected_path = '/full/remote_app/path/is/a/path.rb'
|
71
|
-
assert_equal expected_path, Coverband::Reporters::Base.send(:
|
71
|
+
assert_equal expected_path, Coverband::Reporters::Base.send(:relative_path_to_full, key, roots)
|
72
72
|
end
|
73
73
|
|
74
74
|
test '#merge_arrays basic merge preserves order and counts' do
|
@@ -20,13 +20,14 @@ class HTMLReportTest < Minitest::Test
|
|
20
20
|
end
|
21
21
|
Coverband.configuration.logger.stubs('info')
|
22
22
|
mock_file_hash
|
23
|
-
Coverband
|
24
|
-
|
25
|
-
|
23
|
+
Coverband.configuration
|
24
|
+
.expects(:current_root)
|
25
|
+
.at_least_once
|
26
|
+
.returns('app_path')
|
26
27
|
@store.send(:save_report, basic_coverage)
|
27
28
|
|
28
29
|
report = Coverband::Reporters::ConsoleReport.report(@store)
|
29
|
-
expected = { '
|
30
|
+
expected = { './dog.rb' => [0, 1, 2] }
|
30
31
|
assert_equal(expected.keys, report.keys)
|
31
32
|
end
|
32
33
|
end
|
@@ -6,13 +6,16 @@ class ResqueWorkerTest < Minitest::Test
|
|
6
6
|
def enqueue_and_run_job
|
7
7
|
Resque.enqueue(TestResqueJob)
|
8
8
|
queue = ENV['QUEUE'] ='resque_coverband'
|
9
|
-
Resque::Worker.new
|
9
|
+
worker = Resque::Worker.new
|
10
|
+
worker.startup
|
11
|
+
worker.work_one_job
|
10
12
|
end
|
11
13
|
|
12
14
|
def setup
|
13
15
|
super
|
14
16
|
Coverband.configure do |config|
|
15
17
|
config.background_reporting_enabled = false
|
18
|
+
config.root_paths = ["#{File.expand_path('../', File.dirname(__FILE__))}/"]
|
16
19
|
end
|
17
20
|
Coverband.start
|
18
21
|
redis = Coverband.configuration.store.send(:redis)
|
@@ -20,16 +23,14 @@ class ResqueWorkerTest < Minitest::Test
|
|
20
23
|
end
|
21
24
|
|
22
25
|
test 'resque job coverage' do
|
26
|
+
relative_job_file = './unit/test_resque_job.rb'
|
23
27
|
resque_job_file = File.expand_path('./test_resque_job.rb', File.dirname(__FILE__))
|
24
28
|
require resque_job_file
|
25
29
|
|
26
|
-
#report after loading the file in parent process
|
27
|
-
Coverband::Collectors::Coverage.instance.report_coverage(true)
|
28
|
-
|
29
30
|
enqueue_and_run_job
|
30
31
|
|
31
|
-
|
32
|
-
|
32
|
+
assert !Coverband::Background.running?
|
33
|
+
|
34
|
+
assert_equal 1, Coverband.configuration.store.coverage[relative_job_file]['data'][4]
|
33
35
|
end
|
34
36
|
end
|
35
|
-
|
data/views/layout.erb
CHANGED
@@ -16,7 +16,7 @@
|
|
16
16
|
<div id="wrapper" style="display:none;">
|
17
17
|
<div id="header">
|
18
18
|
<a href='<%= base_path %>'>Coverband Admin</a>
|
19
|
-
<a href='<%= base_path %>settings'>
|
19
|
+
<a href='<%= base_path %>settings'>Info</a>
|
20
20
|
<%= button("#{base_path}collect_coverage", 'force coverage collection') %>
|
21
21
|
<%= button("#{base_path}reload_files", 'reload Coverband files') %>
|
22
22
|
<% if Coverband.configuration.web_enable_clear %>
|
data/views/settings.erb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
<!DOCTYPE html>
|
2
2
|
<html xmlns='http://www.w3.org/1999/xhtml'>
|
3
3
|
<head>
|
4
|
-
<title>Coverband
|
4
|
+
<title>Coverband Info: <%= Coverband::VERSION %></title>
|
5
5
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
6
6
|
<script src='<%= assets_path('application.js') %>' type='text/javascript'></script>
|
7
7
|
<link href='<%= assets_path('application.css') %>' media='screen, projection, print' rel='stylesheet' type='text/css'>
|
@@ -12,7 +12,7 @@
|
|
12
12
|
<div id="wrapper" style="">
|
13
13
|
<div id="header">
|
14
14
|
<a href='<%= base_path %>'>Coverband Admin</a>
|
15
|
-
<a href='<%= base_path %>settings'>
|
15
|
+
<a href='<%= base_path %>settings'>Info</a>
|
16
16
|
</div>
|
17
17
|
<div id="content">
|
18
18
|
<dl>
|
@@ -20,6 +20,11 @@
|
|
20
20
|
<dt><%= key %></dt>
|
21
21
|
<dd><%= value %></dd>
|
22
22
|
<% end %>
|
23
|
+
|
24
|
+
<dt>Size (in bytes)</dt>
|
25
|
+
<dd><%= Coverband.configuration.store.size %></dd>
|
26
|
+
<dt>Size (in MiB)</dt>
|
27
|
+
<dd><%= Coverband.configuration.store.size_in_mib %></dd>
|
23
28
|
</dl>
|
24
29
|
</div>
|
25
30
|
<div id="footer">
|
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: 4.1.0
|
4
|
+
version: 4.1.0
|
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: 2019-02-
|
12
|
+
date: 2019-02-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk-s3
|
@@ -257,6 +257,7 @@ files:
|
|
257
257
|
- lib/coverband/reporters/web.rb
|
258
258
|
- lib/coverband/utils/file_groups.rb
|
259
259
|
- lib/coverband/utils/file_list.rb
|
260
|
+
- lib/coverband/utils/file_path_helper.rb
|
260
261
|
- lib/coverband/utils/gem_list.rb
|
261
262
|
- lib/coverband/utils/html_formatter.rb
|
262
263
|
- lib/coverband/utils/lines_classifier.rb
|
@@ -366,9 +367,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
366
367
|
version: '0'
|
367
368
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
368
369
|
requirements:
|
369
|
-
- - "
|
370
|
+
- - ">="
|
370
371
|
- !ruby/object:Gem::Version
|
371
|
-
version:
|
372
|
+
version: '0'
|
372
373
|
requirements: []
|
373
374
|
rubyforge_project:
|
374
375
|
rubygems_version: 2.5.1
|