covered 0.10.3 → 0.10.4

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
  SHA256:
3
- metadata.gz: cff6650fc286675cf539c997a67b002a7375b5d471556415746c33694f31ac55
4
- data.tar.gz: 36aeabb31c74c4a268610e71f5c0bfd0c8ac811e51148c4b6497527268eb77a6
3
+ metadata.gz: 42eca672ae3b6b6589c0022ce5de6b610134c9eb3cf9e4edf3b1fb530e6101ab
4
+ data.tar.gz: 558c12dade107d324740f9dfdcc59c125ca0c847779f502f4901c9fb202de72a
5
5
  SHA512:
6
- metadata.gz: 7f35c3702309e5673b6f5763686186c02ecf40a080403ddafc82e791ac55babad0bffe677b72a89b9051b5d29d1220950ec282a66f6354fde65f50980b1c5f8f
7
- data.tar.gz: a5a5b7e6baf404aac6a0158555656a0759ed2f03aa15730f830ef47a9cc92d73bb63ae4a69bf5c93c64d783b004fbad5d72b4ae40490da7de791de8b87af4cd1
6
+ metadata.gz: c1fafd5d915b3e1c3e9f43b568e4564eab02a5049ab65b667bdd39a1ed25294c2a1ddb7d1e424e6b6433ff0d1163d5687a30b731fe6a614bfcb2f40cd25f2c34
7
+ data.tar.gz: df90259692dfa61889afce1eda933fed4d37c3974dcc9675bcfa0f91e6dac0fba8c0b87fd7ee1b667157c409e4f058dfde6c8dff1d5f1aecd34826477495b80a
data/covered.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency "rainbow"
22
22
  spec.add_dependency "parser"
23
+ spec.add_dependency "msgpack"
23
24
 
24
25
  spec.add_dependency "async-rest"
25
26
 
data/lib/covered/files.rb CHANGED
@@ -19,13 +19,14 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  require_relative 'coverage'
22
+ require_relative 'wrapper'
22
23
 
23
24
  require 'set'
24
25
 
25
26
  module Covered
26
- class Files < Wrapper
27
- def initialize(output = nil)
28
- super(output)
27
+ class Files < Base
28
+ def initialize(*)
29
+ super
29
30
 
30
31
  @paths = {}
31
32
  end
@@ -88,26 +89,6 @@ module Covered
88
89
  end
89
90
  end
90
91
 
91
- class Filter < Wrapper
92
- def accept?(path)
93
- true
94
- end
95
-
96
- def mark(path, lineno, value)
97
- super if accept?(path)
98
- end
99
-
100
- def each(&block)
101
- super do |coverage|
102
- if accept?(coverage.path)
103
- yield coverage
104
- else
105
- puts "Skipping #{coverage.path} #{self.class}"
106
- end
107
- end
108
- end
109
- end
110
-
111
92
  class Skip < Filter
112
93
  def initialize(output, pattern)
113
94
  super(output)
@@ -119,11 +100,11 @@ module Covered
119
100
 
120
101
  if Regexp.instance_methods.include? :match?
121
102
  # This is better as it doesn't allocate a MatchData instance which is essentially useless.
122
- def accept? path
103
+ def match? path
123
104
  !@pattern.match?(path)
124
105
  end
125
106
  else
126
- def accept? path
107
+ def match? path
127
108
  !(@pattern =~ path)
128
109
  end
129
110
  end
@@ -138,7 +119,7 @@ module Covered
138
119
 
139
120
  attr :pattern
140
121
 
141
- def accept?(path)
122
+ def match?(path)
142
123
  @pattern === path
143
124
  end
144
125
  end
@@ -164,7 +145,7 @@ module Covered
164
145
  end
165
146
  end
166
147
 
167
- def accept?(path)
148
+ def match?(path)
168
149
  path.start_with?(@path)
169
150
  end
170
151
  end
@@ -0,0 +1,134 @@
1
+ # Copyright, 2018, by Samuel G. D. Williams. <http://www.codeotaku.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ # THE SOFTWARE.
20
+
21
+ require_relative 'wrapper'
22
+
23
+ require 'msgpack'
24
+ require 'time'
25
+ require 'set'
26
+
27
+ module Covered
28
+ class Persist < Wrapper
29
+ def initialize(output, path = ".covered.msgpack")
30
+ super(output)
31
+
32
+ @path = path
33
+
34
+ @touched = Set.new
35
+ end
36
+
37
+ def apply(record)
38
+ # The file must still exist:
39
+ return unless path = expand_path(record[:path])
40
+ return unless File.exist? path
41
+
42
+ # If the file has been modified since... we can't use the coverage.
43
+ return unless mtime = record[:mtime]
44
+ return if File.mtime(path).to_f > record[:mtime]
45
+
46
+ record[:coverage].each_with_index do |count, index|
47
+ @output.mark(path, index, count) if count
48
+ end
49
+ end
50
+
51
+ def serialize(coverage)
52
+ {
53
+ # We want to use relative paths so that moving the repo won't break everything:
54
+ path: relative_path(coverage.path),
55
+ coverage: coverage.counts,
56
+ mtime: File.mtime(coverage.path).to_f,
57
+ }
58
+ end
59
+
60
+ def load!(path = @path)
61
+ return unless File.exist?(@path)
62
+
63
+ # Load existing coverage information and mark all files:
64
+ File.open(@path, "r") do |file|
65
+ file.flock(File::LOCK_SH)
66
+
67
+ make_unpacker(file).each(&self.method(:apply))
68
+ end
69
+ end
70
+
71
+ def save!(path = @path)
72
+ # Dump all coverage:
73
+ File.open(@path, "w") do |file|
74
+ file.flock(File::LOCK_EX)
75
+
76
+ packer = make_packer(file)
77
+
78
+ self.each do |coverage|
79
+ packer.write(serialize(coverage))
80
+ end
81
+
82
+ packer.flush
83
+ end
84
+ end
85
+
86
+ def mark(file, line, count)
87
+ @touched << file
88
+
89
+ super
90
+ end
91
+
92
+ def enable
93
+ super
94
+
95
+ load!
96
+ end
97
+
98
+ def disable
99
+ super
100
+
101
+ # @touched.each do |path|
102
+ # if @output.accept?(path)
103
+ # puts "Updated #{path} coverage."
104
+ # end
105
+ # end
106
+
107
+ save!
108
+ end
109
+
110
+ # def each
111
+ # super do |coverage|
112
+ # if @touched.include?(coverage.path)
113
+ # yield coverage
114
+ # end
115
+ # end
116
+ # end
117
+
118
+ def make_packer(io)
119
+ packer = MessagePack::Packer.new(io)
120
+ packer.register_type(0x00, Symbol, :to_msgpack_ext)
121
+ packer.register_type(0x01, Time) {|object| object.to_s}
122
+
123
+ return packer
124
+ end
125
+
126
+ def make_unpacker(io)
127
+ unpacker = MessagePack::Unpacker.new(io)
128
+ unpacker.register_type(0x00, Symbol, :from_msgpack_ext)
129
+ unpacker.register_type(0x01, Time, :parse)
130
+
131
+ return unpacker
132
+ end
133
+ end
134
+ end
@@ -30,6 +30,8 @@ $covered = Covered.policy do
30
30
  # We will include all files under lib, even if they aren't loaded:
