simplecov_json_formatter 0.1.0

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b0d112d3b0643b66b0d605539bac724fb29fc39baa66c90d23acecb6ecedab84
4
+ data.tar.gz: 1d057ce0f5bbfe3f772c2f4174498d652994ad33d537d0975b6a3a23c0c8fbad
5
+ SHA512:
6
+ metadata.gz: d6941f2c0e5f625da3f3bff5530ecf9c8f4b8ef4234ff9c13604a2410019b6838753218d8e6745ac2552575658e74e52d855dbba1bef39d75604a80afe9e10e6
7
+ data.tar.gz: e7c14f4dd0ba5fcad9e058fd9c507b8e2ce32303eb91a94908c9d2a3364d48a25a7adb087f0b7b8ea28484f6d4ae708f7a8783bdeb29eaa82884ffe422f08d28
@@ -0,0 +1,28 @@
1
+ # JSON formatter for SimpleCov
2
+
3
+ ***Note: To learn more about SimpleCov, check out the main repo at [https://github.com/simplecov-ruby/simplecov](https://github.com/colszowka/simplecov***)***
4
+
5
+ Generates a formatted JSON report of your [SimpleCov](https://github.com/simplecov-ruby/simplecov) ruby code coverage results on ruby 2.4+. Originally intended to add `simplecov`'s results reading capacity to CI tools.
6
+
7
+ ## Overview
8
+
9
+ You can expect for this gem to produce a `coverage.json` file, located at the `coverage` folder.
10
+
11
+ Depending on your `SimpleCoV`'s settings you will experiment different outcomes. Particularly depending on which type of coverage are you running `SimpleCov` with:
12
+
13
+ - If you configure `SimpleCov` to run with `branch` coverage you should expect an output formatted like [sample_with_branch.json](https://github.com/fede-moya/simplecov_json_formatter/blob/master/spec/fixtures/sample_with_branch.json)
14
+ - Otherwise you should expect an output formatted like [sample.json](https://github.com/fede-moya/simplecov_json_formatter/blob/master/spec/fixtures/sample.json)
15
+
16
+ ## Development
17
+
18
+ We encourage you to use docker for common operations like running tests, or debugging your code. Running `make sh` will run a new container instance based on the `Dockerfile` provided at root, finally a shell prompt will be displayed on your terminal. Also, syncronization with your local files will be already set.
19
+ ### Tests
20
+ `make test` will trigger the excution of both running tests and running rubocop as linter, by simply running `rake`, this actions will be run inside a new container but using your local files.
21
+
22
+ ### Format
23
+
24
+ `make format` will run `rubocop -a` which stands for _autocorrect_ and format your code according to the `.rubocop.yml` config file.
25
+
26
+ ## Copyright
27
+
28
+ See License ?
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'simplecov'
4
+ require 'simplecov_json_formatter/result_hash_formatter'
5
+ require 'simplecov_json_formatter/result_exporter'
6
+ require 'json'
7
+
8
+ module SimpleCov
9
+ module Formatter
10
+ class JSONFormatter
11
+ def format(result)
12
+ result_hash = format_result(result)
13
+
14
+ export_formatted_result(result_hash)
15
+
16
+ puts output_message(result)
17
+ end
18
+
19
+ private
20
+
21
+ def format_result(result)
22
+ result_hash_formater = SimpleCovJSONFormatter::ResultHashFormatter.new(result)
23
+ result_hash_formater.format
24
+ end
25
+
26
+ def export_formatted_result(result_hash)
27
+ result_exporter = SimpleCovJSONFormatter::ResultExporter.new(result_hash)
28
+ result_exporter.export
29
+ end
30
+
31
+ def output_message(result)
32
+ "JSON Coverage report generated for #{result.command_name} to #{SimpleCov.coverage_path}. \
33
+ #{result.covered_lines} / #{result.total_lines} LOC (#{result.covered_percent.round(2)}%) covered."
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SimpleCovJSONFormatter
4
+ class ResultExporter
5
+ FILENAME = 'coverage.json'
6
+
7
+ def initialize(result_hash)
8
+ @result = result_hash
9
+ end
10
+
11
+ def export
12
+ File.open(export_path, 'w') do |file|
13
+ file << json_result
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def json_result
20
+ JSON.pretty_generate(@result)
21
+ end
22
+
23
+ def export_path
24
+ File.join(SimpleCov.coverage_path, FILENAME)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'simplecov_json_formatter/source_file_formatter'
4
+
5
+ module SimpleCovJSONFormatter
6
+ class ResultHashFormatter
7
+ def initialize(result)
8
+ @result = result
9
+ end
10
+
11
+ def format
12
+ @result.files.each do |source_file|
13
+ formatted_result[:coverage][source_file.filename] =
14
+ format_source_file(source_file)
15
+ end
16
+
17
+ formatted_result
18
+ end
19
+
20
+ private
21
+
22
+ def formatted_result
23
+ @formatted_result ||= {
24
+ meta: {
25
+ simplecov_version: SimpleCov::VERSION
26
+ },
27
+ coverage: {}
28
+ }
29
+ end
30
+
31
+ def format_source_file(source_file)
32
+ source_file_formatter = SourceFileFormatter.new(source_file)
33
+ source_file_formatter.format
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SimpleCovJSONFormatter
4
+ class SourceFileFormatter
5
+ def initialize(source_file)
6
+ @source_file = source_file
7
+ end
8
+
9
+ def format
10
+ if SimpleCov.branch_coverage?
11
+ line_coverage.merge(branch_coverage)
12
+ else
13
+ line_coverage
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def line_coverage
20
+ @line_coverage || {
21
+ lines: lines
22
+ }
23
+ end
24
+
25
+ def branch_coverage
26
+ {
27
+ branches: branches
28
+ }
29
+ end
30
+
31
+ def lines
32
+ lines = []
33
+ @source_file.lines.each do |line|
34
+ lines << parse_line(line)
35
+ end
36
+
37
+ lines
38
+ end
39
+
40
+ def branches
41
+ branches = []
42
+ @source_file.branches.each do |branch|
43
+ branches << parse_branch(branch)
44
+ end
45
+
46
+ branches
47
+ end
48
+
49
+ def parse_line(line)
50
+ return line.coverage unless line.skipped?
51
+
52
+ 'ignored'
53
+ end
54
+
55
+ def parse_branch(branch)
56
+ {
57
+ type: branch.type,
58
+ start_line: branch.start_line,
59
+ end_line: branch.end_line,
60
+ coverage: parse_line(branch)
61
+ }
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SimpleCovJSONFormatter
4
+ VERSION = '0.1.0'
5
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simplecov_json_formatter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Federico Moya
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-08-31 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: JSON formatter for SimpleCov
14
+ email:
15
+ - federicomoyamartin@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - README.md
21
+ - lib/simplecov_json_formatter.rb
22
+ - lib/simplecov_json_formatter/result_exporter.rb
23
+ - lib/simplecov_json_formatter/result_hash_formatter.rb
24
+ - lib/simplecov_json_formatter/source_file_formatter.rb
25
+ - lib/simplecov_json_formatter/version.rb
26
+ homepage: https://github.com/fede-moya/simplecov_json_formatter
27
+ licenses:
28
+ - MIT
29
+ metadata: {}
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: 2.4.0
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubygems_version: 3.0.8
46
+ signing_key:
47
+ specification_version: 4
48
+ summary: JSON formatter for SimpleCov
49
+ test_files: []