covered 0.16.3 → 0.16.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b3ec9e58976df4dd7611cd55dd8f7c3e21267147453e1ea6be3339a8bfc98d6f
4
- data.tar.gz: 7ff2d500f8b308186f1db4609c5b1f14594ead77b77c77df54efc5953586a6e5
3
+ metadata.gz: ab80834ad5a14e4853e865768e7cc51eb38497904e62818e81ce3633ac9f43d2
4
+ data.tar.gz: ce3a3757b0c08e8f6b09f8d0c3f7273a623ba293f9b56b81b4b5cff7662bf857
5
5
  SHA512:
6
- metadata.gz: e835b21f824253f8aef9aa500f01d7a0d4235cdb17f5799858d6e66deb2afe3970e63a4761c1c0f9d97cf2522e56ead2226103e12cc87a6a6b2079add132ffcb
7
- data.tar.gz: e81491a1f50577050c58cdc0ae11e0b230097456d71ac544c640a977927a685aa7844ef24c886385c7ab6aa1f490182c7963c0833776655c71c06b583c3ac322
6
+ metadata.gz: c46120d01cc5a48d365f9e3d9dadb39b9f4825b42aee8f667e3a1a3298439f114f5cb29d34cdcf282bb89f2a9982f756892dfd808e406971876e36cfe5028c12
7
+ data.tar.gz: 58564662a71b2419a3ed02766614c0b26479702e8cb2d17e1efc0beb5b423b7444eb1b779f7ebc8f79fdf158e7f6ab4ce655af8bf75649fce2459d8f74e97c83
checksums.yaml.gz.sig CHANGED
@@ -1,3 +1,3 @@
1
- �Tz���-捈 �؄�إ�GgG'�������������ØD����6�/�H ����\m^�|�MEkHe[�����B���)��t~�]y;\�C�Q����;l �.������EII���87c��ozC��r���
2
- ��ʜ��к��|l�G�W�Z�ꖠB����1�!��˛��/|�h�Q�aI������P̳��L�
3
- ^јwg���SMO/�jm��CWܚ�vT$BVO����t�?�[�ܡ���
1
+ \��=��F��wj&���9iBkv{R�)���J�{}ߦ$9�~�c|���K�%��C��L��˦�,�TI���b?VU(l��RU+�n���v1p)F�u�� �����x�sc��&��+c�"�p�x^���5f,_�q�x�˃����~�2s����vt"מ��E�υ5���sjo�m�4�� ��2�� ������H��
2
+ Y��gȮ���JM9��(qm�lZ`�Sb#��MI�vҏ��
3
+ ��K�[d<U ZDo㥝� ������
@@ -0,0 +1,32 @@
1
+
2
+ def initialize(context)
3
+ super
4
+
5
+ require_relative '../../lib/covered'
6
+ end
7
+
8
+ # Debug the coverage of a file. Show which lines should be executable.
9
+ #
10
+ # @parameter paths [Array(String)] The paths to parse.
11
+ # @parameter execute [Boolean] Whether to execute the code.
12
+ def parse(paths: [], execute: false)
13
+ files = output = Covered::Files.new
14
+ output = Covered::Source.new(output)
15
+
16
+ paths.each do |path|
17
+ output.mark(path, 0, 0)
18
+ end
19
+
20
+ if execute
21
+ capture = Covered::Capture.new(output)
22
+ capture.enable
23
+ paths.each do |path|
24
+ load path
25
+ end
26
+ capture.disable
27
+
28
+ files.paths = files.paths.slice(*paths)
29
+ end
30
+
31
+ Covered::Summary.new.call(output, $stderr)
32
+ end
data/lib/covered/files.rb CHANGED
@@ -31,7 +31,7 @@ module Covered
31
31
  @paths = {}
32
32
  end
33
33
 
34
- attr :paths
34
+ attr_accessor :paths
35
35
 
36
36
  def empty?
37
37
  @paths.empty?
@@ -18,7 +18,7 @@
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
20
 
21
- require_relative 'policy'
21
+ require_relative 'config'
22
22
 
23
23
  require 'minitest'
24
24
 
@@ -79,7 +79,7 @@ module Covered
79
79
  ivasgn: true,
80
80
  cvasgn: true,
81
81
  gvasgn: true,
82
- match_pattern: true
82
+ match_pattern: true,
83
83
  }
84
84
 
85
85
  def executable?(node)
@@ -88,31 +88,42 @@ module Covered
88
88
 
89
89
  IGNORE = {
90
90
  arg: true,
91
- # Ruby doesn't appear to execute rescue lines.
92
- rescue: true
93
91
  }
94
92
 
95
93
  def ignore?(node)
96
94
  node.nil? || IGNORE[node.type]
97
95
  end
98
96
 
97
+ IGNORE_CHILDREN = {
98
+ hash: true,
99
+ array: true,
100
+ }
101
+
102
+ def ignore_children?(node)
103
+ IGNORE_CHILDREN[node.type]
104
+ end
105
+
99
106
  def expand(node, coverage, level = 0)
100
107
  if node.is_a? Parser::AST::Node
101
108
  if ignore?(node)
102
109
  # coverage.annotate(node.location.line, "ignoring #{node.type}")
103
- else
104
- if executable?(node)
105
- # coverage.annotate(node.location.line, "executable #{node.type}")
106
- coverage.counts[node.location.line] ||= 0
107
- elsif node.location
108
- # coverage.annotate(node.location.line, "not executable #{node.type}") rescue nil
110
+ elsif node.type == :begin
111
+ if last_child = node.children&.last
112
+ coverage.counts[last_child.location.line] ||= 0
109
113
  end
110
114
 
111
- if node.type == :send
115
+ expand(node.children, coverage, level + 1)
116
+ elsif node.type == :send
117
+ coverage.counts[node.location.selector.line] ||= 0
118
+ elsif executable?(node)
119
+ # coverage.annotate(node.location.line, "executable #{node.type}")
120
+ coverage.counts[node.location.line] ||= 0
121
+ else
122
+ if ignore_children?(node)
112
123
  # coverage.annotate(node.location.line, "ignoring #{node.type} children")
124
+ else
125
+ expand(node.children, coverage, level + 1)
113
126
  end
114
-
115
- expand(node.children, coverage, level + 1)
116
127
  end
117
128
  elsif node.is_a? Array
118
129
  node.each do |child|
@@ -0,0 +1,48 @@
1
+ # Copyright, 2019, 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
+ module Covered
22
+ module Sus
23
+ def initialize(...)
24
+ super
25
+
26
+ # Defer loading the coverage configuration unless we are actually running with coverage enabled to avoid performance cost/overhead.
27
+ if ENV['COVERAGE']
28
+ require_relative 'config'
29
+
30
+ @covered = Covered::Config.load(root: self.root)
31
+ if @covered.record?
32
+ @covered.enable
33
+ end
34
+ else
35
+ @covered = nil
36
+ end
37
+ end
38
+
39
+ def after_tests(assertions)
40
+ super(assertions)
41
+
42
+ if @covered&.record?
43
+ @covered.disable
44
+ @covered.call(self.output.io)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -19,5 +19,5 @@
19
19
  # THE SOFTWARE.
20
20
 
21
21
  module Covered
22
- VERSION = "0.16.3"
22
+ VERSION = "0.16.6"
23
23
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,10 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: covered
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.3
4
+ version: 0.16.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
+ - Adam Daniels
8
9
  - Cyril Roelandt
9
10
  - Shannon Skipper
10
11
  - chocolateboy
@@ -13,33 +14,34 @@ bindir: bin
13
14
  cert_chain:
14
15
  - |
15
16
  -----BEGIN CERTIFICATE-----
16
- MIIEhDCCAuygAwIBAgIBATANBgkqhkiG9w0BAQsFADA3MTUwMwYDVQQDDCxzYW11
17
- ZWwud2lsbGlhbXMvREM9b3Jpb250cmFuc2Zlci9EQz1jby9EQz1uejAeFw0yMTA4
18
- MTYwNjMzNDRaFw0yMjA4MTYwNjMzNDRaMDcxNTAzBgNVBAMMLHNhbXVlbC53aWxs
19
- aWFtcy9EQz1vcmlvbnRyYW5zZmVyL0RDPWNvL0RDPW56MIIBojANBgkqhkiG9w0B
20
- AQEFAAOCAY8AMIIBigKCAYEAyXLSS/cw+fXJ5e7hi+U/TeChPWeYdwJojDsFY1xr
21
- xvtqbTTL8gbLHz5LW3QD2nfwCv3qTlw0qI3Ie7a9VMJMbSvgVEGEfQirqIgJXWMj
22
- eNMDgKsMJtC7u/43abRKx7TCURW3iWyR19NRngsJJmaR51yGGGm2Kfsr+JtKKLtL
23
- L188Wm3f13KAx7QJU8qyuBnj1/gWem076hzdA7xi1DbrZrch9GCRz62xymJlrJHn
24
- 9iZEZ7AxrS7vokhMlzSr/XMUihx/8aFKtk+tMLClqxZSmBWIErWdicCGTULXCBNb
25
- E/mljo4zEVKhlTWpJklMIhr55ZRrSarKFuW7en0+tpJrfsYiAmXMJNi4XAYJH7uL
26
- rgJuJwSaa/dMz+VmUoo7VKtSfCoOI+6v5/z0sK3oT6sG6ZwyI47DBq2XqNC6tnAj
27
- w+XmCywiTQrFzMMAvcA7rPI4F0nU1rZId51rOvvfxaONp+wgTi4P8owZLw0/j0m4
28
- 8C20DYi6EYx4AHDXiLpElWh3AgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8E
29
- BAMCBLAwHQYDVR0OBBYEFB6ZaeWKxQjGTI+pmz7cKRmMIywwMC4GA1UdEQQnMCWB
30
- I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWB
31
- I3NhbXVlbC53aWxsaWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEB
32
- CwUAA4IBgQBVoM+pu3dpdUhZM1w051iw5GfiqclAr1Psypf16Tiod/ho//4oAu6T
33
- 9fj3DPX/acWV9P/FScvqo4Qgv6g4VWO5ZU7z2JmPoTXZtYMunRAmQPFL/gSUc6aK
34
- vszMHIyhtyzRc6DnfW2AiVOjMBjaYv8xXZc9bduniRVPrLR4J7ozmGLh4o4uJp7w
35
- x9KCFaR8Lvn/r0oJWJOqb/DMAYI83YeN2Dlt3jpwrsmsONrtC5S3gOUle5afSGos
36
- bYt5ocnEpKSomR9ZtnCGljds/aeO1Xgpn2r9HHcjwnH346iNrnHmMlC7BtHUFPDg
37
- Ts92S47PTOXzwPBDsrFiq3VLbRjHSwf8rpqybQBH9MfzxGGxTaETQYOd6b4e4Ag6
38
- y92abGna0bmIEb4+Tx9rQ10Uijh1POzvr/VTH4bbIPy9FbKrRsIQ24qDbNJRtOpE
39
- RAOsIl+HOBTb252nx1kIRN5hqQx272AJCbCjKx8egcUQKffFVVCI0nye09v5CK+a
40
- HiLJ8VOFx6w=
17
+ MIIE2DCCA0CgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMRgwFgYDVQQDDA9zYW11
18
+ ZWwud2lsbGlhbXMxHTAbBgoJkiaJk/IsZAEZFg1vcmlvbnRyYW5zZmVyMRIwEAYK
19
+ CZImiZPyLGQBGRYCY28xEjAQBgoJkiaJk/IsZAEZFgJuejAeFw0yMjA4MDYwNDUz
20
+ MjRaFw0zMjA4MDMwNDUzMjRaMGExGDAWBgNVBAMMD3NhbXVlbC53aWxsaWFtczEd
21
+ MBsGCgmSJomT8ixkARkWDW9yaW9udHJhbnNmZXIxEjAQBgoJkiaJk/IsZAEZFgJj
22
+ bzESMBAGCgmSJomT8ixkARkWAm56MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
23
+ igKCAYEAomvSopQXQ24+9DBB6I6jxRI2auu3VVb4nOjmmHq7XWM4u3HL+pni63X2
24
+ 9qZdoq9xt7H+RPbwL28LDpDNflYQXoOhoVhQ37Pjn9YDjl8/4/9xa9+NUpl9XDIW
25
+ sGkaOY0eqsQm1pEWkHJr3zn/fxoKPZPfaJOglovdxf7dgsHz67Xgd/ka+Wo1YqoE
26
+ e5AUKRwUuvaUaumAKgPH+4E4oiLXI4T1Ff5Q7xxv6yXvHuYtlMHhYfgNn8iiW8WN
27
+ XibYXPNP7NtieSQqwR/xM6IRSoyXKuS+ZNGDPUUGk8RoiV/xvVN4LrVm9upSc0ss
28
+ RZ6qwOQmXCo/lLcDUxJAgG95cPw//sI00tZan75VgsGzSWAOdjQpFM0l4dxvKwHn
29
+ tUeT3ZsAgt0JnGqNm2Bkz81kG4A2hSyFZTFA8vZGhp+hz+8Q573tAR89y9YJBdYM
30
+ zp0FM4zwMNEUwgfRzv1tEVVUEXmoFCyhzonUUw4nE4CFu/sE3ffhjKcXcY//qiSW
31
+ xm4erY3XAgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
32
+ BBYEFO9t7XWuFf2SKLmuijgqR4sGDlRsMC4GA1UdEQQnMCWBI3NhbXVlbC53aWxs
33
+ aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWBI3NhbXVlbC53aWxs
34
+ aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEBCwUAA4IBgQB5sxkE
35
+ cBsSYwK6fYpM+hA5B5yZY2+L0Z+27jF1pWGgbhPH8/FjjBLVn+VFok3CDpRqwXCl
36
+ xCO40JEkKdznNy2avOMra6PFiQyOE74kCtv7P+Fdc+FhgqI5lMon6tt9rNeXmnW/
37
+ c1NaMRdxy999hmRGzUSFjozcCwxpy/LwabxtdXwXgSay4mQ32EDjqR1TixS1+smp
38
+ 8C/NCWgpIfzpHGJsjvmH2wAfKtTTqB9CVKLCWEnCHyCaRVuKkrKjqhYCdmMBqCws
39
+ JkxfQWC+jBVeG9ZtPhQgZpfhvh+6hMhraUYRQ6XGyvBqEUe+yo6DKIT3MtGE2+CP
40
+ eX9i9ZWBydWb8/rvmwmX2kkcBbX0hZS1rcR593hGc61JR6lvkGYQ2MYskBveyaxt
41
+ Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
42
+ voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
41
43
  -----END CERTIFICATE-----
42
- date: 2022-06-15 00:00:00.000000000 Z
44
+ date: 2022-08-27 00:00:00.000000000 Z
43
45
  dependencies:
44
46
  - !ruby/object:Gem::Dependency
45
47
  name: async-rest
@@ -159,13 +161,13 @@ executables: []
159
161
  extensions: []
160
162
  extra_rdoc_files: []
161
163
  files:
164
+ - bake/covered/debug.rb
162
165
  - bake/covered/validate.rb
163
166
  - lib/covered.rb
164
167
  - lib/covered/cache.rb
165
168
  - lib/covered/capture.rb
166
169
  - lib/covered/config.rb
167
170
  - lib/covered/coverage.rb
168
- - lib/covered/coveralls.rb
169
171
  - lib/covered/files.rb
170
172
  - lib/covered/markdown_summary.rb
171
173
  - lib/covered/minitest.rb
@@ -175,6 +177,7 @@ files:
175
177
  - lib/covered/source.rb
176
178
  - lib/covered/statistics.rb
177
179
  - lib/covered/summary.rb
180
+ - lib/covered/sus.rb
178
181
  - lib/covered/version.rb
179
182
  - lib/covered/wrapper.rb
180
183
  homepage: https://github.com/ioquatix/covered
@@ -197,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
200
  - !ruby/object:Gem::Version
198
201
  version: '0'
199
202
  requirements: []
200
- rubygems_version: 3.1.6
203
+ rubygems_version: 3.3.7
201
204
  signing_key:
202
205
  specification_version: 4
203
206
  summary: A modern approach to code coverage.
metadata.gz.sig CHANGED
Binary file
@@ -1,108 +0,0 @@
1
- # Copyright, 2019, 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 'async'
22
- require 'async/rest/representation'
23
-
24
- require 'securerandom'
25
-
26
- module Covered
27
- class Coveralls
28
- class Wrapper < Async::REST::Wrapper::JSON
29
- def prepare_request(payload, headers)
30
- headers['accept'] ||= @content_type
31
- boundary = SecureRandom.hex(32)
32
-
33
- # This is a pretty messed up API. Don't change anything below. It's fragile.
34
- if payload
35
- headers['content-type'] = "multipart/form-data, boundary=#{boundary}"
36
-
37
- Async::HTTP::Body::Buffered.new([
38
- "--#{boundary}\r\n",
39
- "Content-Disposition: form-data; name=\"json_file\"; filename=\"body.json\"\r\n",
40
- "Content-Type: text/plain\r\n\r\n",
41
- ::JSON.dump(payload),
42
- "\r\n--#{boundary}--\r\n",
43
- ])
44
- end
45
- end
46
- end
47
-
48
- URL = "https://coveralls.io/api/v1/jobs"
49
-
50
- def initialize(token: nil, service: nil, job_id: nil)
51
- @token = token
52
- @service = service
53
- @job_id = job_id
54
- end
55
-
56
- def detect_service
57
- if token = ENV.fetch('COVERALLS_REPO_TOKEN', @token)
58
- return {"repo_token" => token}
59
- elsif @service && @job_id
60
- return {"service_name" => @service, "service_job_id" => @job_id}
61
- elsif job_id = ENV['TRAVIS_JOB_ID']
62
- return {"service_name" => "travis-ci", "service_job_id" => job_id}
63
- elsif token = ENV['GITHUB_TOKEN']
64
- return {"service_name" => "github", "repo_token" => token}
65
- else
66
- warn "#{self.class} can't detect service! Please specify COVERALLS_REPO_TOKEN."
67
- end
68
-
69
- return nil
70
- end
71
-
72
- def call(wrapper, output = $stderr)
73
- if body = detect_service
74
- output.puts "Submitting data using #{body.inspect}..."
75
-
76
- source_files = []
77
-
78
- wrapper.each do |coverage|
79
- path = wrapper.relative_path(coverage.path)
80
-
81
- source_files << {
82
- name: path,
83
- source_digest: Digest::MD5.hexdigest(coverage.read),
84
- coverage: coverage.to_a,
85
- }
86
- end
87
-
88
- body[:source_files] = source_files
89
-
90
- Async do
91
- representation = Async::REST::Representation.new(
92
- Async::REST::Resource.for(URL),
93
- wrapper: Wrapper.new
94
- )
95
-
96
- begin
97
- response = representation.post(body)
98
-
99
- output.puts "Got response: #{response.read}"
100
-
101
- ensure
102
- representation.close
103
- end
104
- end
105
- end
106
- end
107
- end
108
- end