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 +4 -4
- data/Gemfile.lock +4 -2
- data/README.md +2 -1
- data/lib/danger_plugin.rb +39 -4
- data/lib/version.rb +1 -1
- data/spec/danger_plugin_spec.rb +103 -0
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 228bd1f2c8294e6ade21c5a33424af6ddfa0ceb08613f62ca22db33bdfecd212
         | 
| 4 | 
            +
              data.tar.gz: cafedd57a18b594548ef05c3287fd96acbf9a5692306e291ad85f7cf3456e6ad
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 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. | 
| 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. | 
| 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
    
    
    
        data/spec/danger_plugin_spec.rb
    CHANGED
    
    | @@ -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. | 
| 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:  | 
| 11 | 
            +
            date: 2024-05-20 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: danger
         |