class RuboCop::CLI::Command::SuggestExtensions

@api private
a transitive dependency, it will not be suggested.
gem with an extension, it is not suggested. However, if an extension is
Only primary dependencies are evaluated, so if a dependency depends on a
Suggest RuboCop extensions to install based on Gemfile dependencies.

def all_extensions

def all_extensions
  return [] unless lockfile.dependencies.any?
  extensions = @config_store.for_pwd.for_all_cops['SuggestExtensions']
  case extensions
  when true
    extensions = ConfigLoader.default_configuration.for_all_cops['SuggestExtensions']
  when false, nil
    extensions = {}
  end
  extensions.select { |_, v| (Array(v) & dependent_gems).any? }.keys
end

def current_formatter

def current_formatter
  @options[:format] || @config_store.for_pwd.for_all_cops['DefaultFormatter'] || 'p'
end

def dependent_gems

def dependent_gems
  lockfile.dependencies.map(&:name)
end

def extensions

def extensions
  not_installed_extensions + installed_and_not_loaded_extensions
end

def installed_and_not_loaded_extensions

def installed_and_not_loaded_extensions
  installed_extensions - loaded_extensions
end

def installed_extensions

def installed_extensions
  all_extensions & installed_gems
end

def installed_gems

def installed_gems
  lockfile.gems.map(&:name)
end

def loaded_extensions

def loaded_extensions
  @config_store.for_pwd.loaded_features.to_a
end

def lockfile

def lockfile
  @lockfile ||= Lockfile.new
end

def not_installed_extensions

def not_installed_extensions
  all_extensions - installed_gems
end

def print_install_suggestions

def print_install_suggestions
  puts
  puts 'Tip: Based on detected gems, the following ' \
       'RuboCop extension libraries might be helpful:'
  not_installed_extensions.sort.each do |extension|
    puts "  * #{extension} (https://rubygems.org/gems/#{extension})"
  end
end

def print_load_suggestions

def print_load_suggestions
  puts
  puts 'The following RuboCop extension libraries are installed but not loaded in config:'
  installed_and_not_loaded_extensions.sort.each do |extension|
    puts "  * #{extension}"
  end
end

def print_opt_out_instruction

def print_opt_out_instruction
  puts
  puts 'You can opt out of this message by adding the following to your config ' \
       '(see https://docs.rubocop.org/rubocop/extensions.html#extension-suggestions ' \
       'for more options):'
  puts '  AllCops:'
  puts '    SuggestExtensions: false'
end

def puts(*args)

def puts(*args)
  output = (@options[:stderr] ? $stderr : $stdout)
  output.puts(*args)
end

def run

def run
  return if skip? || extensions.none?
  print_install_suggestions if not_installed_extensions.any?
  print_load_suggestions if installed_and_not_loaded_extensions.any?
  print_opt_out_instruction
  puts if @options[:display_time]
end

def skip?

def skip?
  # Disable outputting the notification:
  # 1. On CI
  # 2. When given RuboCop options that it doesn't make sense for
  # 3. For all formatters except specified in `INCLUDED_FORMATTERS'`
  ENV.fetch('CI', nil) ||
    @options[:only] || @options[:debug] || @options[:list_target_files] ||
    @options[:out] || @options[:stdin] ||
    !INCLUDED_FORMATTERS.include?(current_formatter)
end