danger-jacoco 0.0.3 → 0.1.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
  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.