danger-jacoco 0.0.3 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d58e57b0d3fd8972b9be76af2a879df6357979d5
4
- data.tar.gz: 4611c4a672001b5f02bb132a8754f4f6970e210e
3
+ metadata.gz: e8caafe32ed85b587ff05493d8787e293aaad3eb
4
+ data.tar.gz: fded83a5dbdae6209dd1986b761b9c861d6ccd01
5
5
  SHA512:
6
- metadata.gz: 2bbe99c68f372abc2d609b31fb120d86403f5363d6699586b5d362562d1465982c131b3796571c0bae1e5fd16a531b363f0e6e36408fd5be29030b5a8caa96ba
7
- data.tar.gz: 53d1670e45d8e653d99bf4987104d2b0b358d84ed2fe52d798555d909a1505d62c7f37c5e32672a8121cf1eb952201b8ea129aa2d8e0aec46c44363bd70d2373
6
+ metadata.gz: 7b91364232e571798fe45bf8b0911bd09fca607b3e6e1ca04a384052bdedd4b206251694cac69d376c9240633b72a5af119b31271be8411f1fa35199b83cdf42
7
+ data.tar.gz: 144d396fad44caa4ddc756139861a14bda5b3ee2f336772abaf7ff55a960bea795fe06fdf00abbaf3157d744e9f3b9a94bd96f99a272ef105f4482eceeb52323
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
1
  .DS_Store
2
2
  pkg
3
3
  .idea/
4
+ Gemfile.lock
@@ -0,0 +1,6 @@
1
+ Metrics/LineLength:
2
+ Max: 120
3
+ Metrics/MethodLength:
4
+ Max: 20
5
+ Metrics/AbcSize:
6
+ Max: 20
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- danger-jacoco (0.0.3)
4
+ danger-jacoco (0.1.0)
5
5
  danger-plugin-api (~> 1.0)
6
6
  nokogiri-happymapper (~> 0.6)
7
7
 
@@ -20,7 +20,7 @@ GEM
20
20
  colored2 (3.1.2)
21
21
  cork (0.3.0)
22
22
  colored2 (~> 3.1)
23
- danger (5.5.5)
23
+ danger (5.5.10)
24
24
  claide (~> 1.0)
25
25
  claide-plugins (>= 0.9.2)
26
26
  colored2 (~> 3.1)
@@ -35,7 +35,7 @@ GEM
35
35
  danger-plugin-api (1.0.0)
36
36
  danger (> 2.0)
37
37
  diff-lcs (1.3)
38
- faraday (0.13.1)
38
+ faraday (0.14.0)
39
39
  multipart-post (>= 1.2, < 3)
40
40
  faraday-http-cache (1.3.1)
41
41
  faraday (~> 0.8)
@@ -68,14 +68,14 @@ GEM
68
68
  nap (1.1.0)
69
69
  nenv (0.3.0)
70
70
  no_proxy_fix (0.1.2)
71
- nokogiri (1.8.1)
71
+ nokogiri (1.8.2)
72
72
  mini_portile2 (~> 2.3.0)
73
73
  nokogiri-happymapper (0.6.0)
74
74
  nokogiri (~> 1.5)
75
75
  notiffany (0.1.1)
76
76
  nenv (~> 0.1)
77
77
  shellany (~> 0.0)
78
- octokit (4.7.0)
78
+ octokit (4.8.0)
79
79
  sawyer (~> 0.8.0, >= 0.5.3)
80
80
  open4 (1.3.4)
81
81
  parallel (1.12.0)
@@ -85,7 +85,7 @@ GEM
85
85
  pry (0.11.3)
86
86
  coderay (~> 1.1.0)
87
87
  method_source (~> 0.9.0)
88
- public_suffix (3.0.1)
88
+ public_suffix (3.0.2)
89
89
  rainbow (2.2.2)
90
90
  rake
91
91
  rake (12.3.0)
@@ -140,4 +140,4 @@ DEPENDENCIES
140
140
  yard (~> 0.9)
141
141
 
142
142
  BUNDLED WITH
143
- 1.16.0
143
+ 1.16.1
data/README.md CHANGED
@@ -14,7 +14,9 @@ sudo gem install danger-jacoco
14
14
  Add
