coverband 4.0.1 → 4.1.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b7f0d091dfa76cb111bc6e76be9f03a644c9f7c9
4
- data.tar.gz: d326e418b2612a0fd5ea9d17786918d9da90a5df
3
+ metadata.gz: dee2efe6e6763457859da3c235858f9de0a17189
4
+ data.tar.gz: 441347a296e06c2189f02a26b3d966825a90e354
5
5
  SHA512:
6
- metadata.gz: 55288f996b6d5bc015e368c6952daf867b5a21fa0f5a09fdd7bfad3f19f0b11c6e12ca912e6121e315b23a15ca1ac03629552811874f8176ee882b91aafed967
7
- data.tar.gz: 37fc422e6b917dacbede5a143bc2504f1da47dbf528e3164e91661545aa2bccd1c70332a2e8783414986c5bbd89925804c28961f20f321bf0073d034c9f56eaa
6
+ metadata.gz: b9c5b36fbb46b80da1bb4ca4a098d12dbfec941059a1b7eb297d1d77f065674183df7cd115ac965289db3751f2f9595abfe81e947771c6fc4b5a9155726c8c1b
7
+ data.tar.gz: 68e90213cc0af16924c4e681b59e6ac8d77463921ec7ba019ac8b4bc3579805e62a0ad10e51a793a18b3bd037af09a9e13bfb9e245d8a5e9b309b2960d8a70bd
@@ -10,4 +10,8 @@ gemfile:
10
10
  services:
11
11
  - redis-server
12
12
  before_install:
13
- - gem install bundler
13
+ - echo 'this is a hack to clear default bundler and force bundler 1.17.3'
14
+ - rm /home/travis/.rvm/gems/ruby-2.3.7@global/specifications/bundler-2.0.1.gemspec || true
15
+ - gem uninstall bundler || true
16
+ - gem install bundler -v '1.17.3'
17
+ - bundler --version
data/README.md CHANGED
@@ -6,9 +6,9 @@
6
6
  <p align="center">
7
7
  <a href="#key-features">Key Features</a> •
8
8
  <a href="#installation">Installation</a> •
9
- <a href="#configuration">Configuration</a> •
10
- <a href="#coverband-demo">Coverband Demo</a> •
11
- <a href="#how-to-use">How To Use</a> •
9
+ <a href="#coverage-report">Coverage Report</a> •
10
+ <a href="#verify-correct-installation">Verify Correct Installation</a> •
11
+ <a href="#advanced-config">Advanced Config</a> •
12
12
  <a href="#license">License</a> •
13
13
  <a href="/changes.md">Change Log / Roadmap</a>
14
14
  </p>
@@ -28,10 +28,15 @@ The primary goal of Coverband is giving deep insight into your production runtim
28
28
  * Development mode, offers deep insight of code usage details (number of LOC execution during single request, etc) during development.
29
29
  * Mountable web interface to easily share reports
30
30
 
31
-
32
31
  # Installation
33
32
 
