coverband 4.2.3 → 4.2.4.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/.travis.yml +6 -0
  4. data/README.md +22 -1
  5. data/changes.md +10 -10
  6. data/lib/coverband.rb +12 -7
  7. data/lib/coverband/adapters/base.rb +1 -1
  8. data/lib/coverband/adapters/hash_redis_store.rb +49 -48
  9. data/lib/coverband/collectors/view_tracker.rb +14 -5
  10. data/lib/coverband/configuration.rb +10 -1
  11. data/lib/coverband/reporters/web.rb +6 -0
  12. data/lib/coverband/utils/railtie.rb +16 -9
  13. data/lib/coverband/version.rb +1 -1
  14. data/lua/install.sh +18 -0
  15. data/lua/lib/persist-coverage.lua +28 -0
  16. data/lua/test/bootstrap.lua +5 -0
  17. data/lua/test/harness.lua +19 -0
  18. data/lua/test/redis-call.lua +55 -0
  19. data/lua/test/test-persist-coverage.lua +132 -0
  20. data/test/coverband/adapters/hash_redis_store_test.rb +4 -2
  21. data/test/coverband/adapters/redis_store_test.rb +2 -5
  22. data/test/coverband/collectors/coverage_test.rb +1 -4
  23. data/test/coverband/collectors/view_tracker_test.rb +18 -18
  24. data/test/coverband/configuration_test.rb +10 -10
  25. data/test/coverband/integrations/resque_worker_test.rb +0 -1
  26. data/test/coverband/reporters/base_test.rb +6 -5
  27. data/test/coverband/reporters/console_test.rb +2 -5
  28. data/test/coverband/reporters/html_test.rb +1 -3
  29. data/test/coverband/utils/html_formatter_test.rb +1 -3
  30. data/test/forked/rails_rake_full_stack_test.rb +10 -0
  31. data/test/integration/full_stack_test.rb +1 -3
  32. data/test/rails4_dummy/config/coverband.rb +3 -13
  33. data/test/rails4_dummy/config/coverband_missing_redis.rb +3 -0
  34. data/test/rails5_dummy/config/coverband.rb +3 -1
  35. data/test/rails5_dummy/config/coverband_missing_redis.rb +15 -0
  36. data/test/test_helper.rb +8 -4
  37. data/views/nav.erb +1 -1
  38. data/views/view_tracker.erb +5 -2
  39. metadata +14 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f5ee08a6ec38b97538430db828645f0aab7736c8c51946fea8c44f871c6a4a9
4
- data.tar.gz: 733933d77d75e9e50c09a282f87da2b7cd3b09db9e24679b0267f384ba034c0f
3
+ metadata.gz: 4bab24810b493437a363e010a7a673170bd41f7d4f2e513c337f1955952a4598
4
+ data.tar.gz: fbc2991ab6802666af9461ce3da1c03c07b1cc9e39a84268bc0b0854df45eb67
5
5
  SHA512:
6
- metadata.gz: 68117ba4c4d9dbc9370187e2a31f3b916a0368cb46b915eb7f3e189f1c7bb4f5699d972e176d9a138d999ca59a50e2817658767ccb803f2726dd3fd3f8ff31b4
7
- data.tar.gz: bffb9453d31c0c93ec6706a2c426a6835b713dfc1000c50e030c252a25bd7abdedd95f41622dfc309420aa27276b19afb44cec81a5e2ec20abc35b1768f71541
6
+ metadata.gz: 146c61b557cee78a7bbf9db9481860c8a8833299d580b9f2d56ab77dbc3780f8f2817fcc96a2200c90e37ba0137718c232c30c762e1482f449e325db1a81871d
7
+ data.tar.gz: 5c0b7a3d14539f9d65c33c88ecc9c8c42bc17a02c6c10c03e6aadb3433384b75aff6733ab4957b207b905dbd20369429ee6269922f2710856bfa428a4e998abd
@@ -1,6 +1,7 @@
1
1
  AllCops:
2
2
  TargetRubyVersion: 2.4
3
3
  Exclude:
4
+ - vendor/bundle/**/*
4
5
  - docs/**/*
5
6
  - test/rails4_dummy/**/*
6
7
  - test/rails5_dummy/**/*
@@ -31,6 +32,8 @@ Metrics/ParameterLists:
31
32
  Max: 10
32
33
  Naming/AccessorMethodName:
33
34
  Enabled: false
35
+ Naming/RescuedExceptionsVariableName:
36
+ Enabled: false
34
37
  Naming/PredicateName:
35
38
  Enabled: true
36
39
  Style/TernaryParentheses:
@@ -4,12 +4,18 @@ rvm:
4
4
  - "2.4"
5
5
  - "2.5"
6
6
  - "2.6.1"
7
+ cache:
8
+ bundler: true
9
+ directories:
10
+ - $HOME/lua51
7
11
  gemfile:
8
12
  - Gemfile
9
13
  - Gemfile.rails4
10
14
  services:
11
15
  - redis-server
12
16
  script:
