danger-rubocop 0.12.0 → 0.13.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
  SHA256:
3
- metadata.gz: e62c69c270c52a9db56563f52892f3e3f04ac0f154a70144f20ef66f2a5db517
4
- data.tar.gz: 7db336caf7afd0d8574a66096ee0276b9e92f725d914e57e5720bfe6a83fc27a
3
+ metadata.gz: 228bd1f2c8294e6ade21c5a33424af6ddfa0ceb08613f62ca22db33bdfecd212
4
+ data.tar.gz: cafedd57a18b594548ef05c3287fd96acbf9a5692306e291ad85f7cf3456e6ad
5
5
  SHA512:
6
- metadata.gz: e88de395cb97400f569e38461f45dfd978483bbaf42f048865b4e3f33fefb86632c5ca55f63796cb45a5f5947065200cb6e2bc35fcaa3f42c932c565de7d2cb8
7
- data.tar.gz: c192a3cf0f8b3b199d2e6526c3df8f73c96cffed6cb683f7216dfd00ff9a2c92c83cac77bca63b28eabc215f26bae67c003737977ea112c62d2b73dcb4939c8f
6
+ metadata.gz: e30f4a47b31ce14a58e263da6a7d0cd80a81c016b989be786487393d60f45a131bbabf76f4dbbb08b22058331d1878ff30ddd917cceb3db1e34b5f3cb85fd039
7
+ data.tar.gz: 705e56f918fe479ee9633f513aaa9ce3396616456112be2d4fa2b1f9358b9c58c620f367ba8cedbb6159e5463d2bad2168e3fd1a949ff3477e6696b4fd24acc4
data/Gemfile.lock CHANGED
@@ -108,7 +108,8 @@ GEM
108
108
  ffi (~> 1.0)
109
109
  rchardet (1.8.0)
110
110
  regexp_parser (2.1.1)
111
- rexml (3.2.5)
111
+ rexml (3.2.8)
112
+ strscan (>= 3.0.9)
112
113
  rspec (3.10.0)
113
114
  rspec-core (~> 3.10.0)
114
115
  rspec-expectations (~> 3.10.0)
@@ -139,11 +140,12 @@ GEM
139
140
  addressable (>= 2.3.5)
140
141
  faraday (> 0.8, < 2.0)
141
142
  shellany (0.0.1)
143
+ strscan (3.1.0)
142
144
  terminal-table (3.0.1)
143
145
  unicode-display_width (>= 1.1.1, < 3)
144
146
  thor (1.1.0)
145
147
  unicode-display_width (2.0.0)
146
- yard (0.9.26)
148
+ yard (0.9.36)
147
149
 
148
150
  PLATFORMS
149
151
  ruby
data/README.md CHANGED
@@ -57,6 +57,7 @@ The following keys are supported:
57
57
  (this option will instruct rubocop to ignore the files that your rubocop config ignores,
58
58
  despite the plugin providing the list of files explicitly)
59
59
  * `inline_comment`: pass `true` to comment inline of the diffs.
60
+ * `group_inline_comments`: pass `true` to group inline comments to be a single comment on each line with all issues for that line.
60
61
  * `fail_on_inline_comment`: pass `true` to use `fail` instead of `warn` on inline comment.
61
62
  * `report_severity`: pass `true` to use `fail` or `warn` based on Rubocop severity.
62
63
  * `report_danger`: pass true to report errors to Danger, and break CI.
@@ -66,7 +67,7 @@ The following keys are supported:
66
67
  Note that this won't mark offenses for _Metrics/XXXLength_ if you add lines to an already existing scope.
67
68
  * `include_cop_names`: Prepends cop names to the output messages. Example: "Layout/EmptyLinesAroundBlockBody: Extra empty line detected at block body end."
68
69
  * `rubocop_cmd`: Allows you to change the rubocop executable that's invoked. This is used to support rubocop wrappers like [Standard](https://github.com/testdouble/standard/) by passing `standardrb` as the value.
69
-
70
+ * `skip_bundle_exec`: When there is a `Gemfile` in the project, Rubocop will be executed using [Bundler](https://bundler.io). When `true`, this flag will force Rubocop to run without `bundle exec`.
70
71
 
71
72
  Passing `files` as only argument is also supported for backward compatibility.
72
73
 
data/lib/danger_plugin.rb CHANGED
@@ -34,18 +34,22 @@ module Danger
34
34
  report_danger = config[:report_danger] || false
35
35
  only_report_new_offenses = config[:only_report_new_offenses] || false
36
36
  inline_comment = config[:inline_comment] || false
37
+ group_inline_comments = config[:group_inline_comments] || false
37
38
  fail_on_inline_comment = config[:fail_on_inline_comment] || false
38
39
  report_severity = config[:report_severity] || false
39
40
  include_cop_names = config[:include_cop_names] || false
40
41
  rubocop_cmd = config[:rubocop_cmd] || 'rubocop'
42
+ skip_bundle_exec = config[:skip_bundle_exec] || false
41
43
 
42
44
  files_to_lint = fetch_files_to_lint(files)
43
- files_to_report = rubocop(files_to_lint, force_exclusion, only_report_new_offenses, cmd: rubocop_cmd, config_path: config_path)
45
+ files_to_report = rubocop(files_to_lint, force_exclusion, only_report_new_offenses, cmd: rubocop_cmd, config_path: config_path, skip_bundle_exec: skip_bundle_exec)
44
46
 
45
47
  return if files_to_report.empty?
46
48
  return report_failures(files_to_report, include_cop_names: include_cop_names) if report_danger
47
49
 
48
- if inline_comment
50
+ if inline_comment && group_inline_comments
51
+ add_grouped_violation_for_each_line(files_to_report, fail_on_inline_comment, report_severity, include_cop_names: include_cop_names)
52
+ elsif inline_comment
49
53
  add_violation_for_each_line(files_to_report, fail_on_inline_comment, report_severity, include_cop_names: include_cop_names)
50
54
  else
51
55
  markdown offenses_message(files_to_report, include_cop_names: include_cop_names)
@@ -54,12 +58,12 @@ module Danger
54
58
 
55
59
  private
56
60
 
57
- def rubocop(files_to_lint, force_exclusion, only_report_new_offenses, cmd: 'rubocop', config_path: nil)
61
+ def rubocop(files_to_lint, force_exclusion, only_report_new_offenses, cmd: 'rubocop', config_path: nil, skip_bundle_exec: false)
58
62
  base_command = [cmd, '-f', 'json', '--only-recognized-file-types']
59
63
  base_command.concat(['--force-exclusion']) if force_exclusion
60
64
  base_command.concat(['--config', config_path.shellescape]) unless config_path.nil?
61
65
 
62
- rubocop_output = `#{'bundle exec ' if File.exist?('Gemfile')}#{base_command.join(' ')} #{files_to_lint}`
66
+ rubocop_output = `#{'bundle exec ' if File.exist?('Gemfile') && !skip_bundle_exec}#{base_command.join(' ')} #{files_to_lint}`
63
67
 
64
68
  return [] if rubocop_output.empty?
65
69
 
@@ -144,6 +148,37 @@ module Danger
144
148
  end
145
149
  end
146
150
 
151
+ def add_grouped_violation_for_each_line(offending_files, fail_on_inline_comment, report_severity, include_cop_names: false)
152
+ grouped_offense_messages = Hash.new { |h, k| h[k] = [] }
153
+ offending_files.flat_map do |file|
154
+ file['offenses'].map do |offense|
155
+ offense_message = offense_message(offense, include_cop_names: include_cop_names)
156
+ kargs = {
157
+ file: file['path'],
158
+ line: offense['location']['line']
159
+ }
160
+ grouped_offense_messages[kargs] << offense_message
161
+ end
162
+ end
163
+
164
+ grouped_offense_messages.each do |kargs, offense_messages|
165
+ grouped_offense_message = if offense_messages.length > 1
166
+ "\n" + offense_messages.map do |offense_message|
167
+ "* #{offense_message}"
168
+ end.join("\n")
169
+ else
170
+ offense_messages[0]
171
+ end
172
+ if fail_on_inline_comment
173
+ fail(grouped_offense_message, **kargs)
174
+ elsif report_severity && %w[error fatal].include?(offense['severity'])
175
+ fail(grouped_offense_message, **kargs)
176
+ else
177
+ warn(grouped_offense_message, **kargs)
178
+ end
179
+ end
180
+ end
181
+
147
182
  def fetch_files_to_lint(files = nil)
148
183
  to_lint = if files.nil?
149
184
  # when files are renamed, git.modified_files contains the old name not the new one, so we need to do the convertion
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module DangerRubocop
2
- VERSION = '0.12.0'.freeze
2
+ VERSION = '0.13.0'.freeze
3
3
  end
@@ -323,6 +323,81 @@ EOS
323
323
  .to eq("Violation Syntax/WhetherYouShouldDoThat: Don't do that! { sticky: false, file: spec/fixtures/ruby_file.rb, line: 13, type: error }")
324
324
  end
325
325
  end
326
+
327
+ context 'with group_inline_comments' do
328
+ context 'with multiple violations on the same line' do
329
+ let(:response_ruby_file) do
330
+ {
331
+ 'files' => [
332
+ {
333
+ 'path' => 'spec/fixtures/ruby_file.rb',
334
+ 'offenses' => [
335
+ {
336
+ 'cop_name' => 'Syntax/WhetherYouShouldDoThat',
337
+ 'message' => "Don't do that!",
338
+ 'severity' => 'warning',
339
+ 'location' => { 'line' => 13 }
340
+ },
341
+ {
342
+ 'cop_name' => 'Syntax/WhetherYouShouldDoThat',
343
+ 'message' => "Also don't do that!",
344
+ 'severity' => 'warning',
345
+ 'location' => { 'line' => 13 }
346
+ }
347
+ ]
348
+ }
349
+ ]
350
+ }.to_json
351
+ end
352
+
353
+ it 'reports multiple violations grouped by line in a bulleted list' do
354
+ allow(@rubocop.git).to receive(:modified_files)
355
+ .and_return(['spec/fixtures/ruby_file.rb'])
356
+ allow(@rubocop.git).to receive(:added_files).and_return([])
357
+ allow(@rubocop.git).to receive(:renamed_files).and_return([])
358
+ allow(@rubocop).to receive(:`)
359
+ .with('bundle exec rubocop -f json --only-recognized-file-types spec/fixtures/ruby_file.rb')
360
+ .and_return(response_ruby_file)
361
+
362
+ @rubocop.lint(inline_comment: true, group_inline_comments: true)
363
+
364
+ warning = @rubocop.violation_report[:warnings].first
365
+ expect(warning.file)
366
+ .to eq("spec/fixtures/ruby_file.rb")
367
+ expect(warning.line)
368
+ .to eq(13)
369
+ expect(warning.message)
370
+ .to eq(
371
+ <<~HEREDOC
372
+
373
+ * Don't do that!
374
+ * Also don't do that!
375
+ HEREDOC
376
+ .chomp
377
+ )
378
+ end
379
+ end
380
+
381
+ it 'reports single violations grouped by line as normal line by line warnings' do
382
+ allow(@rubocop.git).to receive(:modified_files)
383
+ .and_return(['spec/fixtures/ruby_file.rb'])
384
+ allow(@rubocop.git).to receive(:added_files).and_return([])
385
+ allow(@rubocop.git).to receive(:renamed_files).and_return([])
386
+ allow(@rubocop).to receive(:`)
387
+ .with('bundle exec rubocop -f json --only-recognized-file-types spec/fixtures/ruby_file.rb')
388
+ .and_return(response_ruby_file)
389
+
390
+ @rubocop.lint(inline_comment: true, group_inline_comments: true)
391
+
392
+ warning = @rubocop.violation_report[:warnings].first
393
+ expect(warning.file)
394
+ .to eq("spec/fixtures/ruby_file.rb")
395
+ expect(warning.line)
396
+ .to eq(13)
397
+ expect(warning.message)
398
+ .to eq("Don't do that!")
399
+ end
400
+ end
326
401
  end
327
402
 
328
403
  context 'with report_severity option' do
@@ -374,6 +449,34 @@ EOS
374
449
  end
375
450
  end
376
451
 
452
+ context 'using Bundler' do
453
+ it 'uses `bundle exec` when there is a Gemfile' do
454
+ allow(@rubocop).to receive(:`)
455
+ .with('bundle exec rubocop -f json --only-recognized-file-types --config path/to/rubocop.yml spec/fixtures/ruby_file.rb')
456
+ .and_return(response_ruby_file)
457
+
458
+ @rubocop.lint(files: 'spec/fixtures/ruby*.rb', config: 'path/to/rubocop.yml')
459
+ end
460
+
461
+ it 'doesn\'t use `bundle exec` when there is no Gemfile' do
462
+ allow(File).to receive(:exist?).with('Gemfile').and_return(false)
463
+
464
+ allow(@rubocop).to receive(:`)
465
+ .with('rubocop -f json --only-recognized-file-types --config path/to/rubocop.yml spec/fixtures/ruby_file.rb')
466
+ .and_return(response_ruby_file)
467
+
468
+ @rubocop.lint(files: 'spec/fixtures/ruby*.rb', config: 'path/to/rubocop.yml')
469
+ end
470
+
471
+ it 'doesn\'t use `bundle exec` when there is a Gemfile but skip_bundle_exec is true' do
472
+ allow(@rubocop).to receive(:`)
473
+ .with('rubocop -f json --only-recognized-file-types --config path/to/rubocop.yml spec/fixtures/ruby_file.rb')
474
+ .and_return(response_ruby_file)
475
+
476
+ @rubocop.lint(files: 'spec/fixtures/ruby*.rb', config: 'path/to/rubocop.yml', skip_bundle_exec: true)
477
+ end
478
+ end
479
+
377
480
  describe 'a filename with special characters' do
378
481
  it 'is shell escaped' do
379
482
  modified_files = [
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger-rubocop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ash Furrow
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-01 00:00:00.000000000 Z
11
+ date: 2024-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger