minitest-cc 0.1.0 → 0.2.0

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: 69641587074cb1ab7a76d64441ca7adc6d712c29a4464c26ea1479b84249b07f
4
- data.tar.gz: 87bdd0b9a441e27e1f3d027f45bd24c36e615987190aa96a76a28c27fec06214
3
+ metadata.gz: 5f0eeacbc8612187f1e09acf48af6bbe01dc408ae645fc34baff37d469791f93
4
+ data.tar.gz: 0b8dc1f33f412392782265b63919b305d1d5f9154327242d627769225aff3d42
5
5
  SHA512:
6
- metadata.gz: f645fa0afe130223c8bc8dbfb15cd55e2b35b6f50e69c5acf59304ebcc3d6db9d2905bcf6c0173593ee906ccb5fcaa15e184c377d20cc968d644806d4a36f320
7
- data.tar.gz: 41c92382fb9de187dfbcf40dcc37d7151ca81ff97ceff1c8afa21426f4700f1d0942e5c4d82712818743d6ff4f2301742edcc17ba7366d1d0758673cf1d573e5
6
+ metadata.gz: 5807504cf8912e3253123e166fd961cbdceb403d9e4cf7ddaf3a03620b2355070358ddf678b7d75fc8fba676ea5fa8d6072daf7cea3c91127ab7f1c4467477cb
7
+ data.tar.gz: 5e825e40992f750669825a5d823f5fcc68ceec3aa420c4d37b813c9b45f6b16062f80eb7e1e5c741785bfc5094cddcc7cd57a4f2e86c3ca50fb09e2331435bec
@@ -4,26 +4,55 @@ module Minitest
4
4
  module Cc
5
5
  # model for a file
6
6
  class FileCoverage
7
+ #
7
8
  # @return [String] the name of the file with extension
9
+ #
8
10
  attr_accessor :name
11
+
12
+ #
9
13
  # @return [String] the absolute path to the file
14
+ #
10
15
  attr_accessor :path
16
+
17
+ #
11
18
  # @return [String] the relative path to the file
19
+ #
12
20
  attr_accessor :relative_path
21
+
22
+ #
13
23
  # @return [Boolean] if this was tested or not.
14
24
  # this indicate if the file was tracked by coverage or not
25
+ #
15
26
  attr_accessor :tested
27
+
28
+ #
16
29
  # @return [Integer] total lines of the file
30
+ #
17
31
  attr_accessor :lines
32
+
33
+ #
18
34
  # @return [Integer] total lines executed of the file
35
+ #
19
36
  attr_accessor :lines_executed
37
+
38
+ #
20
39
  # @return [Integer] total branches of the file
40
+ #
21
41
  attr_accessor :branches
42
+
43
+ #
22
44
  # @return [Integer] total branches executed of the file
45
+ #
23
46
  attr_accessor :branches_executed
47
+
48
+ #
24
49
  # @return [Integer] total methods of the file
50
+ #
25
51
  attr_accessor :methods
52
+
53
+ #
26
54
  # @return [Integer] total methods executed of the file
55
+ #
27
56
  attr_accessor :methods_executed
28
57
 
29
58
  ##
@@ -31,6 +60,7 @@ module Minitest
31
60
  # @param path [String] full path to the file
32
61
  # @param relative_path [String] relative path to the file
33
62
  # @param result [Hash] object with the result of the coverage for the file
63
+ #
34
64
  def initialize(path, relative_path, result = nil)
35
65
  @path = path
36
66
  @relative_path = relative_path
@@ -42,6 +72,7 @@ module Minitest
42
72
  ##
43
73
  # Set the results of the coverage into the object variables
44
74
  # @param result [Hash] object with the result of the coverage
75
+ #
45
76
  def from_result(result)
46
77
  @lines, @lines_executed = count_lines(result) unless result[:lines].nil?
47
78
  @branches, @branches_executed = count_branches(result) unless result[:branches].nil?
@@ -52,6 +83,7 @@ module Minitest
52
83
  # count total lines and executed lines
53
84
  # @param result [Hash] object with the result of the coverage
54
85
  # @return [Array] Array with two values: First: the total lines. Second: the lines executed
86
+ #
55
87
  def count_lines(result)
56
88
  [result[:lines].count { |n| n.is_a? Integer }, result[:lines].count { |n| n.is_a?(Integer) && n != 0 }]
57
89
  end
@@ -60,6 +92,7 @@ module Minitest
60
92
  # count total branches and executed branches
61
93
  # @param result [Hash] object with the result of the coverage
62
94
  # @return [Array] Array with two values: First: the total branches. Second: the branches executed
95
+ #
63
96
  def count_branches(result)
