coverband 0.0.14 → 0.0.15

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.
data/README.md CHANGED
@@ -65,11 +65,7 @@ Either add the below to your `Rakefile` or to a file included in your Rakefile
65
65
 
66
66
  desc "report unused lines"
67
67
  task :coverband => :environment do
68
- baseline = JSON.parse(File.read('./tmp/coverband_baseline.json'))
69
-
70
- root_paths = ['/app/']
71
- coverband_options = {:existing_coverage => baseline, :roots => root_paths}
72
- Coverband::Reporter.report(Redis.new, coverband_options)
68
+ Coverband::Reporter
73
69
  end
74
70
 
75
71
  desc "get coverage baseline"
data/lib/coverband.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'redis'
2
2
 
3
3
  require 'coverband/version'
4
+ require 'coverband/redis_store'
4
5
  require 'coverband/base'
5
6
  require 'coverband/reporter'
6
7
  require 'coverband/middleware'
@@ -17,11 +18,12 @@ module Coverband
17
18
  end
18
19
 
19
20
  class Configuration
20
- attr_accessor :redis, :coverage_baseline, :root_paths, :root, :ignore, :percentage, :verbose, :reporter
21
+ attr_accessor :redis, :coverage_baseline, :root_paths, :root, :ignore, :percentage, :verbose, :reporter, :stats
21
22
 
22
23
  def initialize
23
24
  @root = Dir.pwd
24
25
  @redis = nil
26
+ @stats = nil
25
27
  @coverage_baseline = {}
26
28
  @root_paths = []
27
29
  @ignore = []
@@ -4,12 +4,13 @@ module Coverband
4
4
  def initialize(options = {})
5
5
  @project_directory = File.expand_path(Coverband.configuration.root)
6
6
  @enabled = false
7
- @function_set = false
7
+ @tracer_set = false
8
8
  @files = {}
9
9
  @ignore_patterns = Coverband.configuration.ignore
10
10
  @sample_percentage = Coverband.configuration.percentage
11
- @reporter = Coverband.configuration.redis
12
- @verbose = Coverband.configuration.verbose
11
+ @reporter = Coverband::RedisStore.new(Coverband.configuration.redis) if Coverband.configuration.redis
12
+ @stats = Coverband.configuration.stats
13
+ @verbose = Coverband.configuration.verbose
13
14
  end
14
15
 
15
16
  def start
@@ -19,10 +20,7 @@ module Coverband
19
20
 
20
21
  def stop
21
22
  @enabled = false
22
- if @function_set
23
- set_trace_func(nil)
24
- @function_set = false
25
- end
23
+ unset_tracer
26
24
  end
27
25
 
28
26
  def sample
@@ -50,17 +48,31 @@ module Coverband
50
48
 
51
49
  def record_coverage
52
50
  if @enabled
53
- unless @function_set
54
- set_trace_func proc { |event, file, line, id, binding, classname|
55
- add_file(file, line)
56
- }
57
- @function_set = true
58
- end
51
+ set_tracer
59
52
  else
60
- if @function_set
61
- set_trace_func(nil)
62
- @function_set = false
63
- end
53
+ unset_tracer
54
+ end
55
+ @stats.increment "coverband.request.recorded.#{@enabled}" if @stats
56
+ rescue RuntimeError => err
57
+ if @verbose
58
+ puts "error stating recording coverage"
59
+ puts "error: #{err.inspect} #{err.message}"
60
+ end
61
+ end
62
+
63
+ def set_tracer
64
+ unless @tracer_set
65
+ set_trace_func proc { |event, file, line, id, binding, classname|
66
+ add_file(file, line)
67
+ }
68
+ @tracer_set = true
69
+ end
70
+ end
71
+
72
+ def unset_tracer
73
+ if @tracer_set
74
+ set_trace_func(nil)
75
+ @tracer_set = false
64
76
  end
65
77
  end
66
78
 
@@ -76,42 +88,31 @@ module Coverband
76
88
  end
77
89
 
78
90
  def report_coverage
