danger-jacoco-instacart 0.1.11 → 0.1.12.SNAPSHOT.1

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: e9fec5fb323f06e8bdffbfdc200b32801b1a74aaf596c374618afca9248326f1
4
- data.tar.gz: 60d06a3074b5aa763632d8bd5661ebc82908cb514346e172b5d383d053d061ae
3
+ metadata.gz: b68f00cbed8e16eb566459431cfb6d296b84b2fec8b87f5e07cb40e513b08b1c
4
+ data.tar.gz: a14e683220953972e2ee3fa84ff6f4fd795c60701c8108d187a24f710b10eced
5
5
  SHA512:
6
- metadata.gz: 2d29d01cf0b2971a5fda3d26e7d82085b42853b852388d1ac84c284bc9856de86628d98d4f44b29e8bb68ccb9628c73a028271153cd8248551bb3e572f1be1ad
7
- data.tar.gz: 02da2696139039613c08b30e576a2b2e512d8ce5770780e6e186af6fefff990c6030388b749d242932143da338c20b61bb12c1230cd13b0b91f6686650c4c2c4
6
+ metadata.gz: 0a8ed5dfd7cf494b6e1ceb45f87d06d8666e6f92ec1e31b73a75bdf00a2cc209c67854d3d0eee1eb367b4311ac280a22115fb075d904538f611ccb44ac94d5e7
7
+ data.tar.gz: 6c2cc47baf7fea31de40f60b531a442a5daad3460b2ecf6360dc6e1860077a4888fff6e9e071c0d4775c87224533e66edf1483586418220953762ed76621399a
data/.yardoc/checksums CHANGED
@@ -1,6 +1,6 @@
1
1
  /Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/danger_jacoco.rb 38229d934b3315bb2a5a4eec18eb65f3c54d304f
2
- /Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/gem_version.rb ed9d8db86045983fb4286a8695d1d67276512c90
3
- /Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/plugin.rb 4d411eb29a16b42105f2775fd15d9ca0dc8e3093
2
+ /Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/gem_version.rb 4109fe221b49a7d872a2d1bebf772583ed7c4437
3
+ /Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/plugin.rb 17233d007f6187a47676390d6499ab5c7cb3a2b8
4
4
  /Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/sax_parser.rb 370e2799f8dbdf7d642c820214e6ea84c30c9cb0
5
5
  /Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/model/counter.rb 368f4a9811617b7a174ddf837a8fac49a4bc32a6
6
6
  /Users/alexanderbezverhni/workspace/junk/danger-jacoco/lib/jacoco/model/report.rb 7cf45ee71ff347a130320f6190ddb25525c7095d
data/.yardoc/object_types CHANGED
Binary file
Binary file
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Jacoco
4
- VERSION = '0.1.11'
4
+ VERSION = '0.1.12.SNAPSHOT.1'
5
5
  end
data/lib/jacoco/plugin.rb CHANGED
@@ -20,9 +20,10 @@ module Danger
20
20
  # @tags jacoco, coverage, java, android, kotlin
21
21
  #
22
22
  class DangerJacoco < Plugin # rubocop:disable Metrics/ClassLength
23
- attr_accessor :minimum_project_coverage_percentage, :minimum_class_coverage_percentage, :only_check_new_files,
24
- :files_extension, :minimum_package_coverage_map, :minimum_class_coverage_map,
25
- :fail_no_coverage_data_found, :title, :class_column_title, :subtitle_success, :subtitle_failure
23
+ attr_accessor :minimum_project_coverage_percentage, :minimum_class_coverage_percentage,
24
+ :minimum_composable_class_coverage_percentage, :only_check_new_files, :files_extension,
25
+ :minimum_package_coverage_map, :minimum_class_coverage_map, :fail_no_coverage_data_found,
26
+ :title, :class_column_title, :subtitle_success, :subtitle_failure
26
27
 
27
28
  # Initialize the plugin with configured parameters or defaults
28
29
  def setup
@@ -44,6 +45,7 @@ module Danger
44
45
  def setup_minimum_coverages
45
46
  @minimum_project_coverage_percentage = 0 unless minimum_project_coverage_percentage
46
47
  @minimum_class_coverage_percentage = 0 unless minimum_class_coverage_percentage
