covered 0.14.1 → 0.15.1

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: 65050cba58d4c4af27b6361adb1e398d7cc17190f5cd9f437b75ebe551fd47d9
4
- data.tar.gz: 9e27906a329ce6748ef8023ba4ef7e14747ca612516052396369cd23798ae2be
3
+ metadata.gz: 8b53c13ab215d5a93f7a092321dc70b8538909a76da3e841b8ce6c2f8a7fcdc3
4
+ data.tar.gz: 6f01972bf2729eb4549612acfe8dc7ad37bb8aaf927460257ae4a060cee8e001
5
5
  SHA512:
6
- metadata.gz: f2e15acaf1a9ccf76fca83a1fe9c2b0d5189b32ce60e9b2583b0f87a5c8296575f1669d96b9dddffaf9e9cc7d5ebd2192f675665c6f55ef73176eeb50bf2251d
7
- data.tar.gz: 64e9dff68ef4a4efee7e903aff00ce60358a3c15853e487009c56828bffa1f510a2d0dd762b08973fc58ccccb948179aa5787badd4ffed07a094d1ccaaf5a721
6
+ metadata.gz: bde94163994801bf64fd7a61014361c754f7c18be4f766eb2728d93b8ff01c83ffc1bcc0917346d10ec720d95aa3c15eae208e3ebbec56c97ca394843dc715f3
7
+ data.tar.gz: 3ccfcc2ae535e65a6ca0de483c5a150104f1e414f9a5679d9e0d9b63420b9416db28df6e24cf5aaeb6d2a964d70af3d3828823eb35523b4ea240fd4b3872b66c
checksums.yaml.gz.sig CHANGED
Binary file
@@ -0,0 +1,25 @@
1
+
2
+ def initialize(context)
3
+ super
4
+
5
+ require_relative '../../lib/covered/policy/default'
6
+ end
7
+
8
+ # Validate the coverage of multiple test runs.
9
+ # @parameter paths [Array(String)] The coverage database paths.
10
+ # @parameter minumum [Float] The minimum required coverage in order to pass.
11
+ def validate(paths: nil, minimum: 1.0)
12
+ paths&.each do |path|
13
+ Covered::Persist.new($covered.output, path).load!
14
+ end
15
+
16
+ $covered.flush
17
+
18
+ statistics = Covered::Statistics.new
19
+
20
+ $covered.each do |coverage|
21
+ statistics << coverage
22
+ end
23
+
24
+ statistics.validate!(minimum)
25
+ end
@@ -0,0 +1,65 @@
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 'coverage'
24
+
25
+ module Covered
26
+ class Cache < Wrapper
27
+ def initialize(output)
28
+ super(output)
29
+
30
+ @marks = nil
31
+ end
32
+
33
+ def mark(path, lineno, count = 1)
34
+ if @marks
35
+ @marks << path << lineno << count
36
+ else
37
+ super
38
+ end
39
+ end
40
+
41
+ def enable
42
+ @marks = []
43
+
44
+ super
45
+ end
46
+
47
+ def flush
48
+ if @marks
49
+ @marks.each_slice(3) do |path, lineno, count|
50
+ @output.mark(path, lineno, count)
51
+ end
52
+
53
+ @marks = nil
54
+ end
55
+
56
+ super
57
+ end
58
+
59
+ def disable
60
+ super
61
+
62
+ flush
63
+ end
64
+ end
65
+ end
@@ -31,9 +31,12 @@ module Covered
31
31
  @trace = TracePoint.new(:line, :call, :c_call) do |trace|
32
32
  if trace.event == :call
33
33
  # Ruby doesn't always mark call-sites in sub-expressions, so we use this approach to compute a call site and mark it:
34
- location = caller_locations(2, 1).first
35
- @output.mark(location.path, location.lineno, 1)
36
- elsif path = trace.path
34
+ if location = caller_locations(2, 1).first and path = location.path
35
+ @output.mark(path, location.lineno, 1)
36
+ end
37
+ end
38
+
39
+ if path = trace.path
37
40
  @output.mark(path, trace.lineno, 1)
38
41
  end
39
42
  end
@@ -56,35 +59,6 @@ module Covered
56
59
  end
57
60
  end
58
61
 