79
- begin
80
- if @enabled
81
- if @function_set
82
- set_trace_func(nil)
83
- @function_set = false
84
- end
85
- if @reporter
86
- if @reporter.class.name.match(/redis/i)
87
- #"/Users/danmayer/projects/cover_band_server/app.rb"=>[54, 55]
88
- @files.each_pair do |key, values|
89
- @reporter.sadd "coverband", key
90
- #clean this up but redis gem v2.x doesn't allow sadd with a collection, this is slow
91
- if @reporter.inspect.match(/v2/)
92
- values.each do |value|
93
- @reporter.sadd "coverband.#{key}", value
94
- end
95
- else
96
- @reporter.sadd "coverband.#{key}", values
97
- end
98
- end
99
- @files = {}
100
- end
101
- else
102
- puts "coverage report: " if @verbose
103
- puts @files.inspect if @verbose
104
- end
105
- else
106
- puts "coverage disabled" if @verbose
107
- end
108
- rescue RuntimeError => err
109
- if @verbose
110
- puts "coverage missing"
111
- puts "error: #{err.inspect} #{err.message}"
91
+ unless @enabled
92
+ puts "coverage disabled" if @verbose
93
+ return
94
+ end
95
+
96
+ unset_tracer
97
+
98
+ if @reporter
99
+ if @reporter.class.name.match(/redis/i)
100
+ before_time = Time.now
101
+ @stats.increment "coverband.files.recorded.#{@files.length}" if @stats
102
+ @reporter.store_report(@files)
103
+ time_spent = Time.now - before_time
104
+ @stats.timing "coverband.files.recorded_time", time_spent if @stats
105
+ @files = {}
112
106
  end
107
+ elsif @verbose
108
+ puts "coverage report: "
109
+ puts @files.inspect
110
+ end
111
+ rescue RuntimeError => err
112
+ if @verbose
113
+ puts "coverage missing"
114
+ puts "error: #{err.inspect} #{err.message}"
113
115
  end
114
116
  end
115
-
116
117
  end
117
118
  end
@@ -0,0 +1,51 @@
1
+ module Coverband
2
+ class RedisStore
3
+ def initialize(redis)
4
+ @redis = redis
5
+ end
6
+
7
+ def store_report(report)
8
+ store_array('coverband', report.keys)
9
+
10
+ report.each do |file, lines|
11
+ store_array("coverband.#{file}", lines)
12
+ end
13
+ end
14
+
15
+ def sadd_supports_array?
16
+ # if the value is false, ||= would reevaluate the right side
17
+ return @_sadd_supports_array if defined?(@_sadd_supports_array)
18
+
19
+ @_sadd_supports_array = recent_gem_version? && recent_server_version?
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :redis
25
+
26
+ def store_array(key, values)
27
+ if sadd_supports_array?
28
+ redis.sadd(key, values)
29
+ else
30
+ values.each do |value|
31
+ redis.sadd(key, value)
32
+ end
33
+ end
34
+ values
35
+ end
36
+
37
+ def recent_server_version?
38
+ info_data = redis.info
39
+ if info_data.is_a?(Hash)
40
+ Gem::Version.new(info_data['redis_version']) >= Gem::Version.new('2.4')
41
+ else
42
+ #guess supported
43
+ true
44
+ end
45
+ end
46
+
47
+ def recent_gem_version?
48
+ Gem::Version.new(Redis::VERSION) >= Gem::Version.new('3.0')
49
+ end
50
+ end
51
+ end
@@ -1,3 +1,3 @@
1
1
  module Coverband
2
- VERSION = "0.0.14"
2
+ VERSION = "0.0.15"
3
3
  end
@@ -18,7 +18,7 @@ class BaseTest < Test::Unit::TestCase
18
18
  assert_equal true, coverband.instance_variable_get("@enabled")
19
19
  coverband.stop
20
20
  assert_equal false, coverband.instance_variable_get("@enabled")
21
- assert_equal false, coverband.instance_variable_get("@function_set")
21
+ assert_equal false, coverband.instance_variable_get("@tracer_set")
22
22
  end
23
23
 