48
+ @minimum_composable_class_coverage_percentage = 0 unless minimum_composable_class_coverage_percentage
47
49
  @minimum_package_coverage_map = {} unless minimum_package_coverage_map
48
50
  @minimum_class_coverage_map = {} unless minimum_class_coverage_map
49
51
  end
@@ -79,9 +81,10 @@ module Danger
79
81
  @fail_no_coverage_data_found = fail_no_coverage_data_found
80
82
 
81
83
  setup
82
- classes = classes(delimiter)
84
+ class_to_file_path_hash = classes(delimiter)
85
+ classnames = class_to_file_path_hash.keys
83
86
 
84
- parser = Jacoco::SAXParser.new(classes)
87
+ parser = Jacoco::SAXParser.new(classnames)
85
88
  Nokogiri::XML::SAX::Parser.new(parser).parse(File.open(path))
86
89
 
87
90
  total_covered = total_coverage(path)
@@ -90,7 +93,7 @@ module Danger
90
93
  report_markdown = header
91
94
  report_markdown += "| #{class_column_title} | Covered | Required | Status |\n"
92
95
  report_markdown += "|:---|:---:|:---:|:---:|\n"
93
- class_coverage_above_minimum = markdown_class(parser, report_markdown, report_url)
96
+ class_coverage_above_minimum = markdown_class(parser, report_markdown, report_url, class_to_file_path_hash)
94
97
  subtitle = class_coverage_above_minimum ? subtitle_success : subtitle_failure
95
98
  report_markdown.insert(header.length, "#### #{subtitle}\n")
96
99
  markdown(report_markdown)
@@ -104,12 +107,17 @@ module Danger
104
107
  def classes(delimiter)
105
108
  git = @dangerfile.git
106
109
  affected_files = only_check_new_files ? git.added_files : git.added_files + git.modified_files
110
+ class_to_file_path_hash = {}
107
111
  affected_files.select { |file| files_extension.reduce(false) { |state, el| state || file.end_with?(el) } }
108
- .map { |file| file.split('.').first.split(delimiter)[1] }
112
+ .each do |file| # "src/java/com/example/CachedRepository.java"
113
+ classname = file.split('.').first.split(delimiter)[1] # "com/example/CachedRepository"
114
+ class_to_file_path_hash[classname] = file
115
+ end
116
+ class_to_file_path_hash
109
117
  end
110
118
 
111
119
  # It returns a specific class code coverage and an emoji status as well