59
- class Cache < Wrapper
60
- def initialize(output)
61
- super(output)
62
- @marks = []
63
- end
64
-
65
- def mark(path, lineno, count = 1)
66
- @marks << path << lineno << count
67
- end
68
-
69
- def enable
70
- super
71
- end
72
-
73
- def flush
74
- @marks.each_slice(3) do |path, lineno, count|
75
- @output.mark(path, lineno, count)
76
- end
77
-
78
- @marks.clear
79
- end
80
-
81
- def disable
82
- super
83
-
84
- flush
85
- end
86
- end
87
-
88
62
  # class Capture < Wrapper
89
63
  # def enable
90
64
  # super
@@ -23,6 +23,7 @@ require_relative 'wrapper'
23
23
  require 'msgpack'
24
24
  require 'time'
25
25
  require 'set'
26
+ require 'console'
26
27
 
27
28
  module Covered
28
29
  class Persist < Wrapper
@@ -32,7 +33,6 @@ module Covered
32
33
  super(output)
33
34
 
34
35
  @path = path
35
-
36
36
  @touched = Set.new
37
37
  end
38
38
 
@@ -66,6 +66,8 @@ module Covered
66
66
  File.open(@path, "rb") do |file|
67
67
  file.flock(File::LOCK_SH)
68
68
 
69
+ Console.logger.debug(self) {"Loading from #{@path}..."}
70
+
69
71
  make_unpacker(file).each(&self.method(:apply))
70
72
  end
71
73
  end
@@ -75,6 +77,8 @@ module Covered
75
77
  File.open(@path, "wb") do |file|
76
78
  file.flock(File::LOCK_EX)
77
79
 
80
+ Console.logger.debug(self) {"Saving to #{@path}..."}
81
+
78
82
  packer = make_packer(file)
79
83
 
80
84
  self.each do |coverage|
@@ -87,7 +91,7 @@ module Covered
87
91
 
88
92
  def mark(file, line, count)
89
93
  @touched << file
90
-
94
+
91
95
  super
92
96
  end
93
97
 
@@ -97,6 +101,12 @@ module Covered
97
101
  load!
98
102
  end
99
103
 
104
+ def flush
105
+ load!
106
+
107
+ super
108
+ end
109
+
100
110
  def disable
101
111
  super
102
112
 
@@ -20,21 +20,25 @@
20
20
 
21
21
  require_relative '../policy'
22
22
 
23
- $covered = Covered.policy do
24
- cache!
25
-
26
- # Only files in the root would be tracked:
27
- root(Dir.pwd)
28
-
29
- # We will ignore any files in the test or spec directory:
30
- skip(/^.*\/(test|spec|vendor)\//)
31
-
32
- # We will include all files under lib, even if they aren't loaded:
33
- include("lib/**/*.rb")
34
-
35
- persist!
36
-
37
- source
38
-
39
- reports!
23
+ if File.exist?("config/coverage.rb")
24
+ load("config/coverage.rb")
25
+ else
26
+ $covered = Covered.policy do
27
+ cache!
28
+
29
+ # Only files in the root would be tracked:
30
+ root(Dir.pwd)
31
+
32
+ # We will ignore any files in the test or spec directory:
33
+ skip(/^.*\/(test|spec|vendor)\//)
34
+
35
+ # We will include all files under lib, even if they aren't loaded:
36
+ include("lib/**/*.rb")
37
+
38
+ persist!
39
+
40
+ source
41
+
42
+ reports!
43
+ end
40
44
  end
@@ -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 "cache"
25
26
  require_relative "persist"
26
27
 
27
28
  module Covered
@@ -42,6 +43,8 @@ module Covered
42
43
  @reports = []
43
44
  end
44
45
 
46
+ attr :output
47
+
45
48
  def freeze
46
49
  return self if frozen?
47
50
 
@@ -91,6 +94,10 @@ module Covered
91
94
  capture.disable
92
95
  end
93
96
 
97
+ def flush
98
+ @output.flush
99
+ end
100
+
94
101
  attr :reports
95
102
 
96
103
  class Autoload
@@ -69,7 +69,7 @@ module Covered
69
69
  attr :paths
70
70
 
71
71
  def executable?(node)
72
- node.type == :send
72
+ node.type == :send || node.type == :yield
73
73
  end
74
74
 
75
75
  def ignore?(node)
@@ -22,6 +22,9 @@ require_relative 'wrapper'
22
22
  require_relative 'coverage'
23
23
 
24
24
  module Covered
25
+ class CoverageError < StandardError
26
+ end
27
+
25
28
  class Statistics < Wrapper
26
29
  def initialize
27
30
  @count = 0
@@ -51,5 +54,11 @@ module Covered
51
54
 
52
55
  # Could output funny message here, especially for 100% coverage.
53
56
  end
57
+
58
+ def validate!(minimum = 1.0)
59
+ if self.ratio < minimum
60
+ raise CoverageError, "Coverage of #{self.percentage.to_f.round(2)}% is less than required minimum of #{(minimum * 100.0).round(2)}%!"
61
+ end
62
+ end
54
63
  end
55
64
  end
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Covered
22
- VERSION = "0.14.1"
22
+ VERSION = "0.15.1"
23
23
  end
@@ -26,6 +26,9 @@ module Covered
26
26
  def disable
27
27
  end
28
28
 
29
+ def flush
30
+ end
31
+
29
32
  def accept?(path)
30
33
  true
31
34
  end
@@ -60,6 +63,10 @@ module Covered
60
63
  @output.disable
61
64
  end
62
65
 
66
+ def flush
67
+ @output.flush
68
+ end
69
+
63
70
  def accept?(path)
64
71
  @output.accept?(path)
65
72
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: covered
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.1
4
+ version: 0.15.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
@@ -39,7 +39,7 @@ cert_chain:
39
39
  RAOsIl+HOBTb252nx1kIRN5hqQx272AJCbCjKx8egcUQKffFVVCI0nye09v5CK+a
40
40
  HiLJ8VOFx6w=
41
41
  -----END CERTIFICATE-----
42
- date: 2022-06-11 00:00:00.000000000 Z
42
+ date: 2022-06-13 00:00:00.000000000 Z
43
43
  dependencies:
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: async-rest
@@ -159,18 +159,9 @@ executables: []
159
159
  extensions: []
160
160
  extra_rdoc_files: []
161
161
  files:
162
- - ".github/workflows/development.yml"
163
- - ".github/workflows/documentation.yml"
164
- - examples/coverage/.DS_Store
165
- - examples/coverage/covered.rb
166
- - examples/coverage/erb/.covered.db
167
- - examples/coverage/erb/coverage.rb
168
- - examples/coverage/erb/template.erb
169
- - examples/coverage/parser.rb
170
- - examples/coverage/simplecov.rb
171
- - examples/coverage/test.rb
172
- - examples/coverage/tracepoint.rb
162
+ - bake/covered/validate.rb
173
163
  - lib/covered.rb
164
+ - lib/covered/cache.rb
174
165
  - lib/covered/capture.rb
175
166
  - lib/covered/coverage.rb
176
167
  - lib/covered/coveralls.rb
@@ -186,8 +177,6 @@ files:
186
177
  - lib/covered/summary.rb
187
178
  - lib/covered/version.rb
188
179
  - lib/covered/wrapper.rb
189
- - media/.DS_Store
190
- - media/example.png
191
180
  homepage: https://github.com/ioquatix/covered
192
181
  licenses:
193
182
  - MIT
@@ -208,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
208
197
  - !ruby/object:Gem::Version
209
198
  version: '0'
210
199
  requirements: []
211
- rubygems_version: 3.1.6
200
+ rubygems_version: 3.3.7
212
201
  signing_key:
213
202
  specification_version: 4
214
203
  summary: A modern approach to code coverage.
metadata.gz.sig CHANGED
Binary file
@@ -1,45 +0,0 @@
1
- name: Development
2
-
3
- on: [push, pull_request]
4
-
5
- jobs:
6
- test:
7
- name: ${{matrix.ruby}} on ${{matrix.os}}
8
- runs-on: ${{matrix.os}}-latest
9
- continue-on-error: ${{matrix.experimental}}
10
-
11
- strategy:
12
- matrix:
13
- os:
14
- - ubuntu
15
- - macos
16
-
17
- ruby:
18
- - "2.6"
19
- - "2.7"
20
- - "3.0"
21
-
22
- experimental: [false]
23
- env: [""]
24
-
25
- include:
26
- - os: ubuntu
27
- ruby: truffleruby
28
- experimental: true
29
- - os: ubuntu
30
- ruby: jruby
31
- experimental: true
32
- - os: ubuntu
33
- ruby: head
34
- experimental: true
35
-
36
- steps:
37
- - uses: actions/checkout@v2
38
- - uses: ruby/setup-ruby@v1
39
- with:
40
- ruby-version: ${{matrix.ruby}}
41
- bundler-cache: true
42
-
43
- - name: Run tests
44
- timeout-minutes: 5
45
- run: ${{matrix.env}} bundle exec rspec
@@ -1,34 +0,0 @@
1
- name: Documentation
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
-
8
- env:
9
- BUNDLE_WITH: maintenance
10
-
11
- jobs:
12
- deploy:
13
- runs-on: ubuntu-latest
14
-
15
- steps:
16
- - uses: actions/checkout@v3
17
-
18
- - uses: ruby/setup-ruby@v1
19
- with:
20
- ruby-version: 3.1
21
- bundler-cache: true
22
-
23
- - name: Installing packages
24
- run: sudo apt-get install wget
25
-
26
- - name: Prepare GitHub Pages
27
- run: bundle exec bake github:pages:prepare --directory docs
28
-
29
- - name: Generate documentation
30
- timeout-minutes: 5
31
- run: bundle exec bake utopia:project:static --force no
32
-
33
- - name: Deploy GitHub Pages
34
- run: bundle exec bake github:pages:commit --directory docs
Binary file
@@ -1,11 +0,0 @@
1
-
2
- ENV['COVERAGE'] ||= 'PartialSummary'
3
- require 'covered/policy/default'
4
-
5
- $covered.enable
6
-
7
- require_relative 'test'
8
-
9
- $covered.disable
10
-
11
- $covered.call($stdout)
Binary file
@@ -1,21 +0,0 @@
1
-
2
- require 'erb'
3
- $LOAD_PATH.unshift File.expand_path('../../../lib', __dir__)
4
-
5
- template_path = File.expand_path("template.erb", __dir__)
6
-
7
- ENV['COVERAGE'] ||= 'PartialSummary'
8
- require 'covered/policy/default'
9
-
10
- $covered.enable
11
-
12
- template = ERB.new(File.read(template_path)).tap do |template|
13
- template.filename = template_path
14
- end
15
-
16
- @items = ["Cats", "Dogs", "Chickens"]
17
- puts template.result(binding)
18
-
19
- $covered.disable
20
-
21
- $covered.call($stdout)
@@ -1,7 +0,0 @@
1
- <% for @item in @items %>
2
- <%= @item %>
3
- <% end %>
4
-
5
- <% if 1 == 2 %>
6
- Math is broken.
7
- <% end %>
@@ -1,23 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'pry'
4
- require 'parser/current'
5
-
6
- ast = Parser::CurrentRuby.parse_file('test.rb')
7
- # ast.location.expression.source
8
-
9
- def print_methods(ast)
10
- if ast.is_a? Parser::AST::Node
11
- if ast.type == :send
12
- puts "Calling #{ast.children[1]} on #{ast.location.line}"
13
- end
14
-
15
- ast.children.each do |child|
16
- print_methods(child)
17
- end
18
- end
19
- end
20
-
21
- print_methods(ast)
22
-
23
- binding.pry
@@ -1,7 +0,0 @@
1
-
2
- require 'simplecov'
3
-
4
- SimpleCov.command_name 'Example'
5
- SimpleCov.start
6
-
7
- require_relative 'test'
@@ -1,16 +0,0 @@
1
- trace_point = TracePoint.new(:call, :return, :line, :c_call, :c_return, :b_call, :b_return) do |trace|
2
- puts [trace.path, trace.lineno].join(":")
3
- end
4
-
5
- trace_point.enable
6
-
7
- values = {foo: 10}
8
-
9
- def shell_escape(x)
10
- x
11
- end
12
-
13
- values.map{|key, value| [
14
- key.to_s.upcase,
15
- shell_escape(value) # TracePoint is never triggered for this line.
16
- ]}
@@ -1,8 +0,0 @@
1
-
2
- trace_point = TracePoint.new(:call, :return, :line, :c_call, :c_return, :b_call, :b_return) do |trace|
3
- puts [trace.path, trace.lineno].join(":")
4
- end
5
-
6
- trace_point.enable
7
-
8
- require_relative 'test'
data/media/.DS_Store DELETED
Binary file
data/media/example.png DELETED
Binary file