34
- Coverband should be near zero config for Rails apps, if you have an issue with that, please [file an issue](https://github.com/danmayer/coverband/issues).
33
+ ## Redis
34
+
35
+ Coverband stores coverage data in Redis. The Redis endpoint is looked for in this order:
36
+
37
+ 1. `ENV['COVERBAND_REDIS_URL']`
38
+ 2. `ENV['REDIS_URL']`
39
+ 3. `localhost`
35
40
 
36
41
  ## Gem Installation
37
42
 
@@ -43,10 +48,8 @@ gem 'coverband'
43
48
 
44
49
  ## Rails
45
50
 
46
- The Railtie integration means you shouldn't need to do anything anything else.
51
+ The Railtie integration means you shouldn't need to do anything anything else. If you have an issue with that, please [file an issue](https://github.com/danmayer/coverband/issues).
47
52
 
48
- * By default Coverband will try to stored data to Redis
49
- * Redis endpoint is looked for in this order: `ENV['COVERBAND_REDIS_URL']`, `ENV['REDIS_URL']`, or `localhost`
50
53
 
51
54
  ## Sinatra
52
55
 
@@ -60,65 +63,54 @@ use Coverband::Middleware
60
63
  run ActionController::Dispatcher.new
61
64
  ```
62
65
 
63
- # Report Generation
66
+ # Coverage Report
64
67
 
65
- There are two primary ways to generate and view the report
68
+ Coverband comes with a mountable rack app for viewing reports. For Rails this can be done in `config/routes.rb` with:
66
69
 
67
- ## Rake Tasks
70
+ ```ruby
71
+ Rails.application.routes.draw do
72
+ mount Coverband::Reporters::Web.new, at: '/coverage'
73
+ end
74
+ ```
68
75
 
69
- After installing the gem in Rails you should have these Rake tasks
76
+ But don't forget to *protect your source code with proper authentication*. Something like this when using devise:
70
77
 
71
- ```bash
72
- rake -T coverband
73
- rake coverband:coverage # report runtime Coverband code coverage
74
- rake coverband:clear # reset Coverband coverage data, helpful for development, debugging, etc
78
+ ```ruby
79
+ Rails.application.routes.draw do
80
+ authenticate :user, lambda { |u| u.admin? } do
81
+ mount Coverband::Reporters::Web.new, at: '/coverage'
82
+ end
83
+ end
75
84
  ```
76
85
 
77
- You can view the report different ways, but the easiest is the Rake task which opens the SimpleCov formatted HTML.
78
-
79
- `rake coverband:coverage`
86
+ ### Coverband Web Endpoint
80
87
 
81
- This should auto-open in your browser, but if it doesn't the output file should be in `coverage/index.html`
88
+ The web endpoint is a barebones endpoint that you can either expose direct (after authentication) or you can just link to the actions you wish to expose. The index is intended as a example to showcase all the features.
82
89
 
83
- ## Viewing the Report in App
90
+ ![image](https://raw.github.com/danmayer/coverband/master/docs/coverband_web_update.png)
91
+ > The web index as available on the Coverband Demo site
84
92
 
85
- First setup Coverband to [write reports to S3](#writing-coverband-results-to-s3) you can host the S3 file with a built in rack app in Coverband. Just configure your Rails route `config/routes.rb`
93
+ * __force coverage collection:__ This triggers coverage collection on the current webserver process
94
+ * __reload Coverband files:__ This has Coverband reload files as configured (force reload of some files that might not capture Coverage on boot). This can be used to reload files on demand.
95
+ * __clear coverage report:__ This will clear the coverage data. This wipes out all collected data (__dangerous__)
86
96
 
87
- ```
88
- Rails.application.routes.draw do
89
- # ... lots of routes
90
- mount Coverband::Reporters::Web.new, at: '/coverage'
91
- end
92
- ```
97
+ ### Rake Tasks
93
98
 
94
- __NOTE__: ADD PASSWORD PROTECTION OR YOU CAN EXPOSE ALL YOUR SOURCE CODE
99
+ The rake task generates a report locally and opens a browser pointing to `coverage/index.html`.
95
100
 
96
- It is easy to add basic protection around the coverage data, below shows how you can use devise or basic auth, by adding a bit of code to your `config/routes.rb` file.
101
+ `rake coverband:coverage`
97
102
 
98
- ```
99
- # protect with existing Rails devise configuration
100
- devise_constraint = lambda do |request|
101
- request.env['warden'] && request.env['warden'].authenticate? && request.env['warden'].user.admin?
102
- end
103
+ This is mostly useful in your local development environment.
103
104
 
104
- # protect with http basic auth
105
- # curl --user foo:bar http://localhost:3000/coverage
106
- Rails.application.routes.draw do
107
- # ... lots of routes
105
+ ##### Example Output
108
106
 
109
- # Create a Rack wrapper around the Coverband Web Reporter to support & prompt the user for basic authentication.
110
- AuthenticatedCoverband = Rack::Builder.new do
111
- use Rack::Auth::Basic do |username, password|
112
- username == 'foo' && password == 'bar'
113
- end
107
+ Since Coverband is [Simplecov](https://github.com/colszowka/simplecov) output compatible it should work with any of the `SimpleCov::Formatter`'s available. The output below is produced using the default Simplecov HTML formatter.
114
108
 
115
- run Coverband::Reporters::Web.new
116
- end
109
+ Index Page
110
+ ![image](https://raw.github.com/danmayer/coverband/master/docs/coverband_index.png)
117
111
 
118
- # Connect the wrapper app to your desired endpoint.
119
- mount AuthenticatedCoverband, at: '/coverage'
120
- end
121
- ```
112
+ Details on an example Sinatra app
113
+ ![image](https://raw.github.com/danmayer/coverband/master/docs/coverband_details.png)
122
114
 
123
115
  # Verify Correct Installation
124
116
 
@@ -132,57 +124,19 @@ end
132
124
 
133
125
  Take Coverband for a spin on the live Heroku deployed [Coverband Demo](https://coverband-demo.herokuapp.com/). The [full source code for the demo](https://github.com/danmayer/coverband_demo) is available to help with installation, configuration, and understanding of basic usage.
134
126
 
135
- # How To Use
136
-
137
- Below is my Coverband workflow, which hopefully will help other best use this library.
138
-
139
- * <a href="#installation">Install Coverband</a>
140
- * Start your app and hit a few endpoints
141
- * Validate data collection and code coverage with `rake coverband:coverage`
142
- * If you see app startup and recent visits showing, setup is correct
143
- * I generally configure the mountable web endpoint to [view the data via the web-app](https://github.com/danmayer/coverband#viewing--hosting-s3-coverband-results-in-app)
144
- * After Coverband has been verified to be working on production, I let it run for a few weeks.
145
- * Then I view the report and start submitting PRs for the team to review delete large related sets of code that no longer are in use.
146
-
147
- ### Coverband Web Endpoint
148
-
149
- The web endpoint is a barebones endpoint that you can either expose direct (after authentication) or you can just link to the actions you wish to expose. The index is intended as a example to showcase all the features.
150
-
151
- ![image](https://raw.github.com/danmayer/coverband/master/docs/coverband_web.png)
152
- > The web index as available on the Coverband Demo site
153
-
154
- * __collect data, update report, & view:__ This does everything need to view up to date Coverage
155
- * it triggers a coverage collection on the current webserver process
156
- * it generates a new html coverage report and pushes it to S3
157
- * it then loads that report for you to view
158
- * __view coverage report:__ Don't need to update the data just view the current report
159
- * __update coverage data (collect coverage):__ This triggers coverage collection on the current webserver process
160
- * __update coverage report (rebuild report):__ This will rebuild the HTML report from the latest available data
161
- * __clear coverage report:__ This will clear the coverage data. This wipes out all collected data (__dangerous__)
162
- * __reload Coverband files:__ This has Coverband reload files as configured (force reload of some files that might not capture Coverage on boot)
163
127
 
164
128
  ### Example apps
165
129
 
166
- - [Rails 5.2.x App](https://github.com/danmayer/coverage_demo)
130
+ - [Rails 5.2.x App](https://github.com/danmayer/coverband_demo)
167
131
  - [Sinatra app](https://github.com/danmayer/churn-site)
168
132
  - [Non Rack Ruby app](https://github.com/danmayer/coverband_examples)
169
133
 
170
- ### Example Output
171
-
172
- Since Coverband is [Simplecov](https://github.com/colszowka/simplecov) output compatible it should work with any of the `SimpleCov::Formatter`'s available. The output below is produced using the default Simplecov HTML formatter.
134
+ # Advanced Config
173
135
 
174
- Index Page
175
- ![image](https://raw.github.com/danmayer/coverband/master/docs/coverband_index.png)
176
-
177
- Details on a example Sinatra app
178
- ![image](https://raw.github.com/danmayer/coverband/master/docs/coverband_details.png)
179
136
 
180
- ### Advanced Coverband Config
181
-
182
- You may need to configure Coverband you can either do that passing in all configuration options to `Coverband.configure` in block format, or a simpler style is to call `Coverband.configure` with no params which will load `config/coverband.rb` expecting it to configure the app correctly.
137
+ If you need to configure coverband, this can be done by creating a `config/coverband.rb` file relative to your project root.
183
138
 
184
139
  * See [lib/coverband/configuration.rb](https://github.com/danmayer/coverband/blob/master/lib/coverband/configuration.rb) for all options
185
- * I strongly recommend setting up the S3 report adapter, which can't be automatically configured
186
140
  * By default Coverband will try to stored data to Redis
187
141
  * Redis endpoint is looked for in this order: `ENV['COVERBAND_REDIS_URL']`, `ENV['REDIS_URL']`, or `localhost`
188
142
 
@@ -191,6 +145,8 @@ You may need to configure Coverband you can either do that passing in all config
191
145
  ```ruby
192
146
  #config/coverband.rb
193
147
  Coverband.configure do |config|
148
+ config.store = Coverband::Adapters::RedisStore.new(Redis.new(url: ENV['MY_REDIS_URL']))
149
+ config.logger = Rails.logger
194
150
  # configure S3 integration
195
151
  config.s3_bucket = 'coverband-demo'
196
152
  config.s3_region = 'us-east-1'
@@ -205,6 +161,22 @@ Coverband.configure do |config|
205
161
  end
206
162
  ```
207
163
 
164
+ ### Ignoring Files
165
+
166
+ 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.
167
+
168
+ ```
169
+ config.ignore = ['config/application.rb',
170
+ 'config/boot.rb',
171
+ 'config/puma.rb',
172
+ 'config/schedule.rb',
173
+ 'config/environments/test.rb',
174
+ 'config/environments/development.rb',
175
+ 'config/environments/staging.rb',
176
+ 'config/environments/production.rb',
177
+ 'lib/tasks/*']
178
+ ```
179
+
208
180
  ### Writing Coverband Results to S3
209
181
 
210
182
  If you add some additional Coverband configuration your coverage html report will be written directly to S3, update `config/coverband.rb` like below.
@@ -228,7 +200,7 @@ ENV['AWS_SECRET_ACCESS_KEY']
228
200
 
229
201
  ### Clear Coverage
230
202
 
231
- Now that Coverband uses MD5 hashes there should be no reason to manually clear coverage unless one is testing, changing versions, possibly debugging Coberband itself.
203
+ 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.
232
204
 
233
205
  `rake coverband:clear`
234
206
 
@@ -254,9 +226,9 @@ rake coverband:coverage # report runtime coverband code coverage
254
226
 
255
227
  ### Forcing Coverband to Track Coverage on files loaded during boot `safe_reload_files`
256
228
 
257
- The way Coverband is built it will record and report code usage in production for anything `required` or `loaded` after calling `Coverband.start`. This means some of Rails initial files and Gems are loaded before you can generally call `Coverband.start` for example if you use the `application.rb` to initialize and start Coverband, that file will be reported as having no coverage, as it can't possibly start Coverband before the file is loaded.
229
+ Coverband will report code usage for anything `required` or `loaded` after calling `Coverband.start` which happens automatically when coverband is required. This means some of the files loaded before coverband such as the Rails application.rb will be reported as having no coverage.
258
230
 
259
- The `safe_reload_files` reload option in the configuration options can help to ensure you can track any files you want regardless of them loading before Coverband. For example if I wanted to show the coverage of `config/coverband.rb` which has to be loaded before calling `Coverband.start` I could do that by adding that path to the `safe_reload_files` option.
231
+ The `safe_reload_files` reload option in the configuration options can help to ensure you can track any files regardless of loading before Coverband. For example if I wanted to show the coverage of `config/coverband.rb`, which has to be loaded before calling `Coverband.start`, I could do that by adding that path to the `safe_reload_files` option.
260
232
 
261
233
  ```
262
234
  Coverband.configure do |config|
@@ -265,12 +237,12 @@ Coverband.configure do |config|
265
237
  config.safe_reload_files = ['config/coverband.rb']
266
238
  end
267
239
  ```
268
- By adding any files above you will get reporting on those files as part of your coverage runtime report.
240
+ By adding any files above you will get reporting on those files as part of your coverage runtime report. The files are reloaded when Coverband first starts, you can also trigger a reload via the web interface.
269
241
 
270
242
 
271
243
  ### Collecting Gem / Library Usage
272
244
 
273
- By default Coverband has assumed you are trying to track your application code usage not all the supporting framework and library (Gems) code usage. There has been some good points and reasons folks want to track library usage, for example to find out which Gems they aren't actually using in production. See some of the discussion on [issue 21](https://github.com/danmayer/coverband/issues/21).
245
+ By default Coverband has assumed you are trying to track your application code usage and not all the supporting framework and library (Gems) code usage. There are reasons to track library usage though such as finding out which Gems aren't actually being used within production. See some of the discussion on [issue 21](https://github.com/danmayer/coverband/issues/21).
274
246
 
275
247
  How to collect gem usage with Coverband:
276
248
 
@@ -305,31 +277,6 @@ If you are trying to debug locally wondering what code is being run during a req
305
277
  ...
306
278
  [517, 1617], [516, 38577]]
307
279
 
308
-
309
- ### Conflicting .Simplecov: Issue with Missing or 0% Coverage Report
310
-
311
- If you use SimpleCov to generate code coverage for your tests. You might have setup a `.simplecov` file to help control and focus it's output. Often the settings you want for your test's code coverage report are different than what you want Coverband to be reporting on. Since Coverband uses the SimpleCov HTML formatter to prepare it's report.
312
-
313
- So if you had something like this in a `.simplecov` file in the root of your project, as reported in [issue 83](https://github.com/danmayer/coverband/issues/83)
314
-
315
- ```
316
- require 'simplecov'
317
-
318
- SimpleCov.start do
319
- add_filter 'app/admin'
320
- add_filter '/spec/'
321
- add_filter '/config/'
322
- add_filter '/vendor/'
323
- add_filter 'userevents'
324
- end
325
- ```
326
-
327
- You could see some confusing results... To avoid this issue Coverband has a Rake task that will ignore all Simplecov filters.
328
-
329
- `rake coverband:coverage_no_filters`
330
-
331
- This will build the report after disabling any `.simplecov` applied settings.
332
-
333
280
  # Prerequisites
334
281
 
335
282
  * Coverband 3.0.X+ requires Ruby 2.3+
@@ -361,8 +308,7 @@ If you submit a change please make sure the tests and benchmarks are passing.
361
308
 
362
309
  * __total fail__ on front end code, because of the precompiled template step basically coverage doesn't work well for `erb`, `slim`, and the like.
363
310
  * 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
364
- * If you have SimpleCov filters, you need to clear them prior to generating your coverage report. As the filters will be applied to Coverband as well and can often filter out everything we are recording.
365
- * 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.
311
+ * 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).
366
312
 
367
313
  ### Debugging Redis Store
368
314
 
data/changes.md CHANGED
@@ -24,7 +24,6 @@ Will be the fully modern release that drops maintenance legacy support in favor
24
24
  - add coverage timerange support
25
25
  - Drop Simplecov dependency
26
26
  - improved web reporting
27
- - no longer relying directly on HTML in S3 but dynamically generated from any adapter
28
27
  - lists current config options
29
28
  - eventually allow updating remote config
30
29
  - full theming
@@ -32,7 +31,6 @@ Will be the fully modern release that drops maintenance legacy support in favor
32
31
  - additional adapters: Memcache, S3, and ActiveRecord
33
32
  - add articles / podcasts like prontos readme https://github.com/prontolabs/pronto
34
33
  - Add detailed Gem usage report, if we collect and send gem usage we can give percentage of gem code used, which should help application developers know when to remove gem dependencies (0%) or perhaps inline single methods for little usage (using <= 5%) for example.
35
- - add additional config / protection options on Coverage clear
36
34
  - add meta data information first seen last recorded to the coverage report views (probably need to drop simplecov for that).
37
35
  - more details in this issue: https://github.com/danmayer/coverband/issues/118
38
36
  - Make good video on setup, install, usage
@@ -66,7 +64,7 @@ Feature Ideas:
66
64
 
67
65
  ### Coverband 4.0.2.alpha
68
66
 
69
- - ?
67
+ - default disabled web clear, add config option to allow it
70
68
 
71
69
  # Released
72
70
 
@@ -24,7 +24,6 @@ Gem::Specification.new do |spec|
24
24
  # to test sdk 2 use this one
25
25
  spec.add_development_dependency 'aws-sdk-s3', '~> 1'
26
26
  spec.add_development_dependency 'benchmark-ips'
27
- spec.add_development_dependency 'bundler', '~> 1.3'
28
27
  spec.add_development_dependency 'capybara'
29
28
  spec.add_development_dependency 'm'
30
29
  spec.add_development_dependency 'memory_profiler'
@@ -33,8 +32,7 @@ Gem::Specification.new do |spec|
33
32
  spec.add_development_dependency 'rack'
34
33
  spec.add_development_dependency 'rack-test'
35
34
  spec.add_development_dependency 'rake'
36
- spec.add_development_dependency 'simplecov'
37
-
35
+ spec.add_development_dependency 'resque'
38
36
 
39
37
  # TODO: used for benchmarking and tests I think we have other better benchmarking
40
38
  # perhaps time to drop this and refactor.
@@ -5,6 +5,7 @@ require 'json'
5
5
  require 'redis'
6
6
 
7
7
  require 'coverband/version'
8
+ require 'coverband/at_exit'
8
9
  require 'coverband/configuration'
9
10
  require 'coverband/adapters/base'
10
11
  require 'coverband/adapters/redis_store'
@@ -25,6 +26,7 @@ require 'coverband/integrations/rack_server_check'
25
26
  require 'coverband/reporters/web'
26
27
  require 'coverband/integrations/middleware'
27
28
  require 'coverband/integrations/background'
29
+ require 'coverband/integrations/resque' if defined? Resque
28
30
 
29
31
  module Coverband
30
32
  CONFIG_FILE = './config/coverband.rb'
@@ -51,6 +53,7 @@ module Coverband
51
53
 
52
54
  def self.start
53
55
  Coverband::Collectors::Coverage.instance
56
+ AtExit.register
54
57
  Background.start if configuration.background_reporting_enabled && !RackServerCheck.running?
55
58
  end
56
59
 
@@ -6,7 +6,12 @@ module Coverband
6
6
  # RedisStore store a merged coverage file to redis
7
7
  ###
8
8
  class RedisStore < Base
9
- BASE_KEY = 'coverband3_1'
9
+ ###
10
+ # This key isn't related to the coverband version, but to the interal format
11
+ # used to store data to redis. It is changed only when breaking changes to our
12
+ # redis format are required.
13
+ ###
14
+ REDIS_STORAGE_FORMAT_VERSION = 'coverband3_1'
10
15
 
11
16
  def initialize(redis, opts = {})
12
17
  super()
@@ -24,7 +29,7 @@ module Coverband
24
29
  attr_reader :redis
25
30
 
26
31
  def base_key
27
- @base_key ||= [BASE_KEY, @redis_namespace].compact.join('.')
32
+ @base_key ||= [REDIS_STORAGE_FORMAT_VERSION, @redis_namespace].compact.join('.')
28
33
  end
29
34
 
30
35
  def save_coverage(data)
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coverband
4
+ class AtExit
5
+ @semaphore = Mutex.new
6
+
7
+ def self.register
8
+ return if @at_exit_registered
9
+ @semaphore.synchronize do
10
+ return if @at_exit_registered
11
+ @at_exit_registered = true
12
+ at_exit do
13
+ ::Coverband::Background.stop
14
+ Coverband::Collectors::Coverage.instance.report_coverage(true)
15
+ Coverband.configuration.logger&.debug('Coverband: Reported coverage before exit')
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -7,7 +7,8 @@ module Coverband
7
7
  :reporter, :reporting_frequency,
8
8
  :redis_namespace, :redis_ttl,
9
9
  :safe_reload_files, :background_reporting_enabled,
10
- :background_reporting_sleep_seconds, :test_env
10
+ :background_reporting_sleep_seconds, :test_env,
11
+ :web_enable_clear
11
12
 
12
13
  attr_writer :logger, :s3_region, :s3_bucket, :s3_access_key_id, :s3_secret_access_key
13
14
 
@@ -28,6 +29,7 @@ module Coverband
28
29
  @background_reporting_enabled = true
29
30
  @background_reporting_sleep_seconds = 30
30
31
  @test_env = nil
32
+ @web_enable_clear = false
31
33
 
32
34
  # TODO: should we push these to adapter configs
33
35
  @s3_region = nil
@@ -18,7 +18,6 @@ module Coverband
18
18
 
19
19
  logger = Coverband.configuration.logger
20
20
  @semaphore.synchronize do
21
- binding.pry if defined?($debug) && $debug
22
21
  return if @thread
23
22
  logger&.debug('Coverband: Starting background reporting')
24
23
  sleep_seconds = Coverband.configuration.background_reporting_sleep_seconds
@@ -29,12 +28,6 @@ module Coverband
29
28
  sleep(sleep_seconds)
30
29
  end
31
30
  end
32
- binding.pry if defined?($debug) && $debug
33
- end
34
- at_exit do
35
- stop
36
- Coverband::Collectors::Coverage.instance.report_coverage(true)
37
- logger&.debug('Coverband: Reported coverage before exit')
38
31
  end
39
32
  end
40
33
  end
@@ -9,10 +9,11 @@ module Coverband
9
9
  def call(env)
10
10
  @app.call(env)
11
11
  ensure
12
+ AtExit.register
12
13
  if Coverband.configuration.background_reporting_enabled
13
- Coverband::Background.start
14
+ Background.start
14
15
  else
15
- Coverband::Collectors::Coverage.instance.report_coverage
16
+ Collectors::Coverage.instance.report_coverage
16
17
  end
17
18
  end
18
19
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ Resque.after_fork do |job|
4
+ Coverband.start
5
+ end
6
+
7
+ module Coverband
8
+ module ResqueWorker
9
+ def perform
10
+ super
11
+ ensure
12
+ Coverband::Collectors::Coverage.instance.report_coverage(true)
13
+ end
14
+ end
15
+ end
16
+
17
+ Resque::Job.prepend(Coverband::ResqueWorker)
18
+
@@ -1,6 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rack'
3
+ begin
4
+ require 'rack'
5
+ rescue LoadError
6
+ end
4
7
 
5
8
  module Coverband
6
9
  module Reporters
@@ -32,7 +35,7 @@ module Coverband
32
35
  case request.path_info
33
36
  when /.*\.(css|js|gif|png)/
34
37
  @static.call(env)
35
- when %r{\/}
38
+ when %r{\/$}
36
39
  [200, { 'Content-Type' => 'text/html' }, [index]]
37
40
  else
38
41
  [404, { 'Content-Type' => 'text/html' }, ['404 error!']]
@@ -57,8 +60,12 @@ module Coverband
57
60
  end
58
61
 
59
62
  def clear
60
- Coverband.configuration.store.clear!
61
- notice = 'coverband coverage cleared'
63
+ if Coverband.configuration.web_enable_clear
64
+ Coverband.configuration.store.clear!
65
+ notice = 'coverband coverage cleared'
66
+ else
67
+ notice = 'web_enable_clear isnt enabled in your configuration'
68
+ end
62
69
  [301, { 'Location' => "#{base_path}?notice=#{notice}" }, []]
63
70
  end
64
71
 
@@ -56,7 +56,7 @@ module Coverband
56
56
 
57
57
  def asset_output_path
58
58
  return @asset_output_path if defined?(@asset_output_path) && @asset_output_path
59
- @asset_output_path = File.join(output_path, 'assets', Coverband::VERSION)
59
+ @asset_output_path = File.join(output_path)
60
60
  FileUtils.mkdir_p(@asset_output_path)
61
61
  @asset_output_path
62
62
  end
@@ -123,8 +123,10 @@ module Coverband
123
123
  "<abbr class=\"timeago\" title=\"#{time.iso8601}\">#{time.iso8601}</abbr>"
124
124
  end
125
125
 
126
+ # a bug that existed in simplecov was not checking that root was at the start of the file name
127
+ # I had previously patched this in my local Rails app
126
128
  def shortened_filename(source_file)
127
- source_file.filename.sub(Coverband.configuration.root, '.').gsub(/^\.\//, '')
129
+ source_file.filename.sub(%r{^#{Coverband.configuration.root}}, '.').gsub(/^\.\//, '')
128
130
  end
129
131
 
130
132
  def link_to_source_file(source_file)
@@ -3,27 +3,17 @@
3
3
  namespace :coverband do
4
4
  Coverband.configure
5
5
 
6
- ###
7
- # NOTE: If your project has set many simplecov filters.
8
- # You might want to override them and clear the filters.
9
- # Or run the task `coverage_no_filters` below.
10
- ###
11
- desc 'report runtime Coverband code coverage'
12
- task coverage: :environment do
13
- if Coverband.configuration.reporter == 'scov'
14
- Coverband::Reporters::HTMLReport.report(Coverband.configuration.store)
15
- else
16
- Coverband::Reporters::ConsoleReport.report(Coverband.configuration.store)
17
- end
6
+ def environment
7
+ Rake.application['environment'].invoke if Rake::Task.task_defined?('environment')
18
8
  end
19
9
 
20
- desc 'report runtime coverband code coverage after disabling simplecov filters'
21
- task coverage_no_filters: :environment do
10
+ desc 'report runtime Coverband code coverage'
11
+ task :coverage do
12
+ environment
22
13
  if Coverband.configuration.reporter == 'scov'
23
- clear_simplecov_filters
24
14
  Coverband::Reporters::HTMLReport.report(Coverband.configuration.store)
25
15
  else
26
- puts 'coverage without filters only makes sense for SimpleCov reports'
16
+ Coverband::Reporters::ConsoleReport.report(Coverband.configuration.store)
27
17
  end
28
18
  end
29
19
 
@@ -31,7 +21,8 @@ namespace :coverband do
31
21
  # clear data helpful for development or after configuration issues
32
22
  ###
33
23
  desc 'reset Coverband coverage data, helpful for development, debugging, etc'
34
- task clear: :environment do
24
+ task :clear do
25
+ environment
35
26
  Coverband.configuration.store.clear!
36
27
  end
37
28
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Coverband
4
- VERSION = '4.0.1'
4
+ VERSION = '4.1.0.alpha'
5
5
  end
@@ -14,17 +14,12 @@ require 'mocha/minitest'
14
14
  require 'ostruct'
15
15
  require 'json'
16
16
  require 'redis'
17
+ require 'resque'
17
18
  require 'pry-byebug'
18
19
  $VERBOSE = original_verbosity
19
20
 
20
21
  Coveralls.wear!
21
22
 
22
- SimpleCov.start do
23
- add_filter 'specs/ruby/1.9.1/gems/'
24
- add_filter '/test/'
25
- add_filter '/config/'
26
- end
27
-
28
23
  module Coverband
29
24
  module Test
30
25
  def self.reset
@@ -3,7 +3,7 @@
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class RedisTest < Minitest::Test
6
- BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
6
+ REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
7
7
 
8
8
  def setup
9
9
  super
@@ -46,7 +46,7 @@ class RedisTest < Minitest::Test
46
46
  end
47
47
 
48
48
  def test_clear
49
- @redis.expects(:del).with(BASE_KEY).once
49
+ @redis.expects(:del).with(REDIS_STORAGE_FORMAT_VERSION).once
50
50
  @store.clear!
51
51
  end
52
52
 
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
4
+
5
+ class AtExitTest < Minitest::Test
6
+ test 'only registers once' do
7
+ Coverband::AtExit.instance_eval { @at_exit_registered = nil }
8
+ Coverband::AtExit.expects(:at_exit).yields.once.returns(true)
9
+ 2.times { Coverband::AtExit.register }
10
+ end
11
+ end
12
+
13
+
@@ -22,7 +22,6 @@ class BackgroundTest < Minitest::Test
22
22
  Thread.expects(:new).yields.returns(ThreadDouble.new)
23
23
  Coverband::Background.expects(:loop).yields
24
24
  Coverband::Background.expects(:sleep).with(30)
25
- Coverband::Background.expects(:at_exit).returns(false)
26
25
  Coverband::Collectors::Coverage.instance.expects(:report_coverage).once
27
26
  2.times { Coverband::Background.start }
28
27
  end
@@ -20,4 +20,27 @@ class BaseTest < Minitest::Test
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
+
24
+ test 's3 options' do
25
+ Coverband::Collectors::Coverage.instance.reset_instance
26
+ Coverband.configure do |config|
27
+ config.s3_bucket = 'bucket'
28
+ config.s3_region = 'region'
29
+ config.s3_access_key_id = 'key_id'
30
+ config.s3_secret_access_key = 'secret'
31
+ end
32
+ assert_equal 'bucket', Coverband.configuration.s3_bucket
33
+ assert_equal 'region', Coverband.configuration.s3_region
34
+ assert_equal 'key_id', Coverband.configuration.s3_access_key_id
35
+ assert_equal 'secret', Coverband.configuration.s3_secret_access_key
36
+ end
37
+
38
+ test 'store raises issues' do
39
+ Coverband::Collectors::Coverage.instance.reset_instance
40
+ assert_raises RuntimeError do
41
+ Coverband.configure do |config|
42
+ config.store = 'fake'
43
+ end
44
+ end
45
+ end
23
46
  end
@@ -4,10 +4,11 @@ require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
  require 'rack'
5
5
 
6
6
  class FullStackTest < Minitest::Test
7
- BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
7
+ REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
8
8
  TEST_RACK_APP = '../fake_app/basic_rack.rb'
9
9
 
10
10
  def setup
11
+ super
11
12
  Coverband::Collectors::Coverage.instance.reset_instance
12
13
  Coverband.configure do |config|
13
14
  config.reporting_frequency = 100.0
@@ -35,11 +36,6 @@ class FullStackTest < Minitest::Test
35
36
  sleep(0.1)
36
37
  expected = [nil, nil, 1, nil, 1, 1, 2, nil, nil]
37
38
  assert_equal expected, Coverband.configuration.store.coverage[@rack_file]['data']
38
-
39
- # expected = nil
40
- # TODO: read the html to test it matches expectations? or return data as a hash?
41
- # actual = Coverband::Reporters::HTMLReport.report(Coverband.configuration.store, open_report: false)
42
- # assert_equal expected, actual
43
39
  end
44
40
 
45
41
  private
@@ -4,7 +4,7 @@ require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
  require 'rack'
5
5
 
6
6
  class MiddlewareTest < Minitest::Test
7
- BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
7
+ REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
8
8
 
9
9
  def setup
10
10
  super
@@ -3,7 +3,7 @@
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class HTMLReportTest < Minitest::Test
6
- BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
6
+ REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
7
7
 
8
8
  def setup
9
9
  super
@@ -3,7 +3,7 @@
3
3
  require File.expand_path('../test_helper', File.dirname(__FILE__))
4
4
 
5
5
  class ReportHTMLTest < Minitest::Test
6
- BASE_KEY = Coverband::Adapters::RedisStore::BASE_KEY
6
+ REDIS_STORAGE_FORMAT_VERSION = Coverband::Adapters::RedisStore::REDIS_STORAGE_FORMAT_VERSION
7
7
 
8
8
  def setup
9
9
  super
@@ -12,7 +12,7 @@ class ReportHTMLTest < Minitest::Test
12
12
  @store.clear!
13
13
  end
14
14
 
15
- test 'generate scov report' do
15
+ test 'generate scov html report' do
16
16
  Coverband.configure do |config|
17
17
  config.reporter = 'scov'
18
18
  config.store = @store
@@ -23,7 +23,24 @@ class ReportHTMLTest < Minitest::Test
23
23
  @store.send(:save_report, basic_coverage)
24
24
 
25
25
  html = Coverband::Reporters::HTMLReport.report(@store,
26
- html: true, open_report: false)
26
+ html: true,
27
+ open_report: false)
27
28
  assert_match 'Generated by', html
28
29
  end
30
+
31
+ test 'generate scov report file' do
32
+ Coverband.configure do |config|
33
+ config.reporter = 'scov'
34
+ config.store = @store
35
+ config.s3_bucket = nil
36
+ config.ignore = ['notsomething.rb']
37
+ end
38
+ mock_file_hash
39
+ @store.send(:save_report, basic_coverage)
40
+
41
+ Coverband::Utils::HTMLFormatter.any_instance.expects(:format!).once
42
+ Coverband::Reporters::HTMLReport.report(@store,
43
+ html: false,
44
+ open_report: false)
45
+ end
29
46
  end
@@ -21,18 +21,31 @@ if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.2.0')
21
21
  Coverband.configuration.s3_bucket = nil
22
22
  end
23
23
 
24
- # TODO: add tests for all endpoints
25
24
  test 'renders index content' do
26
25
  get '/'
27
26
  assert last_response.ok?
28
27
  assert_match 'Coverband Admin', last_response.body
29
28
  end
30
29
 
31
- test 'renders show content' do
32
- Coverband::Reporters::HTMLReport.expects(:report).returns('content')
30
+ test 'renders 404' do
33
31
  get '/show'
34
- assert last_response.ok?
35
- assert_equal 'content', last_response.body
32
+ assert last_response.not_found?
33
+ assert_equal '404 error!', last_response.body
34
+ end
35
+
36
+ test 'clears coverband' do
37
+ post '/clear'
38
+ assert_equal 301, last_response.status
39
+ end
40
+
41
+ test 'collect_coverage' do
42
+ post '/collect_coverage'
43
+ assert_equal 301, last_response.status
44
+ end
45
+
46
+ test 'reload_files' do
47
+ post '/reload_files'
48
+ assert_equal 301, last_response.status
36
49
  end
37
50
  end
38
51
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
4
+
5
+ class ResqueWorkerTest < Minitest::Test
6
+ def enqueue_and_run_job
7
+ Resque.enqueue(TestResqueJob)
8
+ queue = ENV['QUEUE'] ='resque_coverband'
9
+ Resque::Worker.new.work_one_job
10
+ end
11
+
12
+ def setup
13
+ super
14
+ Coverband.configure do |config|
15
+ config.background_reporting_enabled = false
16
+ end
17
+ Coverband.start
18
+ redis = Coverband.configuration.store.send(:redis)
19
+ Resque.redis = redis
20
+ end
21
+
22
+ test 'resque job coverage' do
23
+ resque_job_file = File.expand_path('./test_resque_job.rb', File.dirname(__FILE__))
24
+ require resque_job_file
25
+
26
+ #report after loading the file in parent process
27
+ Coverband::Collectors::Coverage.instance.report_coverage(true)
28
+
29
+ enqueue_and_run_job
30
+
31
+ puts "assert_equal 1, Coverband.configuration.store.coverage['#{resque_job_file}']['data'][4]"
32
+ assert_equal 1, Coverband.configuration.store.coverage[resque_job_file]['data'][4]
33
+ end
34
+ end
35
+
@@ -0,0 +1,7 @@
1
+ class TestResqueJob
2
+ @queue = :resque_coverband
3
+
4
+ def self.perform
5
+ "resque job perform"
6
+ end
7
+ end
@@ -18,7 +18,9 @@
18
18
  <a href='<%= base_path %>'>Coverband Admin</a> &nbsp;
19
19
  <%= button("#{base_path}collect_coverage", 'force coverage collection') %> &nbsp;
20
20
  <%= button("#{base_path}reload_files", 'reload Coverband files') %> &nbsp;
21
- <%= button("#{base_path}clear", 'clear coverage report', delete: true) %>
21
+ <% if Coverband.configuration.web_enable_clear %>
22
+ <%= button("#{base_path}clear", 'clear coverage report', delete: true) %>
23
+ <% end %>
22
24
  </div>
23
25
  <% if notice.to_s.length > 0 %>
24
26
  <div class="notice"><%= notice %></div>
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.0.1
4
+ version: 4.1.0.alpha
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: 2018-12-30 00:00:00.000000000 Z
12
+ date: 2019-02-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: aws-sdk-s3
@@ -39,20 +39,6 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
- - !ruby/object:Gem::Dependency
43
- name: bundler
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - "~>"
47
- - !ruby/object:Gem::Version
48
- version: '1.3'
49
- type: :development
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - "~>"
54
- - !ruby/object:Gem::Version
55
- version: '1.3'
56
42
  - !ruby/object:Gem::Dependency
57
43
  name: capybara
58
44
  requirement: !ruby/object:Gem::Requirement
@@ -166,7 +152,7 @@ dependencies:
166
152
  - !ruby/object:Gem::Version
167
153
  version: '0'
168
154
  - !ruby/object:Gem::Dependency
169
- name: simplecov
155
+ name: resque
170
156
  requirement: !ruby/object:Gem::Requirement
171
157
  requirements:
172
158
  - - ">="
@@ -258,11 +244,13 @@ files:
258
244
  - lib/coverband/adapters/base.rb
259
245
  - lib/coverband/adapters/file_store.rb
260
246
  - lib/coverband/adapters/redis_store.rb
247
+ - lib/coverband/at_exit.rb
261
248
  - lib/coverband/collectors/coverage.rb
262
249
  - lib/coverband/configuration.rb
263
250
  - lib/coverband/integrations/background.rb
264
251
  - lib/coverband/integrations/middleware.rb
265
252
  - lib/coverband/integrations/rack_server_check.rb
253
+ - lib/coverband/integrations/resque.rb
266
254
  - lib/coverband/reporters/base.rb
267
255
  - lib/coverband/reporters/console_report.rb
268
256
  - lib/coverband/reporters/html_report.rb
@@ -331,6 +319,7 @@ files:
331
319
  - test/unit/adapters_base_test.rb
332
320
  - test/unit/adapters_file_store_test.rb
333
321
  - test/unit/adapters_redis_store_test.rb
322
+ - test/unit/at_exit_test.rb
334
323
  - test/unit/background_test.rb
335
324
  - test/unit/collectors_coverage_test.rb
336
325
  - test/unit/configuration_test.rb
@@ -344,6 +333,8 @@ files:
344
333
  - test/unit/reports_console_test.rb
345
334
  - test/unit/reports_html_test.rb
346
335
  - test/unit/reports_web_test.rb
336
+ - test/unit/resque_worker_test.rb
337
+ - test/unit/test_resque_job.rb
347
338
  - test/unit/utils/file_list_test.rb
348
339
  - test/unit/utils/lines_classifier_test.rb
349
340
  - test/unit/utils/result_test.rb
@@ -368,12 +359,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
368
359
  version: '0'
369
360
  required_rubygems_version: !ruby/object:Gem::Requirement
370
361
  requirements:
371
- - - ">="
362
+ - - ">"
372
363
  - !ruby/object:Gem::Version
373
- version: '0'
364
+ version: 1.3.1
374
365
  requirements: []
375
366
  rubyforge_project:
376
- rubygems_version: 2.5.1
367
+ rubygems_version: 2.5.2.3
377
368
  signing_key:
378
369
  specification_version: 4
379
370
  summary: Rack middleware to help measure production code usage (LOC runtime usage)
@@ -409,6 +400,7 @@ test_files:
409
400
  - test/unit/adapters_base_test.rb
410
401
  - test/unit/adapters_file_store_test.rb
411
402
  - test/unit/adapters_redis_store_test.rb
403
+ - test/unit/at_exit_test.rb
412
404
  - test/unit/background_test.rb
413
405
  - test/unit/collectors_coverage_test.rb
414
406
  - test/unit/configuration_test.rb
@@ -422,6 +414,8 @@ test_files:
422
414
  - test/unit/reports_console_test.rb
423
415
  - test/unit/reports_html_test.rb
424
416
  - test/unit/reports_web_test.rb
417
+ - test/unit/resque_worker_test.rb
418
+ - test/unit/test_resque_job.rb
425
419
  - test/unit/utils/file_list_test.rb
426
420
  - test/unit/utils/lines_classifier_test.rb
427
421
  - test/unit/utils/result_test.rb