112
- def report_class(jacoco_class)
120
+ def report_class(jacoco_class, file_path)
113
121
  report_result = {
114
122
  covered: 'No coverage data found : -',
115
123
  status: ':black_joker:',
@@ -119,7 +127,7 @@ module Danger
119
127
  counter = coverage_counter(jacoco_class)
120
128
  unless counter.nil?
121
129
  coverage = (counter.covered.fdiv(counter.covered + counter.missed) * 100).floor
122
- required_coverage = required_class_coverage(jacoco_class)
130
+ required_coverage = required_class_coverage(jacoco_class, file_path)
123
131
  status = coverage_status(coverage, required_coverage)
124
132
 
125
133
  report_result = {
@@ -133,13 +141,19 @@ module Danger
133
141
  end
134
142
 
135
143
  # Determines the required coverage for the class
136
- def required_class_coverage(jacoco_class)
144
+ # rubocop:disable Metrics/AbcSize
145
+ # rubocop:disable Metrics/CyclomaticComplexity
146
+ def required_class_coverage(jacoco_class, file_path)
137
147
  key = minimum_class_coverage_map.keys.detect { |k| jacoco_class.name.match(k) } || jacoco_class.name
138
148
  required_coverage = minimum_class_coverage_map[key]
149
+ includes_composables = File.read(file_path).include? '@Composable' if File.exist?(file_path)
150
+ required_coverage = minimum_composable_class_coverage_percentage if required_coverage.nil? && includes_composables
139
151
  required_coverage = package_coverage(jacoco_class.name) if required_coverage.nil?
140
152
  required_coverage = minimum_class_coverage_percentage if required_coverage.nil?
141
153
  required_coverage
142
154
  end
155
+ # rubocop:enable Metrics/AbcSize
156
+ # rubocop:enable Metrics/CyclomaticComplexity
143
157
 
144
158
  # it returns the most suitable coverage by package name to class or nil
145
159
  def package_coverage(class_name)
@@ -213,22 +227,34 @@ module Danger
213
227
 
214
228
  # rubocop:disable Style/SignalException
215
229
  def report_fails(class_coverage_above_minimum, total_covered)
230
+ total_failure_message = ''
216
231
  if total_covered[:covered] < minimum_project_coverage_percentage
217
232
  # fail danger if total coverage is smaller than minimum_project_coverage_percentage
218
233
  covered = total_covered[:covered]
219
- fail("Total coverage of #{covered}%. Improve this to at least #{minimum_project_coverage_percentage}%")
234
+ total_failure_message = "Total coverage of #{covered}%." \
235
+ " Improve this to at least #{minimum_project_coverage_percentage}%"
236
+ fail(total_failure_message)
237
+ # rubocop:disable Lint/UnreachableCode (rubocop mistakenly thinks that raise is unreachable since priorly called "fail" raises by itself, but in fact "fail" is caught and handled)
238
+ raise CoverageRequirementsNotMetError, total_failure_message if class_coverage_above_minimum
239
+ # rubocop:enable Lint/UnreachableCode
220
240
  end
221
241
 
222
242
  return if class_coverage_above_minimum
223
243
 
224
- fail("Class coverage is below minimum. Improve to at least #{minimum_class_coverage_percentage}%")
244
+ class_failure_message = 'Class coverage is below minimum.' \
245
+ " Improve to at least #{minimum_class_coverage_percentage}%"
246
+ fail(class_failure_message)
247
+ # rubocop:disable Lint/UnreachableCode (rubocop mistakenly thinks that raise is unreachable since priorly called "fail" raises by itself, but in fact "fail" is caught and handled)
248
+ raise CoverageRequirementsNotMetError, "#{total_failure_message}. #{class_failure_message}"
249
+ # rubocop:enable Lint/UnreachableCode
225
250
  end
226
251
  # rubocop:enable Style/SignalException
227
252
 
228
- def markdown_class(parser, report_markdown, report_url)
253
+ def markdown_class(parser, report_markdown, report_url, class_to_file_path_hash)
229
254
  class_coverage_above_minimum = true
230
255
  parser.classes.each do |jacoco_class| # Check metrics for each classes
231
- rp = report_class(jacoco_class)
256
+ file_path = class_to_file_path_hash[jacoco_class.name]
257
+ rp = report_class(jacoco_class, file_path)
232
258
  rl = report_link(jacoco_class.name, report_url)
233
259
  ln = "| #{rl} | #{rp[:covered]}% | #{rp[:required_coverage_percentage]}% | #{rp[:status]} |\n"
234
260
  report_markdown << ln
@@ -249,3 +275,10 @@ module Danger
249
275
  end
250
276
  end
251
277
  end
278
+
279
+ # Exception that is being thrown when any of the coverage requirements aren't met
280
+ class CoverageRequirementsNotMetError < StandardError
281
+ def initialize(msg = 'Coverage requirements not met')
282
+ super
283
+ end
284
+ end
data/spec/jacoco_spec.rb CHANGED
@@ -33,7 +33,7 @@ module Danger
33
33
  @my_plugin.minimum_project_coverage_percentage = 50
34
34
  @my_plugin.minimum_class_coverage_map = { 'com/example/CachedRepository' => 100 }
35
35
 
36
- @my_plugin.report path_a
36
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Total coverage of 32.9%. Improve this to at least 50%. Class coverage is below minimum. Improve to at least 0%/)
37
37
 
38
38
  expect(@dangerfile.status_report[:errors]).to eq(['Total coverage of 32.9%. Improve this to at least 50%',
39
39
  'Class coverage is below minimum. Improve to at least 0%'])
@@ -49,8 +49,7 @@ module Danger
49
49
  @my_plugin.minimum_project_coverage_percentage = 50
50
50
  @my_plugin.minimum_class_coverage_map = { '.*Repository' => 60 }
51
51
 
52
- @my_plugin.report path_a
53
-
52
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Total coverage of 32.9%. Improve this to at least 50%. Class coverage is below minimum. Improve to at least 0%/)
54
53
  expect(@dangerfile.status_report[:markdowns][0].message).to include('| `com/example/CachedRepository` | 50% | 60% | :warning: |')