17
+ - sudo ./lua/install.sh
18
+ - $HOME/lua51/bin/busted lua/test/*
13
19
  - bundle exec rake rubocop
14
20
  - COVERBAND_HASH_REDIS_STORE=t bundle exec rake
15
21
  - COVERBAND_HASH_REDIS_STORE=t bundle exec rake forked_tests
data/README.md CHANGED
@@ -169,9 +169,29 @@ Coverband.configure do |config|
169
169
  # and is safe to use if one is investigating issues in production, but it will slightly
170
170
  # hit perf.
171
171
  config.verbose = false
172
+
173
+ # default false. button at the top of the web interface which clears all data
174
+ config.web_enable_clear = true
175
+
176
+ # default false. Experimental support for tracking view layer tracking.
177
+ # Does not track line-level usage, only indicates if an entire file
178
+ # is used or not.
179
+ config.track_views = true
172
180
  end
173
181
  ```
174
182
 
183
+ ### Working with environment variables
184
+
185
+ Do you use figaro, mc-settings, dotenv or something else to inject environment variables into your app? If so ensure you have that done BEFORE coverband is required.
186
+
187
+ For example if you use dotenv, you need to do this, see https://github.com/bkeepers/dotenv#note-on-load-order
188
+
189
+ ```
190
+ gem 'dotenv-rails', require: 'dotenv/rails-now'
191
+ gem 'coverband'
192
+ gem 'other-gem-that-requires-env-variables'
193
+ ```
194
+
175
195
  ### Ignoring Files
176
196
 
177
197
  Sometimes you have files that are known to be valuable perhaps in other environments or something that is just run very infrequently. Opposed to having to mentally filter them out of the report, you can just have them ignored in the Coverband reporting by using `config.ignore` as shown below. Ignore takes a string but can also match with regex rules see how below ignores all rake tasks as an example.
@@ -363,8 +383,9 @@ If you submit a change please make sure the tests and benchmarks are passing.
363
383
 
364
384
  ### Known Issues
365
385
 
366
- - **total fail** on front end code, because of the precompiled template step basically coverage doesn't work well for `erb`, `slim`, and the like.
386
+ - **total fail** on front end code, for line for line coverage, because of the precompiled template step basically coverage doesn't work well for `erb`, `slim`, and the like.
367
387
  - related it will try to report something, but the line numbers reported for `ERB` files are often off and aren't considered useful. I recommend filtering out .erb using the `config.ignore` option. The default configuration excludes these files
388
+ - **NOTE:** We now have file level coverage for view files, but don't support line level detail
368
389
  - coverage doesn't show for Rails `config/application.rb` or `config/boot.rb` as they get loaded when loading the Rake environment prior to starting the `Coverage` library. See [reload files section](#forcing-coverband-to-track-coverage-on-files-loaded-during-boot-safe_reload_files).
369
390
 
370
391
  ### Debugging Redis Store
data/changes.md CHANGED
@@ -76,16 +76,16 @@ Feature Ideas:
76
76
 
77
77
  # Alpha / Beta / Release Candidates
78
78
 
79
- ### Coverband 4.2.2
80
-
81
- - new experimental hash redis store for high volume collection
82
- (hundreds of clients), thanks @kbaum
83
- - view_tracker supports tracking view layer files like `.html.erb`
84
- - documentation improvements, thanks @brossetti1, @jjb, @kbaum
85
- - we now have discordapp for discussions, thanks @kbaum,
86
- https://discordapp.com/channels/609509533999562753/609509533999562756
87
- - perf fix on Rails initialization, thanks @skangg
88
- - simplified logging
79
+ ### Coverband 4.2.4
80
+
81
+ - fixes related to startup without Redis, skipping Coverband on common rake tasks (assets:precompile), etc
82
+ - avoid calls to redis if coverage not updated
83
+ - split out lua work and added testing around lua scripts use for the hash redis store
84
+ - improvements to hash redis store resulting in 25% faster perf
85
+ - avoid duplicate hash calculations
86
+ - debug data now includes md5_hashes
87
+ - added support to download coverage and view data in JSON format
88
+ - documentation about working with environment variables
89
89
 
90
90
  # Released
91
91
 
@@ -99,12 +99,17 @@ module Coverband
99
99
  Coverband::Collectors::Coverage.instance
100
100
  end
101
101
  unless ENV['COVERBAND_DISABLE_AUTO_START']
102
- # Coverband should be setup as early as possible
103
- # to capture usage of things loaded by initializers or other Rails engines
104
- configure
105
- start
106
- require 'coverband/utils/railtie' if defined? ::Rails::Railtie
107
- require 'coverband/integrations/resque' if defined? ::Resque
108
- require 'coverband/integrations/bundler' if defined? ::Bundler
102
+ begin
103
+ # Coverband should be setup as early as possible
104
+ # to capture usage of things loaded by initializers or other Rails engines
105
+ configure
106
+ start
107
+ require 'coverband/utils/railtie' if defined? ::Rails::Railtie
108
+ require 'coverband/integrations/resque' if defined? ::Resque
109
+ require 'coverband/integrations/bundler' if defined? ::Bundler
110
+ rescue Redis::CannotConnectError => error
111
+ Coverband.configuration.logger.info "Redis is not available (#{error}), Coverband not configured"
112
+ Coverband.configuration.logger.info 'If this is a setup task like assets:precompile feel free to ignore'
113
+ end
109
114
  end
110
115
  end
@@ -40,7 +40,7 @@ module Coverband
40
40
  end
41
41
 
42
42
  def size_in_mib
43
- format('%.2f', (size.to_f / 2**20))
43
+ format('%<size>.2f', size: (size.to_f / 2**20))
44
44
  end
45
45
 
46
46
  def save_report(_report)
@@ -1,11 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'securerandom'
4
+
3
5
  module Coverband
4
6
  module Adapters
5
7
  class HashRedisStore < Base
6
8
  FILE_KEY = 'file'
7
9
  FILE_LENGTH_KEY = 'file_length'
8
- META_DATA_KEYS = [DATA_KEY, FIRST_UPDATED_KEY, LAST_UPDATED_KEY].freeze
10
+ META_DATA_KEYS = [DATA_KEY, FIRST_UPDATED_KEY, LAST_UPDATED_KEY, FILE_HASH].freeze
9
11
  ###
10
12
  # This key isn't related to the coverband version, but to the interal format
11
13
  # used to store data to redis. It is changed only when breaking changes to our
@@ -13,6 +15,8 @@ module Coverband
13
15
  ###
14
16
  REDIS_STORAGE_FORMAT_VERSION = 'coverband_hash_3_3'
15
17
 
18
+ JSON_PAYLOAD_EXPIRATION = 5 * 60
19
+
16
20
  attr_reader :redis_namespace
17
21
 
18
22
  def initialize(redis, opts = {})
@@ -22,7 +26,7 @@ module Coverband
22
26
  @redis = redis
23
27
  raise 'HashRedisStore requires redis >= 2.6.0' unless supported?
24
28
 
25
- @ttl = opts[:ttl] || -1
29
+ @ttl = opts[:ttl]
26
30
  @relative_file_converter = opts[:relative_file_converter] || Utils::RelativeFileConverter
27
31
  end
28
32
 
@@ -53,25 +57,27 @@ module Coverband
53
57
  def save_report(report)
54
58
  report_time = Time.now.to_i
55
59
  updated_time = type == Coverband::EAGER_TYPE ? nil : report_time
56
- script_id = hash_incr_script
57
- @redis.pipelined do
58
- keys = report.map do |file, data|
59
- relative_file = @relative_file_converter.convert(file)
60
- file_hash = file_hash(relative_file)
61
- key = key(relative_file, file_hash: file_hash)
62
- script_input = save_report_script_input(
63
- key: key,
64
- file: relative_file,
65
- file_hash: file_hash,
66
- data: data,
67
- report_time: report_time,
68
- updated_time: updated_time
69
- )
70
- @redis.evalsha(script_id, script_input[:keys], script_input[:args])
71
- key
72
- end
73
- @redis.sadd(files_key, keys) if keys.any?
60
+ keys = []
61
+ files_data = report.map do |file, data|
62
+ relative_file = @relative_file_converter.convert(file)
63
+ file_hash = file_hash(relative_file)
64
+ key = key(relative_file, file_hash: file_hash)
65
+ keys << key
66
+ script_input(
67
+ key: key,
68
+ file: relative_file,
69
+ file_hash: file_hash,
70
+ data: data,
71
+ report_time: report_time,
72
+ updated_time: updated_time
73
+ )
74
74
  end
75
+ return unless keys.any?
76
+
77
+ arguments_key = [@redis_namespace, SecureRandom.uuid].compact.join('.')
78
+ @redis.set(arguments_key, { ttl: @ttl, files_data: files_data }.to_json, ex: JSON_PAYLOAD_EXPIRATION)
79
+ @redis.evalsha(hash_incr_script, [arguments_key])
80
+ @redis.sadd(files_key, keys)
75
81
  end
76
82
 
77
83
  def coverage(local_type = nil)
@@ -116,38 +122,33 @@ module Coverband
116
122
  end
117
123
  end
118
124
 
119
- def save_report_script_input(key:, file:, file_hash:, data:, report_time:, updated_time:)
120
- data.each_with_index
121
- .each_with_object(keys: [key], args: [report_time, updated_time, file, file_hash, @ttl, data.length]) do |(coverage, index), hash|
122
- if coverage
123
- hash[:keys] << index
124
- hash[:args] << coverage
125
- end
125
+ def script_input(key:, file:, file_hash:, data:, report_time:, updated_time:)
126
+ coverage_data = data.each_with_index.each_with_object({}) do |(coverage, index), hash|
127
+ hash[index] = coverage if coverage
126
128
  end
129
+ meta = {
130
+ first_updated_at: report_time,
131
+ file: file,
132
+ file_hash: file_hash,
133
+ file_length: data.length,
134
+ hash_key: key
135
+ }
136
+ meta.merge!(last_updated_at: updated_time) if updated_time
137
+ {
138
+ hash_key: key,
139
+ meta: meta,
140
+ coverage: coverage_data
141
+ }
127
142
  end
128
143
 
129
144
  def hash_incr_script
130
- @hash_incr_script ||= @redis.script(:load, <<~LUA)
131
- local first_updated_at = table.remove(ARGV, 1)
132
- local last_updated_at = table.remove(ARGV, 1)
133
- local file = table.remove(ARGV, 1)
134
- local file_hash = table.remove(ARGV, 1)
135
- local ttl = table.remove(ARGV, 1)
136
- local file_length = table.remove(ARGV, 1)
137
- local hash_key = table.remove(KEYS, 1)
138
- redis.call('HMSET', hash_key, '#{LAST_UPDATED_KEY}', last_updated_at, '#{FILE_KEY}', file, '#{FILE_HASH}', file_hash, '#{FILE_LENGTH_KEY}', file_length)
139
- redis.call('HSETNX', hash_key, '#{FIRST_UPDATED_KEY}', first_updated_at)
140
- for i, key in ipairs(KEYS) do
141
- if ARGV[i] == '-1' then
142
- redis.call("HSET", hash_key, key, ARGV[i])
143
- else
144
- redis.call("HINCRBY", hash_key, key, ARGV[i])
145
- end
146
- end
147
- if ttl ~= '-1' then
148
- redis.call("EXPIRE", hash_key, ttl)
149
- end
150
- LUA
145
+ @hash_incr_script ||= @redis.script(:load, lua_script_content)
146
+ end
147
+
148
+ def lua_script_content
149
+ File.read(File.join(
150
+ File.dirname(__FILE__), '../../../lua/lib/persist-coverage.lua'
151
+ ))
151
152
  end
152
153
 
153
154
  def values_from_redis(local_type, files)
@@ -29,10 +29,10 @@ module Coverband
29
29
 
30
30
  @roots = options.fetch(:roots) { Coverband.configuration.all_root_patterns }
31
31
  @roots = @roots.split(',') if @roots.is_a?(String)
32
+ @one_time_timestamp = false
32
33
 
33
34
  @logged_views = []
34
35
  @views_to_record = []
35
- redis_store.set(tracker_time_key, Time.now.to_i) unless redis_store.exists(tracker_time_key)
36
36
  end
37
37
 
38
38
  ###
@@ -79,6 +79,13 @@ module Coverband
79
79
  all_views.reject { |view| view.match(/\/layouts\//) && recently_used_views.any? { |used_view| view.include?(used_view) } }
80
80
  end
81
81
 
82
+ def as_json
83
+ {
84
+ unused_views: unused_views,
85
+ used_views: used_views
86
+ }.to_json
87
+ end
88
+
82
89
  def tracking_since
83
90
  if (tracking_time = redis_store.get(tracker_time_key))
84
91
  Time.at(tracking_time.to_i).iso8601
@@ -100,11 +107,9 @@ module Coverband
100
107
  logged_views.delete(filename)
101
108
  end
102
109
 
103
- def self.supported_version?
104
- defined?(Rails) && defined?(Rails::VERSION) && Rails::VERSION::STRING.split('.').first.to_i >= 4
105
- end
106
-
107
110
  def report_views_tracked
111
+ redis_store.set(tracker_time_key, Time.now.to_i) unless @one_time_timestamp || redis_store.exists(tracker_time_key)
112
+ @one_time_timestamp = true
108
113
  reported_time = Time.now.to_i
109
114
  views_to_record.each do |file|
110
115
  redis_store.hset(tracker_key, file, reported_time)
@@ -116,6 +121,10 @@ module Coverband
116
121
  logger&.error "Coverband: view_tracker failed to store, error #{e.class.name}"
117
122
  end
118
123
 
124
+ def self.supported_version?
125
+ defined?(Rails) && defined?(Rails::VERSION) && Rails::VERSION::STRING.split('.').first.to_i >= 4
126
+ end
127
+
119
128
  protected
120
129
 
121
130
  def newly_seen_file?(file)
@@ -23,7 +23,16 @@ module Coverband
23
23
  IGNORE_TASKS = ['coverband:clear',
24
24
  'coverband:coverage',
25
25
  'coverband:coverage_server',
26
- 'coverband:migrate']
26
+ 'coverband:migrate',
27
+ 'assets:precompile',
28
+ 'db:version',
29
+ 'db:create',
30
+ 'db:drop',
31
+ 'db:seed',
32
+ 'db:setup',
33
+ 'db:structure:dump',
34
+ 'db:structure:load',
35
+ 'db:version']
27
36
 
28
37
  # Heroku when building assets runs code from a dynamic directory
29
38
  # /tmp was added to avoid coverage from /tmp/build directories during
@@ -51,6 +51,8 @@ module Coverband
51
51
  @static.call(env)
52
52
  when %r{\/settings}
53
53
  [200, { 'Content-Type' => 'text/html' }, [settings]]
54
+ when %r{\/view_tracker_data}
55
+ [200, { 'Content-Type' => 'text/json' }, [view_tracker_data]]
54
56
  when %r{\/view_tracker}
55
57
  [200, { 'Content-Type' => 'text/html' }, [view_tracker]]
56
58
  when %r{\/debug_data}
@@ -87,6 +89,10 @@ module Coverband
87
89
  base_path: base_path).format_view_tracker!
88
90
  end
89
91
 
92
+ def view_tracker_data
93
+ Coverband::Collectors::ViewTracker.new(store: Coverband.configuration.store).as_json
94
+ end
95
+
90
96
  def debug_data
91
97
  Coverband.configuration.store.get_coverage_report.to_json
92
98
  end
@@ -11,22 +11,29 @@ module Coverband
11
11
 
12
12
  class Railtie < Rails::Railtie
13
13
  initializer 'coverband.configure' do |app|
14
- app.middleware.use Coverband::BackgroundMiddleware
14
+ begin
15
+ app.middleware.use Coverband::BackgroundMiddleware
15
16
 
16
- if Coverband.configuration.track_views
17
- CoverbandViewTracker = Coverband::Collectors::ViewTracker.new
18
- Coverband.configuration.view_tracker = CoverbandViewTracker
17
+ if Coverband.configuration.track_views
18
+ CoverbandViewTracker = Coverband::Collectors::ViewTracker.new
19
+ Coverband.configuration.view_tracker = CoverbandViewTracker
19
20
 
20
- ActiveSupport::Notifications.subscribe(/render_partial.action_view|render_template.action_view/) do |name, start, finish, id, payload|
21
- CoverbandViewTracker.track_views(name, start, finish, id, payload) unless name.include?('!')
21
+ ActiveSupport::Notifications.subscribe(/render_partial.action_view|render_template.action_view/) do |name, start, finish, id, payload|
22
+ CoverbandViewTracker.track_views(name, start, finish, id, payload) unless name.include?('!')
23
+ end
22
24
  end
25
+ rescue Redis::CannotConnectError => error
26
+ Coverband.configuration.logger.info "Redis is not available (#{error}), Coverband not configured"
27
+ Coverband.configuration.logger.info 'If this is a setup task like assets:precompile feel free to ignore'
23
28
  end
24
29
  end
25
30
 
26
31
  config.after_initialize do
27
- Coverband.eager_loading_coverage!
28
- Coverband.report_coverage
29
- Coverband.runtime_coverage!
32
+ unless Coverband.tasks_to_ignore?
33
+ Coverband.eager_loading_coverage!
34
+ Coverband.report_coverage
35
+ Coverband.runtime_coverage!
36
+ end
30
37
  end
31
38
 
32
39
  rake_tasks do
@@ -5,5 +5,5 @@
5
5
  # use format '4.2.1.rc.1' ~> 4.2.1.rc to prerelease versions like v4.2.1.rc.2 and v4.2.1.rc.3
6
6
  ###
7
7
  module Coverband
8
- VERSION = '4.2.3'
8
+ VERSION = '4.2.4.rc.1'
9
9
  end
@@ -0,0 +1,18 @@
1
+ #!/bin/bash
2
+
3
+ LUA_DIR="$HOME/lua51"
4
+ BUSTED="$LUA_DIR/bin/busted"
5
+
6
+ if [ -f "$BUSTED" ]
7
+ then
8
+ echo "$BUSTED already exists"
9
+ exit 0
10
+ fi
11
+
12
+ pip install hererocks
13
+ hererocks $LUA_DIR -l5.1 -rlatest
14
+ source $LUA_DIR/bin/activate
15
+ lua -v
16
+ for i in luacov busted redis-lua inspect lua-cjson; do
17
+ luarocks install $i;
18
+ done
@@ -0,0 +1,28 @@
1
+ local hmset = function (key, dict)
2
+ if next(dict) == nil then return nil end
3
+ local bulk = {}
4
+ for k, v in pairs(dict) do
5
+ table.insert(bulk, k)
6
+ table.insert(bulk, v)
7
+ end
8
+ return redis.call('HMSET', key, unpack(bulk))
9
+ end
10
+ local payload = cjson.decode(redis.call('get', (KEYS[1])))
11
+ local ttl = payload.ttl
12
+ local files_data = payload.files_data
13
+ redis.call('DEL', KEYS[1])
14
+ for _, file_data in ipairs(files_data) do
15
+
16
+ local hash_key = file_data.hash_key
17
+ local first_updated_at = file_data.meta.first_updated_at
18
+ file_data.meta.first_updated_at = nil
19
+
20
+ hmset(hash_key, file_data.meta)
21
+ redis.call('HSETNX', hash_key, 'first_updated_at', first_updated_at)
22
+ for line, coverage in pairs(file_data.coverage) do
23
+ redis.call("HINCRBY", hash_key, line, coverage)
24
+ end
25
+ if ttl and ttl ~= cjson.null then
26
+ redis.call("EXPIRE", hash_key, ttl)
27
+ end
28
+ end
@@ -0,0 +1,5 @@
1
+ inspect = require "inspect"
2
+ cjson = require 'cjson'
3
+ require './lua/test/redis-call'
4
+
5
+
@@ -0,0 +1,19 @@
1
+ require './lua/test/bootstrap'
2
+
3
+
4
+ KEYS = {}
5
+ ARGV = {}
6
+
7
+
8
+ function call_redis_script(script, keys, argv)
9
+ -- This may not be strictly necessary
10
+ for k,v in pairs(ARGV) do ARGV[k] = nil end
11
+ for k,v in pairs(KEYS) do KEYS[k] = nil end
12
+
13
+ for k,v in pairs(keys) do table.insert(KEYS, v) end
14
+ for k,v in pairs(argv) do table.insert(ARGV, v) end
15
+
16
+ return dofile('./lua/lib/' .. script)
17
+ end
18
+
19
+ return call_redis_script;
@@ -0,0 +1,55 @@
1
+ redis = require 'redis'
2
+
3
+ -- If you have some different host/port change it here
4
+ local host = "127.0.0.1"
5
+ local port = 6379
6
+
7
+
8
+ client = redis.connect(host, port)
9
+
10
+ -- Workaround for absence of redis.call
11
+ redis.call = function(cmd, ...)
12
+ local arg={...}
13
+ local args_string = ''
14
+ for i,v in ipairs(arg) do
15
+ args_string = args_string .. ' ' .. v
16
+ end
17
+ cmd = string.lower(cmd)
18
+ print(cmd .. args_string)
19
+ --local result = assert(load('return client:'.. cmd ..'(...)'))(...)
20
+ local result = assert(loadstring('return client:'.. cmd ..'(...)'))(...)
21
+
22
+ -- The redis-lua library returns some values differently to how `redis.call` works inside redis.
23
+ -- this makes the responses look like those from the builtin redis
24
+ local response_lookup = {
25
+ type = function() return { ["ok"]= result } end,
26
+ sadd = function() return tonumber(result) end,
27
+ zrange = function()
28
+ if type(result) == "table" and type(result[1]) == "table" then
29
+ -- Deal with WITHSCORES...
30
+ local new_result = {}
31
+ for k,v in pairs(result) do
32
+ table.insert(new_result, v[1])
33
+ table.insert(new_result, v[2])
34
+ end
35
+ return new_result;
36
+ end
37
+
38
+ return result;
39
+ end,
40
+ hgetall = function()
41
+ local new_result = {}
42
+ for key, value in pairs(result) do
43
+ table.insert(new_result, key)
44
+ table.insert(new_result, value)
45
+ end
46
+ return new_result
47
+ end
48
+ }
49
+
50
+ if response_lookup[cmd] then
51
+ return response_lookup[cmd]()
52
+ end
53
+
54
+ return result;
55
+ end
@@ -0,0 +1,132 @@
1
+ local call_redis_script = require "./lua/test/harness";
2
+
3
+ describe("persist-coverage", function()
4
+ local function hgetall(hash_key)
5
+ local flat_map = redis.call('HGETALL', hash_key)
6
+ local result = {}
7
+ for i = 1, #flat_map, 2 do
8
+ result[flat_map[i]] = flat_map[i + 1]
9
+ end
10
+ return result
11
+ end
12
+
13
+ local function clean_redis()
14
+ redis.call('flushdb')
15
+ end
16
+
17
+ before_each(function()
18
+ clean_redis()
19
+ end)
20
+
21
+ after_each(function()
22
+ clean_redis()
23
+ end)
24
+
25
+ it("Adds data on multiple files", function()
26
+ local first_updated_at = "1569453853"
27
+ local last_updated_at = first_updated_at
28
+
29
+ local key = 'hash_key'
30
+ local json = cjson.encode({
31
+ ttl = nil,
32
+ files_data = {
33
+ {
34
+ hash_key = "coverband_hash_3_3.coverband_test.runtime../dog.rb.abcd",
35
+ meta = {
36
+ first_updated_at = first_updated_at,
37
+ last_updated_at = last_updated_at,
38
+ file = "./dog.rb",
39
+ file_hash = 'abcd',
40
+ file_length = 3
41
+ },
42
+ coverage = {
43
+ ['0'] = 0,
44
+ ['1'] = 1,
45
+ ['2'] = 2
46
+ }
47
+ },
48
+ {
49
+ hash_key = "coverband_hash_3_3.coverband_test.runtime../fish.rb.1234",
50
+ meta = {
51
+ first_updated_at = first_updated_at,
52
+ last_updated_at = last_updated_at,
53
+ file = "./fish.rb",
54
+ file_hash = '1234',
55
+ file_length = 3
56
+ },
57
+ coverage = {
58
+ ['0'] = 1,
59
+ ['1'] = 0,
60
+ ['2'] = 1
61
+ }
62
+ }
63
+ }
64
+ });
65
+ redis.call( 'set', key, json)
66
+
67
+ call_redis_script('persist-coverage.lua', { key }, {});
68
+ local results = hgetall("coverband_hash_3_3.coverband_test.runtime../dog.rb.abcd")
69
+ assert.are.same({
70
+ ["0"] = "0",
71
+ ["1"] = "1",
72
+ ["2"] = "2",
73
+ file = "./dog.rb",
74
+ file_hash = "abcd",
75
+ file_length = "3",
76
+ first_updated_at = first_updated_at ,
77
+ last_updated_at = last_updated_at
78
+ }, results)
79
+
80
+ results = hgetall("coverband_hash_3_3.coverband_test.runtime../fish.rb.1234")
81
+ assert.are.same({
82
+ ["0"] = "1",
83
+ ["1"] = "0",
84
+ ["2"] = "1",
85
+ file = "./fish.rb",
86
+ file_hash = "1234",
87
+ file_length = "3",
88
+ first_updated_at = first_updated_at ,
89
+ last_updated_at = last_updated_at
90
+ }, results)
91
+
92
+ assert.is_false(false, redis.call('exists', key))
93
+
94
+ last_updated_at = "1569453953"
95
+ json = cjson.encode({
96
+ ttl = nil,
97
+ files_data = {
98
+ {
99
+ hash_key="coverband_hash_3_3.coverband_test.runtime../dog.rb.abcd",
100
+ meta = {
101
+ first_updated_at=first_updated_at,
102
+ last_updated_at=last_updated_at,
103
+ file="./dog.rb",
104
+ file_hash='abcd',
105
+ file_length=3
106
+ },
107
+ coverage = {
108
+ ['0']= 1,
109
+ ['1']= 1,
110
+ ['2']= 1
111
+ }
112
+ }
113
+ }
114
+ })
115
+ redis.call( 'set', key, json )
116
+
117
+ call_redis_script('persist-coverage.lua', { key }, {} );
118
+ results = hgetall("coverband_hash_3_3.coverband_test.runtime../dog.rb.abcd")
119
+ assert.are.same({
120
+ ["0"] = "1",
121
+ ["1"] = "2",
122
+ ["2"] = "3",
123
+ file = "./dog.rb",
124
+ file_hash = "abcd",
125
+ file_length = "3",
126
+ first_updated_at = first_updated_at,
127
+ last_updated_at = last_updated_at
128
+ }, results)
129
+
130
+ assert.is_false(false, redis.call('exists', key))
131
+ end)
132
+ end)
@@ -13,13 +13,12 @@ class HashRedisStoreTest < Minitest::Test
13
13
 
14
14
  def setup
15
15
  super
16
- @redis = Redis.new
16
+ @redis = Coverband::Test.redis
17
17
  # FIXME: remove dependency on configuration and instead pass this in as an argument
18
18
  Coverband.configure do |config|
19
19
  config.root_paths = ['app_path/']
20
20
  end
21
21
  @store = Coverband::Adapters::HashRedisStore.new(@redis, redis_namespace: 'coverband_test', relative_file_converter: MockRelativeFileConverter)
22
- @store.clear!
23
22
  Coverband.configuration.store = @store
24
23
  end
25
24
 
@@ -57,6 +56,7 @@ class HashRedisStoreTest < Minitest::Test
57
56
  {
58
57
  'first_updated_at' => yesterday.to_i,
59
58
  'last_updated_at' => yesterday.to_i,
59
+ 'file_hash' => 'abcd',
60
60
  'data' => [0, 1, 2]
61
61
  },
62
62
  @store.coverage['./dog.rb']
@@ -69,6 +69,7 @@ class HashRedisStoreTest < Minitest::Test
69
69
  {
70
70
  'first_updated_at' => yesterday.to_i,
71
71
  'last_updated_at' => today.to_i,
72
+ 'file_hash' => 'abcd',
72
73
  'data' => [1, 2, 2]
73
74
  },
74
75
  @store.coverage['./dog.rb']
@@ -107,6 +108,7 @@ class HashRedisStoreTest < Minitest::Test
107
108
  {
108
109
  'first_updated_at' => current_time.to_i,
109
110
  'last_updated_at' => current_time.to_i,
111
+ 'file_hash' => 'abcd',
110
112
  'data' => [0, nil, 1, 2]
111
113
  }, @store.coverage['./dog.rb']
112
114
  )
@@ -8,11 +8,8 @@ unless ENV['COVERBAND_HASH_REDIS_STORE']
8
8
 
9
9
  def setup
10
10
  super
11
- Coverband.configuration.redis_namespace = 'coverband_test'
12
- @redis = Redis.new
13
- @store = Coverband::Adapters::RedisStore.new(@redis, redis_namespace: 'coverband_test')
14
- Coverband.configuration.store = @store
15
- @store.clear!
11
+ @store = Coverband.configuration.store
12
+ @redis = @store.instance_variable_get(:@redis)
16
13
  end
17
14
 
18
15
  def test_coverage
@@ -7,10 +7,7 @@ class CollectorsCoverageTest < Minitest::Test
7
7
 
8
8
  def setup
9
9
  super
10
- Coverband.configure do |config|
11
- config.store = Coverband::Adapters::RedisStore.new(Redis.new, redis_namespace: 'coverband_test')
12
- end
13
- @coverband = Coverband::Collectors::Coverage.instance.reset_instance
10
+ @coverband = Coverband::Collectors::Coverage.instance
14
11
  # preload first coverage hit
15
12
  @coverband.report_coverage
16
13
  end
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path('../../test_helper', File.dirname(__FILE__))
2
4
 
3
5
  class ReporterTest < Minitest::Test
4
-
5
6
  def tracker_key
6
7
  'render_tracker_2'
7
8
  end
@@ -11,75 +12,75 @@ class ReporterTest < Minitest::Test
11
12
  fake_store.raw_store.del(tracker_key)
12
13
  end
13
14
 
14
- test "init correctly" do
15
+ test 'init correctly' do
15
16
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
16
- tracker = Coverband::Collectors::ViewTracker.new(:store => fake_store, :roots => 'dir')
17
+ tracker = Coverband::Collectors::ViewTracker.new(store: fake_store, roots: 'dir')
17
18
  assert_equal 'dir', tracker.roots.first
18
- assert tracker.store != nil
19
+ assert !tracker.store.nil?
19
20
  assert_equal [], tracker.target
20
21
  assert_equal [], tracker.logged_views
21
22
  end
22
23
 
23
- test "track partials" do
24
+ test 'track partials' do
24
25
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
25
26
  store = fake_store
26
27
  file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
27
28
  store.raw_store.expects(:hset).with(tracker_key, file_path, anything)
28
29
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
29
- tracker.track_views('name', 'start', 'finish', 'id', {:identifier => file_path})
30
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: file_path)
30
31
  tracker.report_views_tracked
31
32
  assert_equal [file_path], tracker.logged_views
32
33
  end
33
34
 
34
- test "track layouts" do
35
+ test 'track layouts' do
35
36
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
36
37
  store = fake_store
37
38
  file_path = "#{File.expand_path(Coverband.configuration.root)}/layout"
38
39
  store.raw_store.expects(:hset).with(tracker_key, file_path, anything)
39
40
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
40
- tracker.track_views('name', 'start', 'finish', 'id', {:layout => file_path})
41
+ tracker.track_views('name', 'start', 'finish', 'id', layout: file_path)
41
42
  tracker.report_views_tracked
42
43
  assert_equal [file_path], tracker.logged_views
43
44
  end
44
45
 
45
- test "report used partials" do
46
+ test 'report used partials' do
46
47
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
47
48
  store = fake_store
48
49
  file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
49
50
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
50
- tracker.track_views('name', 'start', 'finish', 'id', {:identifier => file_path})
51
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: file_path)
51
52
  tracker.report_views_tracked
52
53
  assert_equal [file_path], tracker.used_views.keys
53
54
  end
54
55
 
55
- test "report unused partials" do
56
+ test 'report unused partials' do
56
57
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
57
58
  store = fake_store
58
59
  file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
59
60
  target = [file_path, 'not_used']
60
61
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir', target: target)
61
- tracker.track_views('name', 'start', 'finish', 'id', {:identifier => file_path})
62
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: file_path)
62
63
  tracker.report_views_tracked
63
64
  assert_equal ['not_used'], tracker.unused_views
64
65
  end
65
66
 
66
- test "reset store" do
67
+ test 'reset store' do
67
68
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
68
69
  store = fake_store
69
70
  store.raw_store.expects(:del).with(tracker_key)
70
71
  store.raw_store.expects(:del).with('render_tracker_time')
71
72
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
72
- tracker.track_views('name', 'start', 'finish', 'id', {:identifier => 'file'})
73
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: 'file')
73
74
  tracker.reset_recordings
74
75
  end
75
76
 
76
- test "clear_file" do
77
+ test 'clear_file' do
77
78
  Coverband::Collectors::ViewTracker.expects(:supported_version?).returns(true)
78
79
  store = fake_store
79
80
  file_path = "#{File.expand_path(Coverband.configuration.root)}/file"
80
81
  store.raw_store.expects(:hdel).with(tracker_key, file_path)
81
82
  tracker = Coverband::Collectors::ViewTracker.new(store: store, roots: 'dir')
82
- tracker.track_views('name', 'start', 'finish', 'id', {:identifier => file_path})
83
+ tracker.track_views('name', 'start', 'finish', 'id', identifier: file_path)
83
84
  tracker.clear_file!('file')
84
85
  assert_equal [], tracker.logged_views
85
86
  end
@@ -87,7 +88,6 @@ class ReporterTest < Minitest::Test
87
88
  protected
88
89
 
89
90
  def fake_store
90
- @fake_store ||= Coverband::Adapters::RedisStore.new(Redis.new, redis_namespace: 'coverband_test')
91
+ @fake_store ||= Coverband::Adapters::RedisStore.new(Coverband::Test.redis, redis_namespace: 'coverband_test')
91
92
  end
92
-
93
93
  end
@@ -12,13 +12,13 @@ class BaseTest < Minitest::Test
12
12
  config.root_paths = ['/app_path/']
13
13
  config.ignore = ['config/envionments']
14
14
  config.reporter = 'std_out'
15
- config.store = Coverband::Adapters::RedisStore.new(Redis.new, redis_namespace: 'coverband_test')
15
+ config.store = Coverband::Adapters::RedisStore.new(Coverband::Test.redis, redis_namespace: 'coverband_test')
16
16
  end
17
17
  end
18
18
 
19
19
  test 'ignore works with equal' do
20
20
  coverband = Coverband::Collectors::Coverage.instance.reset_instance
21
- expected = ["vendor", ".erb$", ".slim$", "/tmp", "internal:prelude", "schema.rb", "config/envionments"]
21
+ expected = ['vendor', '.erb$', '.slim$', '/tmp', 'internal:prelude', 'schema.rb', 'config/envionments']
22
22
  assert_equal expected, Coverband.configuration.ignore
23
23
  end
24
24
 
@@ -27,14 +27,14 @@ class BaseTest < Minitest::Test
27
27
  config.ignore += ['config/initializers']
28
28
  end
29
29
  coverband = Coverband::Collectors::Coverage.instance.reset_instance
30
- expected = ["vendor",
31
- ".erb$",
32
- ".slim$",
33
- "/tmp",
34
- "internal:prelude",
35
- "schema.rb",
36
- "config/envionments",
37
- "config/initializers"]
30
+ expected = ['vendor',
31
+ '.erb$',
32
+ '.slim$',
33
+ '/tmp',
34
+ 'internal:prelude',
35
+ 'schema.rb',
36
+ 'config/envionments',
37
+ 'config/initializers']
38
38
  assert_equal expected, Coverband.configuration.ignore
39
39
  end
40
40
 
@@ -16,7 +16,6 @@ class ResqueWorkerTest < Minitest::Test
16
16
  Coverband.configure do |config|
17
17
  config.background_reporting_enabled = false
18
18
  end
19
- Coverband.configuration.store.instance_variable_set(:@redis_namespace, 'coverband_test')
20
19
  Coverband.start
21
20
  redis = Coverband.configuration.store.instance_eval { @redis }
22
21
  Resque.redis = redis
@@ -3,6 +3,10 @@
3
3
  require File.expand_path('../../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class ReportsBaseTest < Minitest::Test
6
+ def setup
7
+ super
8
+ end
9
+
6
10
  test '#merge_arrays basic merge preserves order and counts' do
7
11
  first = [0, 0, 1, 0, 1]
8
12
  second = [nil, 0, 1, 0, 0]
@@ -28,14 +32,9 @@ class ReportsBaseTest < Minitest::Test
28
32
  end
29
33
 
30
34
  test "#get_current_scov_data_imp doesn't ignore folders with default ignore keys" do
31
- @redis = Redis.new
32
- store = Coverband::Adapters::RedisStore.new(@redis, redis_namespace: 'coverband_test')
33
- store.clear!
34
-
35
35
  Coverband.configure do |config|
36
36
  config.reporter = 'std_out'
37
37
  config.root = '/full/remote_app/path'
38
- config.store = store
39
38
  end
40
39
 
41
40
  key = '/a_path/that_has_erb_in/thepath.rb'
@@ -55,6 +54,7 @@ class ReportsBaseTest < Minitest::Test
55
54
  # rubocop:disable all
56
55
  ###
57
56
  test '#get_current_scov_data_imp merges multiples of file data' do
57
+ skip "@danmayer to take a closer look at this one"
58
58
  coverage = {'/base/66/app/controllers/dashboard_controller.rb' =>
59
59
  {"first_updated_at"=>1549610119,
60
60
  "last_updated_at"=>1549610200,
@@ -88,4 +88,5 @@ class ReportsBaseTest < Minitest::Test
88
88
  "data"=>[38, 38, 38, nil, 38, 38, nil, nil, 38, nil, 38, 80, 80, nil, 80, 80, 80, 80, 80, 80, 80, nil, nil, 38, nil, 38, 80, 55, 0, 0, 0, 0, nil, nil, nil, nil, 0, 0, nil, nil, 38, 80, 80, 80, nil, nil, nil, nil, nil, 38, 80, nil, nil, 38, 80, nil, nil]}
89
89
  assert_equal expected, Coverband::Reporters::Base.send(:get_current_scov_data_imp, store, roots)[:merged][key]
90
90
  end
91
+
91
92
  end
@@ -7,15 +7,12 @@ class HTMLReportTest < Minitest::Test
7
7
 
8
8
  def setup
9
9
  super
10
- @redis = Redis.new
11
- @store = Coverband::Adapters::RedisStore.new(@redis, redis_namespace: 'coverband_test')
12
- @store.clear!
10
+ @store = Coverband.configuration.store
13
11
  end
14
12
 
15
13
  test 'report data' do
16
14
  Coverband.configure do |config|
17
- config.reporter = 'std_out'
18
- config.store = @store
15
+ config.reporter = 'std_out'
19
16
  end
20
17
  Coverband.configuration.logger.stubs('info')
21
18
  mock_file_hash
@@ -5,9 +5,7 @@ require File.expand_path('../../test_helper', File.dirname(__FILE__))
5
5
  class ReportHTMLTest < Minitest::Test
6
6
  def setup
7
7
  super
8
- @redis = Redis.new
9
- @store = Coverband::Adapters::RedisStore.new(@redis, redis_namespace: 'coverband_test')
10
- @store.clear!
8
+ @store = Coverband.configuration.store
11
9
  Coverband.configure do |config|
12
10
  config.store = @store
13
11
  config.root = fixtures_root
@@ -5,9 +5,7 @@ require File.expand_path('../../test_helper', File.dirname(__FILE__))
5
5
  class HTMLFormatterTest < Minitest::Test
6
6
  def setup
7
7
  super
8
- @redis = Redis.new
9
- @store = Coverband::Adapters::RedisStore.new(@redis, redis_namespace: 'coverband_test')
10
- @store.clear!
8
+ @store = Coverband::Adapters::RedisStore.new(Coverband::Test.redis, redis_namespace: 'coverband_test')
11
9
  end
12
10
 
13
11
  test 'generate dynamic content hosted html report' do
@@ -45,4 +45,14 @@ class RailsRakeFullStackTest < Minitest::Test
45
45
  assert_equal empty_hash, coverage_report[:eager_loading]
46
46
  assert_equal empty_hash, coverage_report[:merged]
47
47
  end
48
+
49
+ test "doesn't exit non-zero with error on missing redis" do
50
+ output = `COVERBAND_CONFIG=./test/rails#{Rails::VERSION::MAJOR}_dummy/config/coverband_missing_redis.rb bundle exec rake -f test/rails#{Rails::VERSION::MAJOR}_dummy/Rakefile -T`
51
+ assert_equal 0, $?.to_i
52
+ if ENV['COVERBAND_HASH_REDIS_STORE']
53
+ assert output.match(/Redis is not available/)
54
+ else
55
+ assert output.match(/coverage failed to store/)
56
+ end
57
+ end
48
58
  end
@@ -11,12 +11,10 @@ class FullStackTest < Minitest::Test
11
11
  super
12
12
  Coverband::Collectors::Coverage.instance.reset_instance
13
13
  Coverband.configure do |config|
14
- config.store = Coverband::Adapters::RedisStore.new(Redis.new, redis_namespace: 'coverband_test')
15
14
  config.s3_bucket = nil
16
- config.background_reporting_enabled = true
15
+ config.background_reporting_enabled = false
17
16
  config.track_gems = true
18
17
  end
19
- Coverband.configuration.store.clear!
20
18
  Coverband.start
21
19
  Coverband::Collectors::Coverage.instance.eager_loading!
22
20
  @rack_file = require_unique_file 'fake_app/basic_rack.rb'
@@ -1,13 +1,3 @@
1
- Coverband.configure do |config|
2
- config.root = Dir.pwd
3
- config.store = Coverband::Adapters::RedisStore.new(Redis.new(url: ENV['REDIS_URL']), redis_namespace: 'coverband_test') if defined? Redis
4
- config.ignore = %w[vendor .erb$ .slim$]
5
- config.root_paths = []
6
- config.logger = Rails.logger
7
- config.verbose = true
8
- config.background_reporting_enabled = true
9
- config.track_gems = true
10
- config.gem_details = true
11
- config.use_oneshot_lines_coverage = true if ENV['ONESHOT']
12
- config.simulate_oneshot_lines_coverage = true if ENV['SIMULATE_ONESHOT']
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../rails5_dummy/config/coverband'
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../rails5_dummy/config/coverband_missing_redis'
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Coverband.configure do |config|
2
4
  config.root = Dir.pwd
3
- config.store = Coverband::Adapters::RedisStore.new(Redis.new(url: ENV['REDIS_URL']), redis_namespace: 'coverband_test') if defined? Redis
5
+ config.store = Coverband::Adapters::RedisStore.new(Redis.new(db: 2, url: ENV['REDIS_URL']), redis_namespace: 'coverband_test') if defined? Redis
4
6
  config.ignore = %w[vendor .erb$ .slim$]
5
7
  config.root_paths = []
6
8
  config.logger = Rails.logger
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ Coverband.configure do |config|
4
+ config.root = Dir.pwd
5
+ config.store = Coverband::Adapters::RedisStore.new(Redis.new(db: 2, url: 'redis://127.0.0.1:123'), redis_namespace: 'coverband_test') if defined? Redis
6
+ config.ignore = %w[vendor .erb$ .slim$]
7
+ config.root_paths = []
8
+ config.logger = Rails.logger
9
+ config.verbose = true
10
+ config.background_reporting_enabled = true
11
+ config.track_gems = true
12
+ config.gem_details = true
13
+ config.use_oneshot_lines_coverage = true if ENV['ONESHOT']
14
+ config.simulate_oneshot_lines_coverage = true if ENV['SIMULATE_ONESHOT']
15
+ end
@@ -30,20 +30,24 @@ end
30
30
 
31
31
  module Coverband
32
32
  module Test
33
+ TEST_DB = 2
34
+
35
+ def self.redis
36
+ @redis ||= Redis.new(db: TEST_DB)
37
+ end
38
+
33
39
  def self.reset
34
40
  Coverband.configuration.redis_namespace = 'coverband_test'
35
41
  Coverband.configuration.store.instance_variable_set(:@redis_namespace, 'coverband_test')
36
42
  Coverband.configuration.store.class.class_variable_set(:@@path_cache, {})
37
- %i[eager_loading runtime].each do |type|
38
- Coverband.configuration.store.type = type
39
- Coverband.configuration.store.clear!
40
- end
41
43
  Coverband.configuration.reset
42
44
  Coverband::Collectors::Coverage.instance.reset_instance
43
45
  Coverband::Utils::RelativeFileConverter.reset
44
46
  Coverband::Utils::AbsoluteFileConverter.reset
45
47
  Coverband.configuration.redis_namespace = 'coverband_test'
46
48
  Coverband::Background.stop
49
+ Coverband.configuration.store.instance_variable_set(:@redis, redis)
50
+ redis.flushdb
47
51
  end
48
52
 
49
53
  def setup
@@ -6,7 +6,7 @@
6
6
  <%= button("#{base_path}clear", 'clear coverage report', delete: true) %>
7
7
  <% end %>
8
8
  <% if Coverband.configuration.web_debug %>
9
- <a href='<%= base_path %>debug_data'>Debug Data</a> &nbsp;
9
+ <a href='<%= base_path %>debug_data'>Coverage Data</a> &nbsp;
10
10
  <% end %>
11
11
  </div>
12
12
  <% if notice.to_s.length > 0 %>
@@ -14,11 +14,14 @@
14
14
  <%= display_nav(show_coverage_link: true) %>
15
15
  <div id="content">
16
16
  <% tracker = Coverband::Collectors::ViewTracker.new(store: Coverband.configuration.store) %>
17
- <h3>
17
+ <h4>
18
18
  <% if Coverband.configuration.web_enable_clear %>
19
19
  <%= button("#{base_path}clear_view_tracking", 'reset view tracker', delete: true) %>
20
20
  <% end %>
21
- </h3>
21
+ <% if Coverband.configuration.web_debug %>
22
+ <a href='<%= "#{base_path}view_tracker_data" %>'>view tracker data</a>
23
+ <% end %>
24
+ </h4>
22
25
  <h2>Unused Views: (<%= tracker.unused_views.length %>)</h2>
23
26
  <p>These views have not been rendered since recording started at <%= tracker.tracking_since %></p>
24
27
  <ul>
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.2.3
4
+ version: 4.2.4.rc.1
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-09-28 00:00:00.000000000 Z
12
+ date: 2019-10-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk-s3
@@ -304,6 +304,12 @@ files:
304
304
  - lib/coverband/utils/source_file.rb
305
305
  - lib/coverband/utils/tasks.rb
306
306
  - lib/coverband/version.rb
307
+ - lua/install.sh
308
+ - lua/lib/persist-coverage.lua
309
+ - lua/test/bootstrap.lua
310
+ - lua/test/harness.lua
311
+ - lua/test/redis-call.lua
312
+ - lua/test/test-persist-coverage.lua
307
313
  - public/application.css
308
314
  - public/application.js
309
315
  - public/colorbox/border.png
@@ -388,6 +394,7 @@ files:
388
394
  - test/rails4_dummy/config/application.rb
389
395
  - test/rails4_dummy/config/boot.rb
390
396
  - test/rails4_dummy/config/coverband.rb
397
+ - test/rails4_dummy/config/coverband_missing_redis.rb
391
398
  - test/rails4_dummy/config/environment.rb
392
399
  - test/rails4_dummy/config/routes.rb
393
400
  - test/rails4_dummy/config/secrets.yml
@@ -397,6 +404,7 @@ files:
397
404
  - test/rails5_dummy/config.ru
398
405
  - test/rails5_dummy/config/application.rb
399
406
  - test/rails5_dummy/config/coverband.rb
407
+ - test/rails5_dummy/config/coverband_missing_redis.rb
400
408
  - test/rails5_dummy/config/environment.rb
401
409
  - test/rails5_dummy/config/routes.rb
402
410
  - test/rails5_dummy/tmp/.keep
@@ -426,9 +434,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
426
434
  version: '0'
427
435
  required_rubygems_version: !ruby/object:Gem::Requirement
428
436
  requirements:
429
- - - ">="
437
+ - - ">"
430
438
  - !ruby/object:Gem::Version
431
- version: '0'
439
+ version: 1.3.1
432
440
  requirements: []
433
441
  rubygems_version: 3.0.3
434
442
  signing_key:
@@ -493,6 +501,7 @@ test_files:
493
501
  - test/rails4_dummy/config/application.rb
494
502
  - test/rails4_dummy/config/boot.rb
495
503
  - test/rails4_dummy/config/coverband.rb
504
+ - test/rails4_dummy/config/coverband_missing_redis.rb
496
505
  - test/rails4_dummy/config/environment.rb
497
506
  - test/rails4_dummy/config/routes.rb
498
507
  - test/rails4_dummy/config/secrets.yml
@@ -502,6 +511,7 @@ test_files:
502
511
  - test/rails5_dummy/config.ru
503
512
  - test/rails5_dummy/config/application.rb
504
513
  - test/rails5_dummy/config/coverband.rb
514
+ - test/rails5_dummy/config/coverband_missing_redis.rb
505
515
  - test/rails5_dummy/config/environment.rb
506
516
  - test/rails5_dummy/config/routes.rb
507
517
  - test/rails5_dummy/tmp/.keep