31
31
  include "lib/**/*.rb"
32
32
 
33
+ persist!
34
+
33
35
  source
34
36
 
35
37
  reports!
@@ -22,6 +22,7 @@ require_relative "summary"
22
22
  require_relative "files"
23
23
  require_relative "source"
24
24
  require_relative "capture"
25
+ require_relative "persist"
25
26
 
26
27
  module Covered
27
28
  def self.policy(&block)
@@ -74,6 +75,10 @@ module Covered
74
75
  @output = Cache.new(@output)
75
76
  end
76
77
 
78
+ def persist!
79
+ @output = Persist.new(@output)
80
+ end
81
+
77
82
  def capture
78
83
  @capture ||= Capture.new(@output)
79
84
  end
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Covered
22
- VERSION = "0.10.3"
22
+ VERSION = "0.10.4"
23
23
  end
@@ -19,50 +19,95 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Covered
22
- class Wrapper
23
- include Enumerable
22
+ class Base
23
+ def enable
24
+ end
25
+
26
+ def disable
27
+ end
28
+
29
+ def accept?(path)
30
+ true
31
+ end
32
+
33
+ def mark(path, lineno, value)
34
+ end
24
35
 
25
- def initialize(output = nil)
36
+ def each
37
+ end
38
+
39
+ def relative_path(path)
40
+ path
41
+ end
42
+
43
+ def expand_path(path)
44
+ path
45
+ end
46
+ end
47
+
48
+ class Wrapper < Base
49
+ def initialize(output = Base.new)
26
50
  @output = output
27
51
  end
28
52
 
29
53
  attr :output
30
54
 
31
55
  def mark(path, lineno, value)
32
- @output.mark(path, lineno, value) if @output
56
+ @output.mark(path, lineno, value)
33
57
  end
34
58
 
35
59
  def enable
36
- @output.enable if @output
60
+ @output.enable
37
61
  end
38
62
 
39
63
  def disable
40
- @output.disable if @output
64
+ @output.disable
65
+ end
66
+
67
+ def accept?(path)
68
+ @output.accept?(path)
69
+ end
70
+
71
+ def mark(path, lineno, value)
72
+ @output.mark(path, lineno, value)
41
73
  end
42
74
 
43
75
  # @yield [Coverage] the path to the file, and the execution counts.
44
76
  def each(&block)
45
- @output.each(&block) if @output
77
+ @output.each(&block)
46
78
  end
47
79
 
48
80
  def relative_path(path)
49
- if @output
50
- @output.relative_path(path)
51
- else
52
- path
53
- end
81
+ @output.relative_path(path)
54
82
  end
55
83
 
56
84
  def expand_path(path)
57
- if @output
58
- @output.expand_path(path)
59
- else
60
- path
61
- end
85
+ @output.expand_path(path)
62
86
  end
63
87
 
64
88
  def to_h
65
- collect{|coverage| [coverage.path, coverage]}.to_h
89
+ @output.to_enum(:each).collect{|coverage| [coverage.path, coverage]}.to_h
90
+ end
91
+ end
92
+
93
+ class Filter < Wrapper
94
+ def mark(path, lineno, value)
95
+ @output.mark(path, lineno, value) if accept?(path)
96
+ end
97
+
98
+ # @yield [Coverage] the path to the file, and the execution counts.
99
+ def each(&block)
100
+ @output.each do |coverage|
101
+ yield coverage if accept?(coverage.path)
102
+ end
103
+ end
104
+
105
+ def accept?(path)
106
+ match?(path) and super
107
+ end
108
+
109
+ def match?(path)
110
+ true
66
111
  end
67
112
  end
68
113
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: covered
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.3
4
+ version: 0.10.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-01 00:00:00.000000000 Z
11
+ date: 2019-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rainbow
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: msgpack
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: async-rest
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -144,6 +158,7 @@ files:
144
158
  - lib/covered/eval.rb
145
159
  - lib/covered/files.rb
146
160
  - lib/covered/minitest.rb
161
+ - lib/covered/persist.rb
147
162
  - lib/covered/policy.rb
148
163
  - lib/covered/policy/default.rb
149
164
  - lib/covered/rspec.rb