From 1400d781eab38fa244f07cb0deceb97651c27d69 Mon Sep 17 00:00:00 2001 From: Max Jacobson Date: Fri, 28 Jan 2022 19:57:53 -0500 Subject: [PATCH 1/2] Update auto-gen-config's comment re auto-correct The auto-gen-config output will say "Cop supports --auto-correct" for cops which do not support --auto-correct, but which do support --auto-correct-all. Let's update the output to reflect that. When someone is working on the todo list, this can be helpful information to have at hand. I'll often run something like: `bin/rubocop --only Style/StringConcatenation -a` and then realize actually that won't work, and this would save me a few seconds. --- .../formatter/disabled_config_formatter.rb | 10 ++++-- spec/rubocop/cli/auto_gen_config_spec.rb | 35 +++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/lib/rubocop/formatter/disabled_config_formatter.rb b/lib/rubocop/formatter/disabled_config_formatter.rb index 105a204909a..faf696a9266 100644 --- a/lib/rubocop/formatter/disabled_config_formatter.rb +++ b/lib/rubocop/formatter/disabled_config_formatter.rb @@ -121,9 +121,15 @@ def output_cop_comments(output_buffer, cfg, cop_name, offense_count) output_buffer.puts "# Offense count: #{offense_count}" if show_offense_counts? cop_class = Cop::Registry.global.find_by_cop_name(cop_name) - output_buffer.puts '# Cop supports --auto-correct.' if cop_class&.support_autocorrect? - default_cfg = default_config(cop_name) + if cop_class&.support_autocorrect? + if default_cfg.nil? || default_cfg['Safe'] || default_cfg['Safe'].nil? + output_buffer.puts '# Cop supports --auto-correct.' + else + output_buffer.puts '# Cop supports --auto-correct-all.' + end + end + return unless default_cfg params = cop_config_params(default_cfg, cfg) diff --git a/spec/rubocop/cli/auto_gen_config_spec.rb b/spec/rubocop/cli/auto_gen_config_spec.rb index 77d711463e6..c3424e6b962 100644 --- a/spec/rubocop/cli/auto_gen_config_spec.rb +++ b/spec/rubocop/cli/auto_gen_config_spec.rb @@ -472,6 +472,41 @@ def fooBar; end end end + context 'when cop is not safe to auto-correct' do + it 'can generate a todo list, with the appropriate flag' do + create_file('example1.rb', <<~RUBY) + # frozen_string_literal: true + + users = (user.name + ' ' + user.email) * 5 + puts users + RUBY + create_file('.rubocop.yml', <<~YAML) + # The following cop supports auto-correction but is not safe + Style/StringConcatenation: + Enabled: true + YAML + expect(cli.run(%w[--auto-gen-config])).to eq(0) + expect($stderr.string).to eq('') + expect(Dir['.*']).to include('.rubocop_todo.yml') + todo_contents = File.read('.rubocop_todo.yml').lines[8..-1].join + expect(todo_contents).to eq(<<~YAML) + # Offense count: 1 + # Cop supports --auto-correct-all. + # Configuration parameters: Mode. + Style/StringConcatenation: + Exclude: + - 'example1.rb' + YAML + expect(File.read('.rubocop.yml')).to eq(<<~YAML) + inherit_from: .rubocop_todo.yml + + # The following cop supports auto-correction but is not safe + Style/StringConcatenation: + Enabled: true + YAML + end + end + context 'when existing config file has a YAML document start header' do it 'inserts `inherit_from` key after hearder' do create_file('example1.rb', <<~RUBY) From 9fbd316d0a8e2ca41afaf4fc08c300ae5aa9cbeb Mon Sep 17 00:00:00 2001 From: Max Jacobson Date: Fri, 28 Jan 2022 20:20:01 -0500 Subject: [PATCH 2/2] Address complexity rubocop issues --- .../formatter/disabled_config_formatter.rb | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/rubocop/formatter/disabled_config_formatter.rb b/lib/rubocop/formatter/disabled_config_formatter.rb index faf696a9266..7de4978e5a2 100644 --- a/lib/rubocop/formatter/disabled_config_formatter.rb +++ b/lib/rubocop/formatter/disabled_config_formatter.rb @@ -122,12 +122,11 @@ def output_cop_comments(output_buffer, cfg, cop_name, offense_count) cop_class = Cop::Registry.global.find_by_cop_name(cop_name) default_cfg = default_config(cop_name) - if cop_class&.support_autocorrect? - if default_cfg.nil? || default_cfg['Safe'] || default_cfg['Safe'].nil? - output_buffer.puts '# Cop supports --auto-correct.' - else - output_buffer.puts '# Cop supports --auto-correct-all.' - end + + if supports_safe_auto_correct?(cop_class, default_cfg) + output_buffer.puts '# Cop supports --auto-correct.' + elsif supports_unsafe_autocorrect?(cop_class, default_cfg) + output_buffer.puts '# Cop supports --auto-correct-all.' end return unless default_cfg @@ -138,6 +137,15 @@ def output_cop_comments(output_buffer, cfg, cop_name, offense_count) output_cop_param_comments(output_buffer, params, default_cfg) end + def supports_safe_auto_correct?(cop_class, default_cfg) + cop_class&.support_autocorrect? && + (default_cfg.nil? || default_cfg['Safe'] || default_cfg['Safe'].nil?) + end + + def supports_unsafe_autocorrect?(cop_class, default_cfg) + cop_class&.support_autocorrect? && !default_cfg.nil? && default_cfg['Safe'] == false + end + def cop_config_params(default_cfg, cfg) default_cfg.keys - %w[Description StyleGuide Reference Enabled Exclude Safe