15
15
 
16
16
  ```ruby
17
- jacoco.minimum_coverage_percentage=80
17
+ jacoco.minimum_project_coverage_percentage = 50 # default 0
18
+ jacoco.minimum_class_coverage_percentage = 75 # default 0
19
+ jacoco.files_extension = [".java"] # default [".kt", ".java"]
18
20
  jacoco.report "path/to/jacoco.xml"
19
21
  ```
20
22
 
@@ -1,3 +1,3 @@
1
1
  module Jacoco
2
- VERSION = '0.0.3'.freeze
2
+ VERSION = '0.1.0'.freeze
3
3
  end
@@ -3,10 +3,18 @@ require 'jacoco/sax_parser'
3
3
  module Danger
4
4
  #
5
5
  # @see Anton Malinskiy/danger-jacoco
6
- # @tags jacoco, coverage, java, android
6
+ # @tags jacoco, coverage, java, android, kotlin
7
7
  #
8
8
  class DangerJacoco < Plugin
9
- attr_accessor :minimum_coverage_percentage
9
+ attr_accessor :minimum_project_coverage_percentage
10
+ attr_accessor :minimum_class_coverage_percentage
11
+ attr_accessor :files_extension
12
+
13
+ def setup
14
+ @minimum_project_coverage_percentage = 0 unless minimum_project_coverage_percentage
15
+ @minimum_class_coverage_percentage = 0 unless minimum_class_coverage_percentage
16
+ @files_extension = ['.kt', '.java'] unless files_extension
17
+ end
10
18
 
11
19
  # Parses the xml output of jacoco to Ruby model classes
12
20
  # This is slow since it's basically DOM parsing
@@ -21,57 +29,96 @@ module Danger
21
29
  #
22
30
  # @path path to the xml output of jacoco
23
31
  # @delimiter git.modified_files returns full paths to the
24
- # changed files. We need to get the java class from this path to check the
32
+ # changed files. We need to get the class from this path to check the
25
33
  # Jacoco report,
26
34
  #
27
- # e.g. src/java/com/example/SomeClass.java -> com/example/SomeClass
35
+ # e.g. src/java/com/example/SomeJavaClass.java -> com/example/SomeJavaClass
36
+ # e.g. src/kotlin/com/example/SomeKotlinClass.kt -> com/example/SomeKotlinClass
28
37
  #
29
38
  # The default value supposes that you're using gradle structure,
30
- # that is your path to java source files is something like
39
+ # that is your path to source files is something like
31
40
  #
32
- # blah/blah/java/slashed_package/Source.java
41
+ # Java => blah/blah/java/slashed_package/Source.java
42
+ # Kotlin => blah/blah/kotlin/slashed_package/Source.kt
33
43
  #
34
- def report(path, delimiter = '/java/')
44
+ def report(path, delimiter = %r{\/java\/|\/kotlin\/})
45
+ setup
35
46
  classes = classes(delimiter)
36
47
 
37
48
  parser = Jacoco::SAXParser.new(classes)
38
49
  Nokogiri::XML::SAX::Parser.new(parser).parse(File.open(path))
39
50
 
40
- parser.classes.each do |jacoco_class|
41
- # Check which metrics are available
42
- report_class(jacoco_class)
43
- end
51
+ total_covered = total_coverage(path)
52
+
53
+ report_markdown = "### JaCoCO Code Coverage #{total_covered[:covered]}% #{total_covered[:status]}\n"
54
+ report_markdown << "| Class | Covered | Meta | Status |\n"
55
+ report_markdown << "|:---:|:---:|:---:|:---:|\n"
56
+ markdown_class(parser, report_markdown)
57
+ markdown(report_markdown)
58
+
59
+ return if total_covered[:covered] >= minimum_project_coverage_percentage
60
+
61
+ # fail danger if total coveraged is smaller than minimum_project_coverage_percentage
62
+ covered = total_covered[:covered]
63
+ raise("Total coverage of #{covered}%. Improve this to as least #{minimum_project_coverage_percentage} %")
44
64
  end
45
65
 
66
+ # Select modified and added files in this PR
46
67
  def classes(delimiter)
47
68
  git = @dangerfile.git
48
69
  affected_files = git.modified_files + git.added_files
49
- affected_files.select { |file| file.end_with? '.java' }
50
- .map { |file| extract_class(file, delimiter) }
70
+ affected_files.select { |file| files_extension.reduce(false) { |state, el| state || file.end_with?(el) } }
71
+ .map { |file| file.split('.').first.split(delimiter)[1] }
51
72
  end
52
73
 
74
+ # It returns a specific class code coverage and an emoji status as well
53
75
  def report_class(jacoco_class)
54
76
  counters = jacoco_class.counters
55
77
  branch_counter = counters.detect { |e| e.type.eql? 'BRANCH' }
56
78
  line_counter = counters.detect { |e| e.type.eql? 'LINE' }
57
79
  counter = branch_counter.nil? ? line_counter : branch_counter
80
+ coverage = (counter.covered.fdiv(counter.covered + counter.missed) * 100).floor
81
+ status = coverage_status(coverage, minimum_class_coverage_percentage)
58
82
 
59
- report_counter(counter, jacoco_class)
83
+ {
84
+ covered: coverage,
85
+ status: status
86
+ }
60
87
  end
61
88
 
62
- def report_counter(counter, jacoco_class)
63
- covered = counter.covered
64
- missed = counter.missed
65
- coverage = (covered.fdiv(covered + missed) * 100).floor
89
+ # it returns an emoji for coverage status
90
+ def coverage_status(coverage, minimum_percentage)
91
+ if coverage < (minimum_percentage / 2) then ':skull:'
92
+ elsif coverage < minimum_percentage then ':warning:'
93
+ else ':white_check_mark:'
94
+ end
95
+ end
96
+
97
+ # It returns total of project code coverage and an emoji status as well
98
+ def total_coverage(report_path)
99
+ jacoco_report = Nokogiri::XML(File.open(report_path))
66
100
 
67
- return unless coverage < minimum_coverage_percentage
101
+ report = jacoco_report.xpath('report/counter').select { |item| item['type'] == 'INSTRUCTION' }
102
+ missed_instructions = report.first['missed'].to_f
103
+ covered_instructions = report.first['covered'].to_f
104
+ total_instructions = missed_instructions + covered_instructions
105
+ covered_percentage = (covered_instructions * 100 / total_instructions).round(2)
106
+ coverage_status = coverage_status(covered_percentage, minimum_project_coverage_percentage)
68
107
 
69
- fail("#{jacoco_class.name} has coverage of #{coverage}%. " \
70
- "Improve this to at least #{minimum_coverage_percentage}%")
108
+ {
109
+ covered: covered_percentage,
110
+ status: coverage_status
111
+ }
71
112
  end
72
113
 
73
- def extract_class(file, java_path_delimiter)
74
- file[0, file.length - 5].split(java_path_delimiter)[1]
114
+ private
115
+
116
+ def markdown_class(parser, report_markdown)
117
+ parser.classes.each do |jacoco_class| # Check metrics for each classes
118
+ rp = report_class(jacoco_class)
119
+ ln = "| `#{jacoco_class.name}` | #{rp[:covered]}% | #{minimum_class_coverage_percentage}% | #{rp[:status]} |\n"
120
+ report_markdown << ln
121
+ end
75
122
  end
76
123
  end
77
124
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger-jacoco
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Malinskiy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-05 00:00:00.000000000 Z
11
+ date: 2018-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-plugin-api
@@ -172,6 +172,7 @@ extensions: []
172
172
  extra_rdoc_files: []
173
173
  files:
174
174
  - ".gitignore"
175
+ - ".rubocop.yml"
175
176
  - ".travis.yml"
176
177
  - Gemfile
177
178
  - Gemfile.lock
@@ -218,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
218
219
  version: '0'
219
220
  requirements: []
220
221
  rubyforge_project:
221
- rubygems_version: 2.6.12
222
+ rubygems_version: 2.6.13
222
223
  signing_key:
223
224
  specification_version: 4
224
225
  summary: A longer description of danger-jacoco.