simple_cov-formatter-terminal 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.release_assistant.yml +3 -0
- data/.rspec +3 -0
- data/.rubocop.yml +5 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +32 -0
- data/Gemfile.lock +131 -0
- data/LICENSE.txt +21 -0
- data/README.md +123 -0
- data/Rakefile +12 -0
- data/lib/simple_cov/formatter/terminal/branch_coverage.rb +28 -0
- data/lib/simple_cov/formatter/terminal/color_printing.rb +18 -0
- data/lib/simple_cov/formatter/terminal/config.rb +23 -0
- data/lib/simple_cov/formatter/terminal/file_determiner.rb +53 -0
- data/lib/simple_cov/formatter/terminal/line_printer.rb +70 -0
- data/lib/simple_cov/formatter/terminal/r_spec_integration.rb +40 -0
- data/lib/simple_cov/formatter/terminal/rails_awareness.rb +9 -0
- data/lib/simple_cov/formatter/terminal/result_printer.rb +127 -0
- data/lib/simple_cov/formatter/terminal/spec_to_app_mapping.rb +47 -0
- data/lib/simple_cov/formatter/terminal/target_file_writer.rb +15 -0
- data/lib/simple_cov/formatter/terminal/version.rb +10 -0
- data/lib/simple_cov/formatter/terminal.rb +69 -0
- data/simple_cov-formatter-terminal.gemspec +44 -0
- metadata +169 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0037c0f75039602b73a5c02b56091392b253bbd14d297f44fe6a0a1463dfa844
|
4
|
+
data.tar.gz: a91aee34a3560e838481318fc56680682b01a3a635ca7f18ae0d83049aeea298
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5bc1c96efcf14e290abdeca72bf850a4762239f8a01760c7db162c7cfb2418093e42c34c2fd4482379a3565b1eec292254b097e5a63a9def8dbf431703e9933b
|
7
|
+
data.tar.gz: cc5c94164de7385f4bb770017b657d548aff92e516fbc9fc580b192f2e387b190997118cc11a89460e925a7d6cbc318f165f2fa3df3a3957fd020130d6738427
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
ruby '3.2.0'
|
4
|
+
|
5
|
+
source 'https://rubygems.org'
|
6
|
+
|
7
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
8
|
+
|
9
|
+
# Specify your gem's dependencies in fcom.gemspec
|
10
|
+
gemspec
|
11
|
+
|
12
|
+
group :development, :test do
|
13
|
+
gem 'bundler', require: false
|
14
|
+
gem 'pry', require: false
|
15
|
+
gem 'pry-byebug', require: false
|
16
|
+
gem 'rubocop', require: false
|
17
|
+
gem 'rubocop-performance', require: false
|
18
|
+
gem 'rubocop-rspec', require: false
|
19
|
+
gem 'runger_style', github: 'davidrunger/runger_style', require: false
|
20
|
+
end
|
21
|
+
|
22
|
+
group :test do
|
23
|
+
gem 'climate_control', require: false
|
24
|
+
gem 'codecov', require: false
|
25
|
+
gem 'rspec', require: false
|
26
|
+
gem 'simplecov', require: false
|
27
|
+
end
|
28
|
+
|
29
|
+
group :development do
|
30
|
+
gem 'rake', require: false
|
31
|
+
gem 'release_assistant', require: false, git: 'https://github.com/davidrunger/release_assistant'
|
32
|
+
end
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
GIT
|
2
|
+
remote: https://github.com/davidrunger/release_assistant
|
3
|
+
revision: 4a6db008f26327bbee9758ddd2bad070b14d2e88
|
4
|
+
specs:
|
5
|
+
release_assistant (0.3.3.alpha)
|
6
|
+
activesupport (>= 6, < 8)
|
7
|
+
colorize (~> 0.8)
|
8
|
+
memoist (~> 0.16)
|
9
|
+
slop (~> 4.8)
|
10
|
+
|
11
|
+
GIT
|
12
|
+
remote: https://github.com/davidrunger/runger_style
|
13
|
+
revision: 4a68671e36d5734cb50331f904fb5a1a7ab9b429
|
14
|
+
specs:
|
15
|
+
runger_style (0.2.22.alpha)
|
16
|
+
rubocop (>= 1.38.0, < 2)
|
17
|
+
|
18
|
+
PATH
|
19
|
+
remote: .
|
20
|
+
specs:
|
21
|
+
simple_cov-formatter-terminal (0.1.0)
|
22
|
+
activesupport (>= 7.0.4, < 8)
|
23
|
+
memoist (>= 0.16.2, < 1)
|
24
|
+
rouge (>= 4.0.0, < 5)
|
25
|
+
rspec-core (>= 3.11.0, < 4)
|
26
|
+
simplecov (>= 0.21.2, < 1)
|
27
|
+
|
28
|
+
GEM
|
29
|
+
remote: https://rubygems.org/
|
30
|
+
specs:
|
31
|
+
activesupport (7.0.4)
|
32
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
33
|
+
i18n (>= 1.6, < 2)
|
34
|
+
minitest (>= 5.1)
|
35
|
+
tzinfo (~> 2.0)
|
36
|
+
ast (2.4.2)
|
37
|
+
byebug (11.1.3)
|
38
|
+
climate_control (1.2.0)
|
39
|
+
codecov (0.6.0)
|
40
|
+
simplecov (>= 0.15, < 0.22)
|
41
|
+
coderay (1.1.3)
|
42
|
+
colorize (0.8.1)
|
43
|
+
concurrent-ruby (1.1.10)
|
44
|
+
diff-lcs (1.5.0)
|
45
|
+
docile (1.4.0)
|
46
|
+
i18n (1.12.0)
|
47
|
+
concurrent-ruby (~> 1.0)
|
48
|
+
json (2.6.3)
|
49
|
+
memoist (0.16.2)
|
50
|
+
method_source (1.0.0)
|
51
|
+
minitest (5.16.3)
|
52
|
+
parallel (1.22.1)
|
53
|
+
parser (3.2.0.0)
|
54
|
+
ast (~> 2.4.1)
|
55
|
+
pry (0.14.1)
|
56
|
+
coderay (~> 1.1)
|
57
|
+
method_source (~> 1.0)
|
58
|
+
pry-byebug (3.10.1)
|
59
|
+
byebug (~> 11.0)
|
60
|
+
pry (>= 0.13, < 0.15)
|
61
|
+
rainbow (3.1.1)
|
62
|
+
rake (13.0.6)
|
63
|
+
regexp_parser (2.6.1)
|
64
|
+
rexml (3.2.5)
|
65
|
+
rouge (4.0.0)
|
66
|
+
rspec (3.11.0)
|
67
|
+
rspec-core (~> 3.11.0)
|
68
|
+
rspec-expectations (~> 3.11.0)
|
69
|
+
rspec-mocks (~> 3.11.0)
|
70
|
+
rspec-core (3.11.0)
|
71
|
+
rspec-support (~> 3.11.0)
|
72
|
+
rspec-expectations (3.11.1)
|
73
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
74
|
+
rspec-support (~> 3.11.0)
|
75
|
+
rspec-mocks (3.11.1)
|
76
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
77
|
+
rspec-support (~> 3.11.0)
|
78
|
+
rspec-support (3.11.1)
|
79
|
+
rubocop (1.42.0)
|
80
|
+
json (~> 2.3)
|
81
|
+
parallel (~> 1.10)
|
82
|
+
parser (>= 3.1.2.1)
|
83
|
+
rainbow (>= 2.2.2, < 4.0)
|
84
|
+
regexp_parser (>= 1.8, < 3.0)
|
85
|
+
rexml (>= 3.2.5, < 4.0)
|
86
|
+
rubocop-ast (>= 1.24.1, < 2.0)
|
87
|
+
ruby-progressbar (~> 1.7)
|
88
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
89
|
+
rubocop-ast (1.24.1)
|
90
|
+
parser (>= 3.1.1.0)
|
91
|
+
rubocop-performance (1.15.0)
|
92
|
+
rubocop (>= 1.7.0, < 2.0)
|
93
|
+
rubocop-ast (>= 0.4.0)
|
94
|
+
rubocop-rspec (2.13.2)
|
95
|
+
rubocop (~> 1.33)
|
96
|
+
ruby-progressbar (1.11.0)
|
97
|
+
simplecov (0.21.2)
|
98
|
+
docile (~> 1.1)
|
99
|
+
simplecov-html (~> 0.11)
|
100
|
+
simplecov_json_formatter (~> 0.1)
|
101
|
+
simplecov-html (0.12.3)
|
102
|
+
simplecov_json_formatter (0.1.4)
|
103
|
+
slop (4.9.3)
|
104
|
+
tzinfo (2.0.5)
|
105
|
+
concurrent-ruby (~> 1.0)
|
106
|
+
unicode-display_width (2.4.2)
|
107
|
+
|
108
|
+
PLATFORMS
|
109
|
+
ruby
|
110
|
+
|
111
|
+
DEPENDENCIES
|
112
|
+
bundler
|
113
|
+
climate_control
|
114
|
+
codecov
|
115
|
+
pry
|
116
|
+
pry-byebug
|
117
|
+
rake
|
118
|
+
release_assistant!
|
119
|
+
rspec
|
120
|
+
rubocop
|
121
|
+
rubocop-performance
|
122
|
+
rubocop-rspec
|
123
|
+
runger_style!
|
124
|
+
simple_cov-formatter-terminal!
|
125
|
+
simplecov
|
126
|
+
|
127
|
+
RUBY VERSION
|
128
|
+
ruby 3.2.0p0
|
129
|
+
|
130
|
+
BUNDLED WITH
|
131
|
+
2.3.23
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2022 David Runger
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
# SimpleCov::Formatter::Terminal
|
2
|
+
|
3
|
+
![image](https://user-images.githubusercontent.com/8197963/195740768-e2cbb99d-7cf2-42bf-a178-2f78eb653dd3.png)
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
*Note:* This gem depends upon RSpec. If you aren't using RSpec to run your tests, it won't work!
|
8
|
+
|
9
|
+
Add the gem to your application's `Gemfile`. Because the gem is not released via RubyGems, you will
|
10
|
+
need to install it from GitHub.
|
11
|
+
|
12
|
+
```rb
|
13
|
+
group :test do
|
14
|
+
gem 'simple_cov-formatter-terminal', github: 'davidrunger/simple_cov-formatter-terminal'
|
15
|
+
end
|
16
|
+
```
|
17
|
+
|
18
|
+
Then execute:
|
19
|
+
|
20
|
+
```
|
21
|
+
$ bundle install
|
22
|
+
```
|
23
|
+
|
24
|
+
## Usage
|
25
|
+
|
26
|
+
Add something like the following to your `spec/spec_helper.rb` file:
|
27
|
+
|
28
|
+
```rb
|
29
|
+
require 'simplecov'
|
30
|
+
if RSpec.configuration.files_to_run.one?
|
31
|
+
require 'simple_cov/formatter/terminal'
|
32
|
+
SimpleCov.formatter = SimpleCov::Formatter::Terminal
|
33
|
+
end
|
34
|
+
SimpleCov.start
|
35
|
+
```
|
36
|
+
|
37
|
+
**Note** that this setup only uses `SimpleCov::Formatter::Terminal` when specs are run with a single
|
38
|
+
spec file (e.g. `bin/rspec spec/models/user_spec.rb`) and not when multiple specs are executed (e.g.
|
39
|
+
when simply running `bin/rspec` without any argument).
|
40
|
+
|
41
|
+
### Modifying the `spec_to_app_file_map`
|
42
|
+
|
43
|
+
`SimpleCov::Formatter::Terminal` has a default hash that is used to map spec files to their
|
44
|
+
corresponding application file.
|
45
|
+
|
46
|
+
For gems (determined from whether there is a `.gemspec` file at the top level of the project), the
|
47
|
+
default mapping is very simple:
|
48
|
+
|
49
|
+
```rb
|
50
|
+
SimpleCov::Formatter::Terminal.config.spec_to_app_file_map = {
|
51
|
+
%r{\Aspec/} => 'lib/',
|
52
|
+
}
|
53
|
+
```
|
54
|
+
|
55
|
+
This is the default used for non-gems; it is optimized for Rails applications using Active Admin:
|
56
|
+
|
57
|
+
```rb
|
58
|
+
SimpleCov::Formatter::Terminal.config.spec_to_app_file_map = {
|
59
|
+
%r{\Aspec/lib/} => 'lib/',
|
60
|
+
%r{\Aspec/controllers/admin/(.*)_controller_spec.rb} => 'app/admin/\1.rb',
|
61
|
+
%r{
|
62
|
+
\Aspec/
|
63
|
+
(
|
64
|
+
actions|
|
65
|
+
channels|
|
66
|
+
controllers|
|
67
|
+
decorators|
|
68
|
+
helpers|
|
69
|
+
mailboxes|
|
70
|
+
mailers|
|
71
|
+
models|
|
72
|
+
policies|
|
73
|
+
serializers|
|
74
|
+
views|
|
75
|
+
workers
|
76
|
+
)
|
77
|
+
/
|
78
|
+
}x => 'app/\1/',
|
79
|
+
}
|
80
|
+
```
|
81
|
+
|
82
|
+
If needed for your application, you can add to this hash in your `spec/spec_helper.rb`, e.g.:
|
83
|
+
|
84
|
+
```rb
|
85
|
+
SimpleCov::Formatter::Terminal.config.spec_to_app_file_map.merge!(
|
86
|
+
%r{\Aspec/my_special/directory_structure/} => 'my_special/app_directory/',
|
87
|
+
)
|
88
|
+
```
|
89
|
+
|
90
|
+
Or you can override the default mapping completely:
|
91
|
+
|
92
|
+
```rb
|
93
|
+
SimpleCov::Formatter::Terminal.config.spec_to_app_file_map = {
|
94
|
+
%r{\Aspec/my_special/directory_structure/} => 'my_special/app_directory/',
|
95
|
+
}
|
96
|
+
```
|
97
|
+
|
98
|
+
## Branch coverage
|
99
|
+
|
100
|
+
If you enable branch coverage for SimpleCov (via `enable_coverage(:branch)` within your
|
101
|
+
`SimpleCov.start` block; read more [here][simple-cov-branch-coverage]), then branch coverage info
|
102
|
+
will be included in SimpleCov::Formatter::Terminal's output. Missed branches will be indicated with
|
103
|
+
white text on a red background at the end of the line, and the line number will be printed in red
|
104
|
+
text on a yellow background, as seen in the screenshot at the top of this README (where a `then`
|
105
|
+
branch is not covered on line 18).
|
106
|
+
|
107
|
+
[simple-cov-branch-coverage]: https://github.com/simplecov-ruby/simplecov#branch-coverage-ruby--25
|
108
|
+
|
109
|
+
## Development
|
110
|
+
|
111
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/rspec` to run
|
112
|
+
the tests. You can also run `bin/console` for an interactive prompt that will allow you to
|
113
|
+
experiment.
|
114
|
+
|
115
|
+
## Contributing
|
116
|
+
|
117
|
+
Bug reports and pull requests are welcome on GitHub at
|
118
|
+
https://github.com/davidrunger/simple_cov-formatter-terminal.
|
119
|
+
|
120
|
+
## License
|
121
|
+
|
122
|
+
The gem is available as open source under the terms of the [MIT
|
123
|
+
License](https://opensource.org/licenses/MIT).
|
data/Rakefile
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'memoist'
|
4
|
+
|
5
|
+
module SimpleCov::Formatter::Terminal::BranchCoverage
|
6
|
+
extend Memoist
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
memoize \
|
11
|
+
def uncovered_branches(sourcefile)
|
12
|
+
sourcefile.branches.
|
13
|
+
reject(&:covered?).
|
14
|
+
reject do |branch|
|
15
|
+
line = sourcefile.lines[branch.start_line - 1]
|
16
|
+
source_code = line.src
|
17
|
+
line.coverage == 0 || source_code.match?(/# :nocov-(#{branch.type}):/)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def missed_branch_info(line, sourcefile)
|
22
|
+
uncovered_branches(sourcefile).
|
23
|
+
select { _1.start_line == line.line_number }.
|
24
|
+
map { _1.type.to_s }.
|
25
|
+
join(', ').
|
26
|
+
presence
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SimpleCov::Formatter::Terminal::ColorPrinting
|
4
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
5
|
+
def color(message, color)
|
6
|
+
case color
|
7
|
+
when :white then "\e[0;37;49m#{message}\e[0m"
|
8
|
+
when :red then "\e[0;31m#{message}\e[0m"
|
9
|
+
when :green then "\e[1;32;49m#{message}\e[0m"
|
10
|
+
when :yellow then "\e[0;33m#{message}\e[0m"
|
11
|
+
when :white_on_green then "\e[1;39;102m#{message}\e[0m"
|
12
|
+
when :red_on_yellow then "\e[0;31;103m#{message}\e[0m"
|
13
|
+
when :white_on_red then "\e[1;37;41m#{message}\e[0m"
|
14
|
+
else raise("Unknown color format '#{color}'.")
|
15
|
+
end
|
16
|
+
end
|
17
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
18
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './spec_to_app_mapping'
|
4
|
+
require 'memoist'
|
5
|
+
|
6
|
+
class SimpleCov::Formatter::Terminal::Config
|
7
|
+
extend Memoist
|
8
|
+
include SimpleCov::Formatter::Terminal::SpecToAppMapping
|
9
|
+
|
10
|
+
attr_accessor :spec_to_app_file_map, :unmappable_spec_regexes
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@spec_to_app_file_map =
|
14
|
+
SimpleCov::Formatter::Terminal::SpecToAppMapping.default_spec_to_app_map
|
15
|
+
@unmappable_spec_regexes =
|
16
|
+
SimpleCov::Formatter::Terminal::SpecToAppMapping::DEFAULT_UNMAPPABLE_SPEC_REGEXES
|
17
|
+
end
|
18
|
+
|
19
|
+
memoize \
|
20
|
+
def write_target_info_file?
|
21
|
+
ENV.fetch('SIMPLECOV_WRITE_TARGET_TO_FILE', nil) == '1'
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'memoist'
|
4
|
+
|
5
|
+
class SimpleCov::Formatter::Terminal::FileDeterminer
|
6
|
+
extend Memoist
|
7
|
+
|
8
|
+
memoize \
|
9
|
+
def executed_spec_file
|
10
|
+
if executed_spec_files.size == 1
|
11
|
+
executed_spec_files.first
|
12
|
+
else
|
13
|
+
raise(<<~ERROR)
|
14
|
+
Multiple spec files were executed (#{executed_spec_files}), but
|
15
|
+
SimpleCov::Formatter::Terminal only works when a single spec file is executed.
|
16
|
+
ERROR
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
memoize \
|
21
|
+
def targeted_application_file
|
22
|
+
env_variable_file = ENV.fetch('SIMPLECOV_TARGET_FILE', nil)
|
23
|
+
if !env_variable_file.nil?
|
24
|
+
puts('Determined targeted application file from SIMPLECOV_TARGET_FILE environment variable!!')
|
25
|
+
return env_variable_file
|
26
|
+
end
|
27
|
+
|
28
|
+
return nil if unmappable_spec_regexes.any? { executed_spec_file.match?(_1) }
|
29
|
+
|
30
|
+
spec_to_app_file_map.lazy.filter_map do |spec_file_regex, app_file_substitution|
|
31
|
+
if executed_spec_file.match?(spec_file_regex)
|
32
|
+
executed_spec_file.sub(spec_file_regex, app_file_substitution)
|
33
|
+
end
|
34
|
+
end.first&.sub(/_spec\.rb\z/, '.rb') ||
|
35
|
+
raise("Could not map executed spec file #{executed_spec_file} to application file!")
|
36
|
+
end
|
37
|
+
|
38
|
+
memoize \
|
39
|
+
def executed_spec_files
|
40
|
+
SimpleCov::Formatter::Terminal::RSpecIntegration.executed_spec_files
|
41
|
+
end
|
42
|
+
|
43
|
+
memoize \
|
44
|
+
def spec_to_app_file_map
|
45
|
+
SimpleCov::Formatter::Terminal.config.spec_to_app_file_map ||
|
46
|
+
SimpleCov::Formatter::Terminal::SpecToAppMapping.default_spec_to_app_map
|
47
|
+
end
|
48
|
+
|
49
|
+
memoize \
|
50
|
+
def unmappable_spec_regexes
|
51
|
+
SimpleCov::Formatter::Terminal.config.unmappable_spec_regexes
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'memoist'
|
4
|
+
|
5
|
+
class SimpleCov::Formatter::Terminal::LinePrinter
|
6
|
+
extend Memoist
|
7
|
+
include SimpleCov::Formatter::Terminal::BranchCoverage
|
8
|
+
include SimpleCov::Formatter::Terminal::ColorPrinting
|
9
|
+
|
10
|
+
def initialize(targeted_application_file)
|
11
|
+
@targeted_application_file = targeted_application_file
|
12
|
+
end
|
13
|
+
|
14
|
+
def colored_line(line, sourcefile)
|
15
|
+
colored_source_code = syntax_highlighted_source_lines[line.line_number - 1]
|
16
|
+
line_number = line.line_number
|
17
|
+
|
18
|
+
case
|
19
|
+
when line.skipped?
|
20
|
+
numbered_line_output(line_number, :white, colored_source_code)
|
21
|
+
when line.coverage == 0
|
22
|
+
numbered_line_output(line_number, :white_on_red, colored_source_code)
|
23
|
+
when (missed_branch_info = missed_branch_info(line, sourcefile))
|
24
|
+
numbered_line_output(line_number, :red_on_yellow, colored_source_code, missed_branch_info)
|
25
|
+
when line.coverage.nil?
|
26
|
+
numbered_line_output(line_number, :white, colored_source_code, missed_branch_info)
|
27
|
+
else
|
28
|
+
numbered_line_output(line_number, :green, colored_source_code, missed_branch_info)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# rubocop:disable Style/StringConcatenation
|
33
|
+
def numbered_line_output(line_number, color, source_code, missed_branch_info = nil)
|
34
|
+
colored_space =
|
35
|
+
case color
|
36
|
+
when :red_on_yellow, :white_on_red then color(' ', color)
|
37
|
+
else color(' ', :white_on_green)
|
38
|
+
end
|
39
|
+
|
40
|
+
line_number_string =
|
41
|
+
if SimpleCov::Formatter::Terminal.config.write_target_info_file?
|
42
|
+
":::#{line_number}".rjust(6, ' ')
|
43
|
+
else
|
44
|
+
line_number.to_s.rjust(3, ' ')
|
45
|
+
end
|
46
|
+
|
47
|
+
output =
|
48
|
+
colored_space +
|
49
|
+
color(line_number_string, color) +
|
50
|
+
colored_space +
|
51
|
+
' ' +
|
52
|
+
source_code
|
53
|
+
|
54
|
+
if missed_branch_info
|
55
|
+
output << " #{color(missed_branch_info, :white_on_red)}"
|
56
|
+
end
|
57
|
+
|
58
|
+
output
|
59
|
+
end
|
60
|
+
# rubocop:enable Style/StringConcatenation
|
61
|
+
|
62
|
+
memoize \
|
63
|
+
def syntax_highlighted_source_lines
|
64
|
+
source = File.read(@targeted_application_file)
|
65
|
+
formatter = Rouge::Formatters::Terminal256.new(Rouge::Themes::Base16.mode(:dark).new)
|
66
|
+
lexer = Rouge::Lexers::Ruby.new
|
67
|
+
highlighted_source = formatter.format(lexer.lex(source))
|
68
|
+
highlighted_source.split("\n")
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SimpleCov::Formatter::Terminal::RSpecIntegration
|
4
|
+
class << self
|
5
|
+
attr_accessor :executed_spec_files, :failure_occurred
|
6
|
+
|
7
|
+
def setup_rspec
|
8
|
+
return if @rspec_is_set_up # :nocov-else:
|
9
|
+
|
10
|
+
# We can't easily test this, since we use this library in its own RSpec tests,
|
11
|
+
# so we'd be setting it up twice if we tested it, which would be a bit of a problem.
|
12
|
+
# :nocov:
|
13
|
+
_setup_rspec
|
14
|
+
@rspec_is_set_up = true
|
15
|
+
# :nocov:
|
16
|
+
end
|
17
|
+
|
18
|
+
def failure_occurred?
|
19
|
+
!!@failure_occurred
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def _setup_rspec
|
25
|
+
RSpec.configure do |config|
|
26
|
+
config.before(:suite) do
|
27
|
+
SimpleCov::Formatter::Terminal::RSpecIntegration.failure_occurred = false
|
28
|
+
end
|
29
|
+
|
30
|
+
config.after(:suite) do
|
31
|
+
examples = RSpec.world.filtered_examples.values.flatten
|
32
|
+
SimpleCov::Formatter::Terminal::RSpecIntegration.failure_occurred =
|
33
|
+
examples.any?(&:exception)
|
34
|
+
SimpleCov::Formatter::Terminal::RSpecIntegration.executed_spec_files =
|
35
|
+
examples.map { _1.file_path.delete_prefix('./') }.uniq
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './branch_coverage'
|
4
|
+
require_relative './color_printing'
|
5
|
+
require_relative './line_printer'
|
6
|
+
require_relative './target_file_writer'
|
7
|
+
|
8
|
+
class SimpleCov::Formatter::Terminal::ResultPrinter
|
9
|
+
extend Forwardable
|
10
|
+
extend Memoist
|
11
|
+
include SimpleCov::Formatter::Terminal::BranchCoverage
|
12
|
+
include SimpleCov::Formatter::Terminal::ColorPrinting
|
13
|
+
|
14
|
+
def_delegators(:@file_determiner, :executed_spec_file, :targeted_application_file)
|
15
|
+
|
16
|
+
def initialize(file_determiner)
|
17
|
+
@file_determiner = file_determiner
|
18
|
+
end
|
19
|
+
|
20
|
+
def print_coverage_info(result)
|
21
|
+
sourcefile = result.files.find { _1.filename.end_with?(targeted_application_file) }
|
22
|
+
force_coverage = ENV.fetch('SIMPLECOV_FORCE_DETAILS', nil) == '1'
|
23
|
+
|
24
|
+
if sourcefile.nil?
|
25
|
+
print_no_coverage_info_found
|
26
|
+
elsif failure_occurred? && !force_coverage
|
27
|
+
print_coverage_summary(sourcefile, 'Not showing detailed coverage because an example failed.')
|
28
|
+
elsif sourcefile.covered_percent < 100 || uncovered_branches(sourcefile).any? || force_coverage
|
29
|
+
print_coverage_details(sourcefile)
|
30
|
+
else
|
31
|
+
print_coverage_summary(sourcefile)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def print_coverage_summary(sourcefile, log_addendum = nil)
|
36
|
+
summary = +"-- Coverage for #{targeted_application_file} --\n"
|
37
|
+
summary << "Line coverage: #{colorized_coverage(sourcefile.covered_percent)}"
|
38
|
+
if SimpleCov.branch_coverage?
|
39
|
+
summary << ' '
|
40
|
+
summary << <<~LOG
|
41
|
+
| Uncovered branches: #{colorized_uncovered_branches(uncovered_branches(sourcefile).size)}
|
42
|
+
LOG
|
43
|
+
else
|
44
|
+
summary << "\n"
|
45
|
+
end
|
46
|
+
summary << log_addendum if log_addendum
|
47
|
+
puts(summary)
|
48
|
+
end
|
49
|
+
|
50
|
+
def print_coverage_details(sourcefile)
|
51
|
+
if SimpleCov::Formatter::Terminal.config.write_target_info_file?
|
52
|
+
target_file_writer.write_target_info_file
|
53
|
+
end
|
54
|
+
|
55
|
+
puts("---- Coverage for #{targeted_application_file} ".ljust(80, '-').rstrip)
|
56
|
+
sourcefile.lines.each do |line|
|
57
|
+
puts(line_printer.colored_line(line, sourcefile))
|
58
|
+
end
|
59
|
+
puts(<<~LOG.squish)
|
60
|
+
----
|
61
|
+
Line coverage: #{colorized_coverage(sourcefile.covered_percent)}
|
62
|
+
|
|
63
|
+
Uncovered branches: #{colorized_uncovered_branches(uncovered_branches(sourcefile).size)}
|
64
|
+
----
|
65
|
+
LOG
|
66
|
+
end
|
67
|
+
|
68
|
+
def print_no_coverage_info_found
|
69
|
+
puts(<<~LOG.squish)
|
70
|
+
No code coverage info was found for "#{targeted_application_file}". Try stopping and
|
71
|
+
disabling `spring`, if you are using it, and then rerun the spec.
|
72
|
+
LOG
|
73
|
+
end
|
74
|
+
|
75
|
+
def print_info_for_no_executed_specs
|
76
|
+
puts('Not showing test coverage details because no specs were executed successfully.')
|
77
|
+
end
|
78
|
+
|
79
|
+
def print_info_for_undetermined_application_target
|
80
|
+
puts(<<~LOG.squish)
|
81
|
+
Not showing test coverage details because "#{executed_spec_file}" cannot
|
82
|
+
be mapped to a single application file.
|
83
|
+
LOG
|
84
|
+
puts(<<~LOG.squish)
|
85
|
+
Tip: you can specify a file manually via a SIMPLECOV_TARGET_FILE environment variable.
|
86
|
+
LOG
|
87
|
+
end
|
88
|
+
|
89
|
+
def print_info_for_nonexistent_application_target
|
90
|
+
puts(<<~LOG.squish)
|
91
|
+
Cannot show code coverage. Looked for application file "#{targeted_application_file}",
|
92
|
+
but it does not exist.
|
93
|
+
LOG
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def failure_occurred?
|
99
|
+
SimpleCov::Formatter::Terminal::RSpecIntegration.failure_occurred?
|
100
|
+
end
|
101
|
+
|
102
|
+
memoize \
|
103
|
+
def target_file_writer
|
104
|
+
SimpleCov::Formatter::Terminal::TargetFileWriter.new(targeted_application_file)
|
105
|
+
end
|
106
|
+
|
107
|
+
def colorized_coverage(covered_percent)
|
108
|
+
case
|
109
|
+
when covered_percent >= 100 then color("#{covered_percent.round(2)}%", :green)
|
110
|
+
when covered_percent >= 80 then color("#{covered_percent.round(2)}%", :yellow)
|
111
|
+
else color("#{covered_percent.round(2)}%", :red)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def colorized_uncovered_branches(num_uncovered_branches)
|
116
|
+
case num_uncovered_branches
|
117
|
+
when 0 then color(num_uncovered_branches.to_s, :green)
|
118
|
+
when (1..3) then color(num_uncovered_branches.to_s, :yellow)
|
119
|
+
else color(num_uncovered_branches.to_s, :red)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
memoize \
|
124
|
+
def line_printer
|
125
|
+
SimpleCov::Formatter::Terminal::LinePrinter.new(targeted_application_file)
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative './rails_awareness'
|
4
|
+
|
5
|
+
module SimpleCov::Formatter::Terminal::SpecToAppMapping
|
6
|
+
# rubocop:disable Lint/OrAssignmentToConstant
|
7
|
+
DEFAULT_UNMAPPABLE_SPEC_REGEXES ||= [
|
8
|
+
%r{\Aspec/features/},
|
9
|
+
].freeze
|
10
|
+
SPEC_TO_GEM_DEFAULT_MAP ||= {
|
11
|
+
%r{\Aspec/} => 'lib/',
|
12
|
+
}.freeze
|
13
|
+
SPEC_TO_RAILS_DEFAULT_MAP ||= {
|
14
|
+
%r{\Aspec/lib/} => 'lib/',
|
15
|
+
%r{\Aspec/controllers/admin/(.*)_controller_spec.rb} => 'app/admin/\1.rb',
|
16
|
+
%r{
|
17
|
+
\Aspec/
|
18
|
+
(
|
19
|
+
actions|
|
20
|
+
channels|
|
21
|
+
controllers|
|
22
|
+
decorators|
|
23
|
+
helpers|
|
24
|
+
mailboxes|
|
25
|
+
mailers|
|
26
|
+
models|
|
27
|
+
policies|
|
28
|
+
serializers|
|
29
|
+
views|
|
30
|
+
workers
|
31
|
+
)
|
32
|
+
/
|
33
|
+
}x => 'app/\1/',
|
34
|
+
}.freeze
|
35
|
+
# rubocop:enable Lint/OrAssignmentToConstant
|
36
|
+
|
37
|
+
class << self
|
38
|
+
def default_spec_to_app_map
|
39
|
+
# dup the maps because the maps are frozen but we want to allow the user to customize them
|
40
|
+
if SimpleCov::Formatter::Terminal::RailsAwareness.rails?
|
41
|
+
SPEC_TO_RAILS_DEFAULT_MAP.dup
|
42
|
+
else
|
43
|
+
SPEC_TO_GEM_DEFAULT_MAP.dup
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'memoist'
|
4
|
+
|
5
|
+
class SimpleCov::Formatter::Terminal::TargetFileWriter
|
6
|
+
def initialize(targeted_application_file)
|
7
|
+
@targeted_application_file = targeted_application_file
|
8
|
+
end
|
9
|
+
|
10
|
+
def write_target_info_file
|
11
|
+
directory = 'tmp/simple_cov/formatter/terminal'
|
12
|
+
FileUtils.mkdir_p(directory)
|
13
|
+
File.write("#{directory}/target.txt", "#{@targeted_application_file}\n")
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class SimpleCov::Formatter::Terminal ; end # rubocop:disable Lint/EmptyClass
|
4
|
+
|
5
|
+
require_relative 'terminal/config'
|
6
|
+
require_relative 'terminal/file_determiner'
|
7
|
+
require_relative 'terminal/r_spec_integration'
|
8
|
+
require_relative 'terminal/result_printer'
|
9
|
+
require_relative 'terminal/version'
|
10
|
+
require 'active_support/core_ext/object/blank'
|
11
|
+
require 'active_support/core_ext/string/filters'
|
12
|
+
require 'memoist'
|
13
|
+
require 'rouge'
|
14
|
+
require 'rspec/core'
|
15
|
+
require 'simplecov'
|
16
|
+
|
17
|
+
class SimpleCov::Formatter::Terminal
|
18
|
+
extend Forwardable
|
19
|
+
extend Memoist
|
20
|
+
|
21
|
+
def_delegators(
|
22
|
+
:file_determiner,
|
23
|
+
:executed_spec_file,
|
24
|
+
:executed_spec_files,
|
25
|
+
:targeted_application_file,
|
26
|
+
)
|
27
|
+
def_delegators(
|
28
|
+
:result_printer,
|
29
|
+
:print_coverage_info,
|
30
|
+
:print_info_for_no_executed_specs,
|
31
|
+
:print_info_for_nonexistent_application_target,
|
32
|
+
:print_info_for_undetermined_application_target,
|
33
|
+
)
|
34
|
+
|
35
|
+
class << self
|
36
|
+
extend Memoist
|
37
|
+
|
38
|
+
memoize \
|
39
|
+
def config
|
40
|
+
Config.new
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def format(result)
|
45
|
+
if executed_spec_files.nil?
|
46
|
+
print_info_for_no_executed_specs
|
47
|
+
elsif targeted_application_file.nil?
|
48
|
+
print_info_for_undetermined_application_target
|
49
|
+
elsif File.exist?(targeted_application_file)
|
50
|
+
print_coverage_info(result)
|
51
|
+
else
|
52
|
+
print_info_for_nonexistent_application_target
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
memoize \
|
59
|
+
def file_determiner
|
60
|
+
SimpleCov::Formatter::Terminal::FileDeterminer.new
|
61
|
+
end
|
62
|
+
|
63
|
+
memoize \
|
64
|
+
def result_printer
|
65
|
+
SimpleCov::Formatter::Terminal::ResultPrinter.new(file_determiner)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
SimpleCov::Formatter::Terminal::RSpecIntegration.setup_rspec
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/simple_cov/formatter/terminal/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'simple_cov-formatter-terminal'
|
7
|
+
spec.version = SimpleCov::Formatter::Terminal::VERSION
|
8
|
+
spec.authors = ['David Runger']
|
9
|
+
spec.email = ['davidjrunger@gmail.com']
|
10
|
+
|
11
|
+
spec.summary = 'Print detailed code coverage info to the terminal'
|
12
|
+
spec.description = 'Print detailed code coverage info to the terminal'
|
13
|
+
spec.homepage = 'https://github.com/davidrunger/simplecov-formatter-terminal'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
spec.required_ruby_version = '>= 3.2.0'
|
16
|
+
|
17
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
18
|
+
spec.metadata['source_code_uri'] = 'https://github.com/davidrunger/simplecov-formatter-terminal'
|
19
|
+
spec.metadata['changelog_uri'] =
|
20
|
+
'https://github.com/davidrunger/simplecov-formatter-terminal/blob/master/CHANGELOG.md'
|
21
|
+
|
22
|
+
# Specify which files should be added to the gem when it is released.
|
23
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
24
|
+
spec.files =
|
25
|
+
Dir.chdir(__dir__) do
|
26
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
27
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git))})
|
28
|
+
end
|
29
|
+
end
|
30
|
+
spec.bindir = 'exe'
|
31
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
32
|
+
spec.require_paths = ['lib']
|
33
|
+
|
34
|
+
# Uncomment to register a new dependency of your gem
|
35
|
+
spec.add_dependency('activesupport', '>= 7.0.4', '< 8')
|
36
|
+
spec.add_dependency('memoist', '>= 0.16.2', '< 1')
|
37
|
+
spec.add_dependency('rouge', '>= 4.0.0', '< 5')
|
38
|
+
spec.add_dependency('rspec-core', '>= 3.11.0', '< 4')
|
39
|
+
spec.add_dependency('simplecov', '>= 0.21.2', '< 1')
|
40
|
+
|
41
|
+
# For more information and examples about making a new gem, check out our
|
42
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
43
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
44
|
+
end
|
metadata
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple_cov-formatter-terminal
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- David Runger
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-01-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 7.0.4
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '8'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 7.0.4
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '8'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: memoist
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.16.2
|
40
|
+
- - "<"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '1'
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: 0.16.2
|
50
|
+
- - "<"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '1'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rouge
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - ">="
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: 4.0.0
|
60
|
+
- - "<"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '5'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 4.0.0
|
70
|
+
- - "<"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '5'
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: rspec-core
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 3.11.0
|
80
|
+
- - "<"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '4'
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 3.11.0
|
90
|
+
- - "<"
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '4'
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: simplecov
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: 0.21.2
|
100
|
+
- - "<"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '1'
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.21.2
|
110
|
+
- - "<"
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '1'
|
113
|
+
description: Print detailed code coverage info to the terminal
|
114
|
+
email:
|
115
|
+
- davidjrunger@gmail.com
|
116
|
+
executables: []
|
117
|
+
extensions: []
|
118
|
+
extra_rdoc_files: []
|
119
|
+
files:
|
120
|
+
- ".release_assistant.yml"
|
121
|
+
- ".rspec"
|
122
|
+
- ".rubocop.yml"
|
123
|
+
- CHANGELOG.md
|
124
|
+
- Gemfile
|
125
|
+
- Gemfile.lock
|
126
|
+
- LICENSE.txt
|
127
|
+
- README.md
|
128
|
+
- Rakefile
|
129
|
+
- lib/simple_cov/formatter/terminal.rb
|
130
|
+
- lib/simple_cov/formatter/terminal/branch_coverage.rb
|
131
|
+
- lib/simple_cov/formatter/terminal/color_printing.rb
|
132
|
+
- lib/simple_cov/formatter/terminal/config.rb
|
133
|
+
- lib/simple_cov/formatter/terminal/file_determiner.rb
|
134
|
+
- lib/simple_cov/formatter/terminal/line_printer.rb
|
135
|
+
- lib/simple_cov/formatter/terminal/r_spec_integration.rb
|
136
|
+
- lib/simple_cov/formatter/terminal/rails_awareness.rb
|
137
|
+
- lib/simple_cov/formatter/terminal/result_printer.rb
|
138
|
+
- lib/simple_cov/formatter/terminal/spec_to_app_mapping.rb
|
139
|
+
- lib/simple_cov/formatter/terminal/target_file_writer.rb
|
140
|
+
- lib/simple_cov/formatter/terminal/version.rb
|
141
|
+
- simple_cov-formatter-terminal.gemspec
|
142
|
+
homepage: https://github.com/davidrunger/simplecov-formatter-terminal
|
143
|
+
licenses:
|
144
|
+
- MIT
|
145
|
+
metadata:
|
146
|
+
homepage_uri: https://github.com/davidrunger/simplecov-formatter-terminal
|
147
|
+
source_code_uri: https://github.com/davidrunger/simplecov-formatter-terminal
|
148
|
+
changelog_uri: https://github.com/davidrunger/simplecov-formatter-terminal/blob/master/CHANGELOG.md
|
149
|
+
rubygems_mfa_required: 'true'
|
150
|
+
post_install_message:
|
151
|
+
rdoc_options: []
|
152
|
+
require_paths:
|
153
|
+
- lib
|
154
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: 3.2.0
|
159
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
version: '0'
|
164
|
+
requirements: []
|
165
|
+
rubygems_version: 3.4.2
|
166
|
+
signing_key:
|
167
|
+
specification_version: 4
|
168
|
+
summary: Print detailed code coverage info to the terminal
|
169
|
+
test_files: []
|