24
24
  should "allow for sampling with a block and enable when 100 percent sample" do
@@ -49,10 +49,11 @@ class BaseTest < Test::Unit::TestCase
49
49
  coverband = Coverband::Base.new
50
50
  coverband.instance_variable_set("@sample_percentage", 100.0)
51
51
  coverband.instance_variable_set("@verbose", true)
52
- fake_redis = Redis.new
53
- coverband.instance_variable_set("@reporter", fake_redis)
54
- fake_redis.expects(:sadd).at_least_once
55
- fake_redis.expects(:sadd).at_least_once.with("coverband.#{File.expand_path('../../', File.dirname(__FILE__))}/lib/coverband/base.rb", anything)
52
+ store = Coverband::RedisStore.new(Redis.new)
53
+ coverband.instance_variable_set("@reporter", store)
54
+ store.expects(:store_report).once.with { |files|
55
+ files.keys.include?("#{File.expand_path('../../../', __FILE__)}/lib/coverband/base.rb")
56
+ }
56
57
  assert_equal false, coverband.instance_variable_get("@enabled")
57
58
  coverband.start
58
59
  1 + 1
@@ -39,19 +39,19 @@ class MiddlewareTest < Test::Unit::TestCase
39
39
  should 'always unset function when sampling' do
40
40
  request = Rack::MockRequest.env_for("/anything.json")
41
41
  middleware = Coverband::Middleware.new(fake_app)
42
- assert_equal false, middleware.instance_variable_get("@function_set")
42
+ assert_equal false, middleware.instance_variable_get("@tracer_set")
43
43
  middleware.instance_variable_set("@sample_percentage", 100.0)
44
44
  results = middleware.call(request)
45
- assert_equal false, middleware.instance_variable_get("@function_set")
45
+ assert_equal false, middleware.instance_variable_get("@tracer_set")
46
46
  end
47
47
 
48
48
  should 'always unset function when not sampling' do
49
49
  request = Rack::MockRequest.env_for("/anything.json")
50
50
  middleware = Coverband::Middleware.new(fake_app)
51
- assert_equal false, middleware.instance_variable_get("@function_set")
51
+ assert_equal false, middleware.instance_variable_get("@tracer_set")
52
52
  middleware.instance_variable_set("@sample_percentage", 0.0)
53
53
  results = middleware.call(request)
54
- assert_equal false, middleware.instance_variable_get("@function_set")
54
+ assert_equal false, middleware.instance_variable_get("@tracer_set")
55
55
  end
56
56
 
57
57
  should 'always record coverage, set trace func, and add_files when sampling' do
@@ -70,7 +70,8 @@ class MiddlewareTest < Test::Unit::TestCase
70
70
  assert_equal false, middleware.instance_variable_get("@enabled")
71
71
  middleware.instance_variable_set("@sample_percentage", 100.0)
72
72
  fake_redis = Redis.new
73
- middleware.instance_variable_set("@reporter", fake_redis)
73
+ middleware.instance_variable_set("@reporter", Coverband::RedisStore.new(fake_redis))
74
+ fake_redis.stubs(:info).returns({'redis_version' => 3.0})
74
75
  fake_redis.expects(:sadd).at_least_once
75
76
  fake_redis.expects(:sadd).at_least_once.with("coverband.#{FAKE_RACK_APP_PATH}", [4,5,6])
76
77
  results = middleware.call(request)
