covered 0.14.2 → 0.15.2

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: e6ce67ae80be9650cde586f9bb8e0496dfebcd2ad7b8176714657cad29cd1eac
4
- data.tar.gz: fa0475934c2c8b95e383ce494c69264f74fb29d7a31f33c2218459e71e7b747d
3
+ metadata.gz: 112c85633150c4f05435b29a2867a51a711a9f216fdbe850c0356b0371ab4e49
4
+ data.tar.gz: 2efa0d7a7d07ca3125237c55b4e1d34fd4835e5f9d963344f1c7b4b9405d37eb
5
5
  SHA512:
6
- metadata.gz: 5cecc1f2ab8fc64c0003734a7e98acba98ad25310ae28be596b21f4230dbf856922b4f495428587353ace8bf568edae6d82ae1051f2a5150ee415b3f6b9107fe
7
- data.tar.gz: 13cffc32f6884dda4911caba487d583b95bcf3f5830b5322674749ba308b839d8ad72b52a1c75dfe42fda533b0c02c55ab15638d11065386a89aed0a70d0327e
6
+ metadata.gz: 054c6dca966431d180da1ff4e98afadea19400ec2ea28a2f7b4a3096ae6affdcc0082f939bb612cc3440861b4e1bd55e1b88dc03b7a93205ec19d2e3935fb5fd
7
+ data.tar.gz: f9ea6aacbb0993749c4e808f09c8b6bcccfa5d7f6c640fcdf83a79a7432fffd893008ccb6aed9314801f1c79446dcb82bdfc919e55c1564ca5691920a6371073
checksums.yaml.gz.sig CHANGED
@@ -1,3 +1,3 @@
1
- ̅ݒl4
2
- h
3
- ����M�ё3���I")8*�R����G<
1
+ q�dq������y��7�'��e�&ep)0��b�?[��WØjK%�-� a�I�GS�`��fK�|C���5�[��/�^i��V�#r���I��}���y����
2
+ �L���{�.�}���{��.0R���+�p�?
3
+ $��Y��g��:��4�����%G�k��Ћ�%�2��a�B��2
@@ -0,0 +1,26 @@
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
+ # It would be nice to have a better algorithm here than just ignoring mtime - perhaps using checksums?
14
+ Covered::Persist.new($covered.output, path).load!(ignore_mtime: true)
15
+ end
16
+
17
+ $covered.flush
18
+
19
+ statistics = Covered::Statistics.new
20
+
21
+ $covered.each do |coverage|
22
+ statistics << coverage
23
+ end
24
+
25
+ statistics.validate!(minimum)
26
+ 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
@@ -59,35 +59,6 @@ module Covered
59
59
  end
60
60
  end
61
61
 
62
- class Cache < Wrapper
63
- def initialize(output)
64
- super(output)
65
- @marks = []
66
- end
67
-
68
- def mark(path, lineno, count = 1)
69
- @marks << path << lineno << count
70
- end
71
-
72
- def enable
73
- super
74
- end
75
-
76
- def flush
77
- @marks.each_slice(3) do |path, lineno, count|
78
- @output.mark(path, lineno, count)
79
- end
80
-
81
- @marks.clear
82
- end
83
-
84
- def disable
85
- super
86
-
87
- flush
88
- end
89
- end
90
-
91
62
  # class Capture < Wrapper
92
63
  # def enable
93
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,18 +33,27 @@ module Covered
32
33
  super(output)
33
34
 
34
35
  @path = path
35
-
36
36
  @touched = Set.new
37
37
  end
38
38
 
39
- def apply(record)
39
+ def apply(record, ignore_mtime: false)
40
40
  # The file must still exist:
41
41
  return unless path = expand_path(record[:path])
42
- return unless File.exist? path
42
+
43
+ unless File.exist?(path)
44
+ Console.logger.debug(self) {"Ignoring coverage, path #{path} does not exist!"}
45
+ return
46
+ end
43
47
 
44
48
  # If the file has been modified since... we can't use the coverage.
45
49
  return unless mtime = record[:mtime]
46
- return if File.mtime(path).to_f > record[:mtime]
50
+
51
+ unless ignore_mtime
52
+ if File.mtime(path).to_f > record[:mtime]
53
+ Console.logger.debug(self) {"Ignoring coverage, path #{path} has been updated: #{File.mtime(path).to_f} > #{record[:mtime]}!"}
54
+ return
55
+ end
56
+ end
47
57
 
48
58
  record[:coverage].each_with_index do |count, index|
49
59
  @output.mark(path, index, count) if count
@@ -59,22 +69,28 @@ module Covered
59
69
  }
60
70
  end
61
71
 
62
- def load!(path = @path)
72
+ def load!(**options)
63
73
  return unless File.exist?(@path)
64
74
 
65
75
  # Load existing coverage information and mark all files:
66
76
  File.open(@path, "rb") do |file|
67
77
  file.flock(File::LOCK_SH)
68
78
 
69
- make_unpacker(file).each(&self.method(:apply))
79
+ Console.logger.debug(self) {"Loading from #{@path} with #{options}..."}
80
+
81
+ make_unpacker(file).each do |record|
82
+ self.apply(record, **options)
83
+ end
70
84
  end
71
85
  end
72
86
 
73
- def save!(path = @path)
87
+ def save!
74
88
  # Dump all coverage:
75
89
  File.open(@path, "wb") do |file|
76
90
  file.flock(File::LOCK_EX)
77
91
 
92
+ Console.logger.debug(self) {"Saving to #{@path}..."}
93
+
78
94
  packer = make_packer(file)
79
95
 
80
96
  self.each do |coverage|
@@ -87,7 +103,7 @@ module Covered
87
103
 
88
104
  def mark(file, line, count)
89
105
  @touched << file
90
-
106
+
91
107
  super
92
108
  end
93
109
 
@@ -97,6 +113,12 @@ module Covered
97
113
  load!
98
114
  end
99
115
 
116
+ def flush
117
+ load!
118
+
119
+ super
120
+ end
121
+
100
122
  def disable
101
123
  super
102
124
 
@@ -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
@@ -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.2"
22
+ VERSION = "0.15.2"
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.2
4
+ version: 0.15.2
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,16 +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/covered.rb
165
- - examples/coverage/erb/coverage.rb
166
- - examples/coverage/erb/template.erb
167
- - examples/coverage/parser.rb
168
- - examples/coverage/simplecov.rb
169
- - examples/coverage/test.rb
170
- - examples/coverage/tracepoint.rb
162
+ - bake/covered/validate.rb
171
163
  - lib/covered.rb
164
+ - lib/covered/cache.rb
172
165
  - lib/covered/capture.rb
173
166
  - lib/covered/coverage.rb
174
167
  - lib/covered/coveralls.rb
@@ -184,7 +177,6 @@ files:
184
177
  - lib/covered/summary.rb
185
178
  - lib/covered/version.rb
186
179
  - lib/covered/wrapper.rb
187
- - media/example.png
188
180
  homepage: https://github.com/ioquatix/covered
189
181
  licenses:
190
182
  - MIT
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
@@ -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)
@@ -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/example.png DELETED
Binary file