64
97
  [
65
98
  result[:branches].values.reduce(0) { |sum, v| sum + v.size },
@@ -71,6 +104,7 @@ module Minitest
71
104
  # count total methods and executed methods
72
105
  # @param result [Hash] object with the result of the coverage
73
106
  # @return [Array] Array with two values: First: the total methods. Second: the methods executed
107
+ #
74
108
  def count_methods(result)
75
109
  [result[:methods].length, result[:methods].values.reject(&:zero?).count]
76
110
  end
@@ -78,20 +112,47 @@ module Minitest
78
112
  ##
79
113
  # Transform the object to a readable string
80
114
  # @return [String] contains the information ready to print
115
+ #
81
116
  def to_s
82
- if tested
83
- str = "#{relative_path}: \n lines: #{lines_executed}/#{lines} #{lines_percent}%"
84
- str += "\tbranches: #{branches_executed}/#{branches} #{branches_percent}%" if branches
85
- str += "\tmethods: #{methods_executed}/#{methods} #{methods_percent}%" if methods
86
- str
87
- else
88
- "#{relative_path} : Not executed during the tests."
89
- end
117
+ return "#{relative_path} : Not executed or tracked by cov." unless tested
118
+
119
+ "#{relative_path}:\n" + to_s_lines + to_s_branches + to_s_methods
120
+ end
121
+
122
+ ##
123
+ # Transform lines information to string
124
+ # @return [String] contains information of lines with percent in color
125
+ #
126
+ def to_s_lines
127
+ return '' unless lines
128
+
129
+ " - l: #{lines_executed}/#{lines} #{lines_percent.to_s_color}%"
130
+ end
131
+
132
+ ##
133
+ # Transform branches information to string
134
+ # @return [String] contains information of branches with percent in color
135
+ #
136
+ def to_s_branches
137
+ return '' unless branches
138
+
139
+ " - b: #{branches_executed}/#{branches} #{branches_percent.to_s_color}%"
140
+ end
141
+
142
+ ##
143
+ # Transform methods information to string
144
+ # @return [String] contains information of methods with percent in color
145
+ #
146
+ def to_s_methods
147
+ return '' unless methods
148
+
149
+ " - m: #{methods_executed}/#{methods} #{methods_percent.to_s_color}%"
90
150
  end
91
151
 
92
152
  ##
93
153
  # Calculate the percent of coverage lines
94
154
  # @return [Integer] percent of coverage. executed lines / total lines
155
+ #
95
156
  def lines_percent
96
157
  lines_executed * 100 / lines
97
158
  rescue ZeroDivisionError
@@ -101,6 +162,7 @@ module Minitest
101
162
  ##
102
163
  # Calculate the percent of coverage branches
103
164
  # @return [Integer] percent of coverage. executed branches / total branches
165
+ #
104
166
  def branches_percent
105
167
  branches_executed * 100 / branches
106
168
  rescue ZeroDivisionError
@@ -110,6 +172,7 @@ module Minitest
110
172
  ##
111
173
  # Calculate the percent of coverage methods
112
174
  # @return [Integer] percent of coverage. executed methods / total methods
175
+ #
113
176
  def methods_percent
114
177
  methods_executed * 100 / methods
115
178
  rescue ZeroDivisionError
@@ -1,23 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'minitest'
4
-
5
3
  module Minitest
6
4
  module Cc
7
5
  # Reporter class extend of Minitest Reporter
8
- # this get 5 important methods from the parent
9
- # but we use only 2
10
6
  class Reporter < Minitest::AbstractReporter
11
- ##
12
- # Executed in the beginin of the minitest run
13
- def start
14
- Cc.start_coverage
15
- end
16
-
17
7
  ##
18
8
  # Executed in the final of the minitest run
19
9
  def report
10
+ Cc.peek_result
20
11
  Cc.summary
12
+ rescue StandardError => e
13
+ puts "\n\n[!] cc extension has problem for generate the report: #{e}"
21
14
  end
22
15
  end
23
16
  end
@@ -3,6 +3,6 @@
3
3
  module Minitest
4
4
  module Cc
5
5
  # plugin version
6
- VERSION = '0.1.0'
6
+ VERSION = '0.2.0'
7
7
  end
8
8
  end
data/lib/minitest/cc.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'coverage'
4
+ require 'minitest'
5
+
3
6
  require_relative 'cc/version'
4
7
  require_relative 'cc/reporter'
5
8
  require_relative 'cc/file_coverage'
@@ -9,6 +12,8 @@ module Minitest
9
12
  # Main module of the plugin
10
13
  # @author Andres
11
14
  module Cc
15
+ MODES = %i[lines branches methods].freeze
16
+
12
17
  @results = []
13
18
  @files = FileArray.new
14
19
 
@@ -30,35 +35,46 @@ module Minitest
30
35
  # @return [Array] mode of the coverage, this array could contain:
31
36
  # :lines, :branches, :methods
32
37
  cattr_accessor :coverage_mode
33
- self.coverage_mode = %i[
34
- lines
35
- branches
36
- methods
37
- ]
38
+ self.coverage_mode = MODES
38
39
 
39
40
  class << self
40
41
  ##
41
42
  # Start the coverage process
42
43
  # @see https://runebook.dev/en/docs/ruby/coverage Coverage blog post explaining the use
43
44
  # @see https://ruby-doc.org/stdlib-2.7.6/libdoc/coverage/rdoc/Coverage.html Documentation of the module
45
+ # @deprecated Use {#self.start(*args)} instead.
44
46
  def start_coverage
45
- Coverage.start(coverage_mode.collect { |m| [m, true] }.to_h)
47
+ Coverage.start(@coverage_mode.collect { |m| [m, true] }.to_h)
48
+ end
49
+
50
+ ##
51
+ # start coverage process
52
+ # this method recive the arguments direct and not depend on set coverage mode before start
53
+ # @see https://runebook.dev/en/docs/ruby/coverage Coverage blog post explaining the use
54
+ # @see https://ruby-doc.org/stdlib-2.7.6/libdoc/coverage/rdoc/Coverage.html Documentation of the module
55
+ #
56
+ def start(*args)
57
+ @coverage_mode = args.collect(&:to_sym).select { |a| MODES.include? a } unless args.empty?
58
+ Coverage.start(@coverage_mode.collect { |m| [m, true] }.to_h)
46
59
  end
47
60
 
48
61
  ##
49
- # Print the results after the runs
62
+ # Print results after the runs
63
+ #
50
64
  def summary
51
- @results = Coverage.peek_result
52
- list_files
53
65
  puts "\n\n# Coverage:\n\n"
54
- @files.each { |f| puts f.to_s } if cc_mode == :per_file
55
- puts resume if cc_mode == :resume
56
- puts
66
+ case cc_mode
67
+ when :per_file
68
+ @files.each { |f| puts f.to_s }
69
+ else
70
+ puts resume
71
+ end
57
72
  end
58
73
 
59
74
  ##
60
75
  # This method populate the FileArray variable with results
61
- def list_files
76
+ def peek_result
77
+ @results = Coverage.result
62
78
  Dir.glob(tracked_files.each { |f| File.expand_path(f) }).each do |d|
63
79
  full_path = File.expand_path(d)
64
80
  @files << FileCoverage.new(full_path, d, result_for_file(full_path))
@@ -77,11 +93,44 @@ module Minitest
77
93
  end
78
94
 
79
95
  ##
80
- # compose the string with resume of averages
96
+ # compose the string with resume of cc
81
97
  # @return [String] String with averages
82
98
  def resume
83
- "lines: #{@files.lines_average}% branches: #{@files.branches_average}% methods: #{@files.methods_average}%"
99
+ str = ''
100
+ str += "lines: #{@files.lines_average.to_s_color}%\t" if coverage_mode.include? :lines
101
+ str += "branches: #{@files.branches_average.to_s_color}%\t" if coverage_mode.include? :branches
102
+ str += "methods: #{@files.methods_average.to_s_color}%\t" if coverage_mode.include? :methods
103
+ str
84
104
  end
85
105
  end
86
106
  end
87
107
  end
108
+
109
+ class String # :nodoc:
110
+ def red
111
+ "\e[31m#{self}\e[0m"
112
+ end
113
+
114
+ def green
115
+ "\e[32m#{self}\e[0m"
116
+ end
117
+
118
+ def yellow
119
+ "\e[33m#{self}\e[0m"
120
+ end
121
+ end
122
+
123
+ class Integer # :nodoc:
124
+ def to_s_color
125
+ case self
126
+ when 1..33
127
+ to_s.red
128
+ when 34..66
129
+ to_s.yellow
130
+ when 67..100
131
+ to_s.green
132
+ else
133
+ to_s
134
+ end
135
+ end
136
+ end
@@ -1,17 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'coverage'
4
- require 'minitest'
5
3
  require 'minitest/cc'
6
4
 
7
5
  # Minitest module
8
6
  module Minitest
9
7
  # Init method called from minitest
10
- # it start the plugin
11
8
  def self.plugin_cc_init(_options)
12
- # insert ower reporter to minitest reporters
13
- reporter << Minitest::Cc::Reporter.new
14
- rescue StandardError
15
- puts 'The coverage plugin cannot be initialized.'
9
+ reporter << Minitest::Cc::Reporter.new if Coverage.running?
16
10
  end
17
11
  end
metadata CHANGED
@@ -1,17 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minitest-cc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - a-chacon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-29 00:00:00.000000000 Z
11
+ date: 2022-07-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: 'Plugin for minitest, provide a minimal information of code coverage
14
- to your test output. '
13
+ description: 'Plugin for minitest. It provides minimal information about code coverage. '
15
14
  email:
16
15
  - andres.ch@protonmail.com
17
16
  executables: []
@@ -41,14 +40,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
41
40
  requirements:
42
41
  - - ">="
43
42
  - !ruby/object:Gem::Version
44
- version: 2.5.3
43
+ version: 2.5.0
45
44
  required_rubygems_version: !ruby/object:Gem::Requirement
46
45
  requirements:
47
46
  - - ">="
48
47
  - !ruby/object:Gem::Version
49
48
  version: '0'
50
49
  requirements: []
51
- rubygems_version: 3.2.22
50
+ rubygems_version: 3.2.33
52
51
  signing_key:
53
52
  specification_version: 4
54
53
  summary: Minitest plugin, add code coverage metrics.