55
54
  end
56
55
 
@@ -60,8 +59,7 @@ module Danger
60
59
  @my_plugin.minimum_project_coverage_percentage = 50
61
60
  @my_plugin.minimum_package_coverage_map = { 'com/example/' => 70 }
62
61
 
63
- @my_plugin.report path_a
64
-
62
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Total coverage of 32.9%. Improve this to at least 50%/)
65
63
  expect(@dangerfile.status_report[:markdowns][0].message).to include('| `com/example/CachedRepository` | 50% | 70% | :warning: |')
66
64
  end
67
65
 
@@ -74,8 +72,7 @@ module Danger
74
72
  'com/' => 90
75
73
  }
76
74
 
77
- @my_plugin.report path_a
78
-
75
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Total coverage of 32.9%. Improve this to at least 50%/)
79
76
  expect(@dangerfile.status_report[:markdowns][0].message).to include('| `com/example/CachedRepository` | 50% | 70% | :warning: |')
80
77
  end
81
78
 
@@ -88,8 +85,7 @@ module Danger
88
85
  'com/' => 30
89
86
  }
90
87
 
91
- @my_plugin.report path_a
92
-
88
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Total coverage of 32.9%. Improve this to at least 50%/)
93
89
  expect(@dangerfile.status_report[:markdowns][0].message).to include('| `com/example/CachedRepository` | 50% | 77% | :warning: |')
94
90
  end
95
91
 
@@ -103,8 +99,7 @@ module Danger
103
99
  }
104
100
  @my_plugin.minimum_class_coverage_map = { 'com/example/CachedRepository' => 100 }
105
101
 
106
- @my_plugin.report path_a
107
-
102
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Total coverage of 32.9%. Improve this to at least 50%/)
108
103
  expect(@dangerfile.status_report[:markdowns][0].message).to include('| `com/example/CachedRepository` | 50% | 100% | :warning: |')
109
104
  end
110
105
 
@@ -118,8 +113,7 @@ module Danger
118
113
  }
119
114
  @my_plugin.minimum_class_coverage_map = { 'com/example/CachedRepository' => 80 }
120
115
 
121
- @my_plugin.report path_a
122
-
116
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Total coverage of 32.9%. Improve this to at least 50%/)
123
117
  expect(@dangerfile.status_report[:markdowns][0].message).to include('| `com/example/CachedRepository` | 50% | 80% | :warning: |')
124
118
  end
125
119
 
@@ -156,7 +150,7 @@ module Danger
156
150
  @my_plugin.minimum_class_coverage_percentage = 70
157
151
  @my_plugin.only_check_new_files = true
158
152
 
159
- @my_plugin.report path_a
153
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Class coverage is below minimum. Improve to at least 70%/)
160
154
 
161
155
  expect(@dangerfile.status_report[:markdowns][0].message).to include('### JaCoCo Code Coverage 55.59% :white_check_mark:')
162
156
  expect(@dangerfile.status_report[:markdowns][0].message).to include('| Class | Covered | Required | Status |')
@@ -171,8 +165,7 @@ module Danger
171
165
  @my_plugin.minimum_class_coverage_percentage = 80
172
166
  @my_plugin.minimum_project_coverage_percentage = 50
173
167
 
174
- @my_plugin.report(path_a, 'http://test.com/')
175
-
168
+ expect { @my_plugin.report(path_a, 'http://test.com/') }.to raise_error(CoverageRequirementsNotMetError, /Total coverage of 32.9%. Improve this to at least 50%. Class coverage is below minimum. Improve to at least 80%/)
176
169
  expect(@dangerfile.status_report[:markdowns][0].message).to include('| [`com/example/CachedRepository`](http://test.com/com.example/CachedRepository.html) | 50% | 80% | :warning: |')
177
170
  end
178
171
 
@@ -234,7 +227,7 @@ module Danger
234
227
  @my_plugin.minimum_project_coverage_percentage = 30
235
228
  @my_plugin.minimum_class_coverage_percentage = 60
236
229
 