@@ -0,0 +1,83 @@
1
+ require File.expand_path('../test_helper', File.dirname(__FILE__))
2
+
3
+ class RedisStoreTest < Test::Unit::TestCase
4
+ context '#store_report' do
5
+ setup do
6
+ @redis = Redis.current.tap { |redis|
7
+ redis.stubs(:sadd).with(anything, anything)
8
+ redis.stubs(:info).returns({'redis_version' => 3.0})
9
+ }
10
+
11
+ @store = Coverband::RedisStore.new(@redis)
12
+ end
13
+
14
+ should "it stores the files into coverband" do
15
+ @redis.expects(:sadd).with('coverband', [
16
+ '/Users/danmayer/projects/cover_band_server/app.rb',
17
+ '/Users/danmayer/projects/cover_band_server/server.rb'
18
+ ])
19
+
20
+ @store.store_report(test_data)
21
+ end
22
+
23
+ should "it stores the file lines of the file app.rb" do
24
+ @redis.expects(:sadd).with(
25
+ 'coverband./Users/danmayer/projects/cover_band_server/app.rb',
26
+ [54, 55]
27
+ )
28
+
29
+ @store.store_report(test_data)
30
+ end
31
+
32
+ should "it stores the file lines of the file server.rb" do
33
+ @redis.expects(:sadd).with(
34
+ 'coverband./Users/danmayer/projects/cover_band_server/server.rb',
35
+ [5]
36
+ )
37
+
38
+ @store.store_report(test_data)
39
+ end
40
+
41
+ context 'when the redis server version is too old' do
42
+ setup do
43
+ @redis.stubs(:info).returns("redis_version"=>"2.2.3")
44
+ end
45
+
46
+ should "it store the files with separate calls into coverband" do
47
+ @redis.expects(:sadd).with('coverband', '/Users/danmayer/projects/cover_band_server/app.rb')
48
+ @redis.expects(:sadd).with('coverband', '/Users/danmayer/projects/cover_band_server/server.rb')
49
+
50
+ @store.store_report(test_data)
51
+ end
52
+ end
53
+
54
+ context 'when the redis gem version is too old' do
55
+ setup do
56
+ @gem_version = Redis::VERSION
57
+ Redis.send(:remove_const, :VERSION)
58
+ Redis::VERSION = '2.2.2'
59
+ end
60
+
61
+ teardown do
62
+ Redis.send(:remove_const, :VERSION)
63
+ Redis::VERSION = @gem_version
64
+ end
65
+
66
+ should "it store the files with separate calls into coverband" do
67
+ @redis.expects(:sadd).with('coverband', '/Users/danmayer/projects/cover_band_server/app.rb')
68
+ @redis.expects(:sadd).with('coverband', '/Users/danmayer/projects/cover_band_server/server.rb')
69
+
70
+ @store.store_report(test_data)
71
+ end
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def test_data
78
+ {
79
+ "/Users/danmayer/projects/cover_band_server/app.rb"=>[54, 55],
80
+ "/Users/danmayer/projects/cover_band_server/server.rb"=>[5]
81
+ }
82
+ end
83
+ end
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: 0.0.14
4
+ version: 0.0.15
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-22 00:00:00.000000000 Z
12
+ date: 2014-01-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -158,12 +158,14 @@ files:
158
158
  - lib/coverband.rb
159
159
  - lib/coverband/base.rb
160
160
  - lib/coverband/middleware.rb
161
+ - lib/coverband/redis_store.rb
161
162
  - lib/coverband/reporter.rb
162
163
  - lib/coverband/version.rb
163
164
  - test/fake_app/basic_rack.rb
164
165
  - test/test_helper.rb
165
166
  - test/unit/base_test.rb
166
167
  - test/unit/middleware_test.rb
168
+ - test/unit/redis_store_test.rb
167
169
  - test/unit/reporter_test.rb
168
170
  homepage: ''
169
171
  licenses:
@@ -180,7 +182,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
180
182
  version: '0'
181
183
  segments:
182
184
  - 0
183
- hash: 2729098440983801028
185
+ hash: -1687477973538567061
184
186
  required_rubygems_version: !ruby/object:Gem::Requirement
185
187
  none: false
186
188
  requirements:
@@ -189,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
191
  version: '0'
190
192
  segments:
191
193
  - 0
192
- hash: 2729098440983801028
194
+ hash: -1687477973538567061
193
195
  requirements: []
194
196
  rubyforge_project:
195
197
  rubygems_version: 1.8.23
@@ -201,4 +203,5 @@ test_files:
201
203
  - test/test_helper.rb
202
204
  - test/unit/base_test.rb
203
205
  - test/unit/middleware_test.rb
206
+ - test/unit/redis_store_test.rb
204
207
  - test/unit/reporter_test.rb