class RuboCop::OptionsValidator

Validates option arguments and the options' compatibility with each other.

Public Class Methods

new(options) click to toggle source
# File lib/rubocop/options.rb, line 204
def initialize(options)
  @options = options
end
validate_cop_list(names) click to toggle source

Cop name validation must be done later than option parsing, so it's not called from within Options.

# File lib/rubocop/options.rb, line 190
def self.validate_cop_list(names)
  return unless names

  departments = Cop::Cop.registry.departments.map(&:to_s)

  names.each do |name|
    next if Cop::Cop.registry.names.include?(name)
    next if departments.include?(name)
    next if %w[Syntax Lint/Syntax].include?(name)

    raise ArgumentError, "Unrecognized cop or department: #{name}."
  end
end

Public Instance Methods

boolean_or_empty_cache?() click to toggle source
# File lib/rubocop/options.rb, line 259
def boolean_or_empty_cache?
  !@options.key?(:cache) || %w[true false].include?(@options[:cache])
end
except_syntax?() click to toggle source
# File lib/rubocop/options.rb, line 254
def except_syntax?
  @options.key?(:except) &&
    (@options[:except] & %w[Lint/Syntax Syntax]).any?
end
incompatible_options() click to toggle source
# File lib/rubocop/options.rb, line 267
def incompatible_options
  @incompatible_options ||= @options.keys & Options::EXITING_OPTIONS
end
no_offense_counts_without_auto_gen_config?() click to toggle source
# File lib/rubocop/options.rb, line 263
def no_offense_counts_without_auto_gen_config?
  @options.key?(:no_offense_counts) && !@options.key?(:auto_gen_config)
end
only_includes_unneeded_disable?() click to toggle source
# File lib/rubocop/options.rb, line 249
def only_includes_unneeded_disable?
  @options.key?(:only) &&
    (@options[:only] & %w[Lint/UnneededDisable UnneededDisable]).any?
end
validate_compatibility() click to toggle source
# File lib/rubocop/options.rb, line 208
def validate_compatibility # rubocop:disable Metrics/MethodLength
  if only_includes_unneeded_disable?
    raise ArgumentError, 'Lint/UnneededDisable can not be used with --only.'
  end
  if except_syntax?
    raise ArgumentError, 'Syntax checking can not be turned off.'
  end
  unless boolean_or_empty_cache?
    raise ArgumentError, '-C/--cache argument must be true or false'
  end
  if no_offense_counts_without_auto_gen_config?
    raise ArgumentError, '--no-offense-counts can only be used together ' \
                         'with --auto-gen-config.'
  end
  validate_parallel

  return if incompatible_options.size <= 1
  raise ArgumentError, 'Incompatible cli options: ' \
                       "#{incompatible_options.inspect}"
end
validate_exclude_limit_option(args) click to toggle source
# File lib/rubocop/options.rb, line 271
def validate_exclude_limit_option(args)
  if @options[:exclude_limit] !~ /^\d+$/
    # Emulate OptionParser's behavior to make failures consistent regardless
    # of option order.
    raise OptionParser::MissingArgument
  end

  # --exclude-limit is valid if there's a parsed or yet unparsed
  # --auto-gen-config.
  return if @options[:auto_gen_config] || args.include?('--auto-gen-config')

  raise ArgumentError,
        '--exclude-limit can only be used with --auto-gen-config.'
end
validate_parallel() click to toggle source
# File lib/rubocop/options.rb, line 229
def validate_parallel
  return unless @options.key?(:parallel)

  if @options[:cache] == 'false'
    raise ArgumentError, '-P/--parallel uses caching to speed up ' \
                         'execution, so combining with --cache false is ' \
                         'not allowed.'
  end

  combos = {
    auto_gen_config: '-P/--parallel uses caching to speed up execution, ' \
                     'while --auto-gen-config needs a non-cached run, ' \
                     'so they cannot be combined.',
    fail_fast: '-P/--parallel can not be combined with -F/--fail-fast.',
    auto_correct: '-P/--parallel can not be combined with --auto-correct.'
  }

  combos.each { |key, msg| raise ArgumentError, msg if @options.key?(key) }
end