237
- @my_plugin.report path_a
230
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Class coverage is below minimum. Improve to at least 60%/)
238
231
 
239
232
  expected = "### JaCoCo Code Coverage 32.9% :white_check_mark:\n"
240
233
  expected += "#### There are classes that do not meet coverage requirement :warning:\n"
@@ -268,7 +261,7 @@ module Danger
268
261
  @my_plugin.minimum_class_coverage_percentage = 60
269
262
  @my_plugin.subtitle_failure = 'Too bad :('
270
263
 
271
- @my_plugin.report path_a
264
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Class coverage is below minimum. Improve to at least 60%/)
272
265
 
273
266
  expected = "### JaCoCo Code Coverage 32.9% :white_check_mark:\n"
274
267
  expected += "#### Too bad :(\n"
@@ -311,7 +304,7 @@ module Danger
311
304
 
312
305
  @my_plugin.minimum_class_coverage_percentage = 50
313
306
 
314
- @my_plugin.report path_a
307
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Class coverage is below minimum. Improve to at least 50%/)
315
308
 
316
309
  expect(@dangerfile.status_report[:markdowns][0].message).to include('| `com/example/CachedRepository` | 42% | 50% | :warning: |')
317
310
  end
@@ -325,6 +318,42 @@ module Danger
325
318
 
326
319
  expect(@dangerfile.status_report[:markdowns][0].message).to include('| `com/example/CachedRepository` | 93% | 50% | :white_check_mark: |')
327
320
  end
321
+
322
+ describe 'with CachedRepository containing @Composable annotation' do
323
+ before do
324
+ allow(File).to receive(:exist?).with('src/java/com/example/CachedRepository.java').and_return(true)
325
+ allow(File).to receive(:read).with('src/java/com/example/CachedRepository.java').and_return('package com.kevin.mia.mikaela class Vika { @Composable fun someUiWidget() {} }')
326
+ end
327
+
328
+ it 'applies minimum_composable_class_coverage_percentage' do
329
+ path_a = "#{File.dirname(__FILE__)}/fixtures/output_a.xml"
330
+
331
+ @my_plugin.minimum_class_coverage_percentage = 55
332
+ @my_plugin.minimum_composable_class_coverage_percentage = 45
333
+
334
+ @my_plugin.report path_a
335
+
336
+ expect(@dangerfile.status_report[:markdowns][0].message).to include('| `com/example/CachedRepository` | 50% | 45% | :white_check_mark: |')
337
+ end
338
+ end
339
+
340
+ describe 'with CachedRepository _not_ containing @Composable annotation' do
341
+ before do
342
+ allow(File).to receive(:exist?).with('src/java/com/example/CachedRepository.java').and_return(true)
343
+ allow(File).to receive(:read).with('src/java/com/example/CachedRepository.java').and_return('package com.kevin.mia.mikaela class Vika { fun main() {} }')
344
+ end
345
+
346
+ it 'does not apply minimum_composable_class_coverage_percentage' do
347
+ path_a = "#{File.dirname(__FILE__)}/fixtures/output_a.xml"
348
+
349
+ @my_plugin.minimum_class_coverage_percentage = 55
350
+ @my_plugin.minimum_composable_class_coverage_percentage = 45
351
+
352
+ expect { @my_plugin.report(path_a) }.to raise_error(CoverageRequirementsNotMetError, /Class coverage is below minimum. Improve to at least 55%/)
353
+
354
+ expect(@dangerfile.status_report[:markdowns][0].message).to include('| `com/example/CachedRepository` | 50% | 55% | :warning: |')
355
+ end
356
+ end
328
357
  end
329
358
  end
330
359
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger-jacoco-instacart
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12.SNAPSHOT.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Malinskiy
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-08-25 00:00:00.000000000 Z
12
+ date: 2022-09-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: danger-plugin-api
@@ -228,9 +228,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
228
228
  version: '2.6'
229
229
  required_rubygems_version: !ruby/object:Gem::Requirement
230
230
  requirements:
231
- - - ">="
231
+ - - ">"
232
232
  - !ruby/object:Gem::Version
233
- version: '0'
233
+ version: 1.3.1
234
234
  requirements: []
235
235
  rubygems_version: 3.1.2
236
236
  signing_key: