Class: RuboCop::OptionsValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/rubocop/options.rb

Overview

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ OptionsValidator

Returns a new instance of OptionsValidator.



253
254
255
# File 'lib/rubocop/options.rb', line 253

def initialize(options)
  @options = options
end

Class Method Details

.validate_cop_list(names) ⇒ Object

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



219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/rubocop/options.rb', line 219

def validate_cop_list(names)
  return unless names

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

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

    raise IncorrectCopNameError, format_message_from(name, cop_names)
  end
end

Instance Method Details

#boolean_or_empty_cache?Boolean

Returns:

  • (Boolean)


337
338
339
# File 'lib/rubocop/options.rb', line 337

def boolean_or_empty_cache?
  !@options.key?(:cache) || %w[true false].include?(@options[:cache])
end

#display_only_fail_level_offenses_with_autocorrect?Boolean

Returns:

  • (Boolean)


328
329
330
# File 'lib/rubocop/options.rb', line 328

def display_only_fail_level_offenses_with_autocorrect?
  @options[:display_only_fail_level_offenses] && @options[:autocorrect]
end

#except_syntax?Boolean

Returns:

  • (Boolean)


332
333
334
335
# File 'lib/rubocop/options.rb', line 332

def except_syntax?
  @options.key?(:except) &&
    (@options[:except] & %w[Lint/Syntax Syntax]).any?
end

#incompatible_optionsObject



341
342
343
# File 'lib/rubocop/options.rb', line 341

def incompatible_options
  @incompatible_options ||= @options.keys & Options::EXITING_OPTIONS
end

#only_includes_unneeded_disable?Boolean

Returns:

  • (Boolean)


322
323
324
325
326
# File 'lib/rubocop/options.rb', line 322

def only_includes_unneeded_disable?
  @options.key?(:only) &&
    (@options[:only] & %w[Lint/UnneededCopDisableDirective
                          UnneededCopDisableDirective]).any?
end

#validate_auto_gen_configObject



282
283
284
285
286
287
288
289
290
291
292
293
294
# File 'lib/rubocop/options.rb', line 282

def validate_auto_gen_config
  return if @options.key?(:auto_gen_config)

  message = '--%<flag>s can only be used together with --auto-gen-config.'

  %i[exclude_limit no_offense_counts no_auto_gen_timestamp
     auto_gen_only_exclude].each do |option|
    if @options.key?(option)
      raise OptionArgumentError,
            format(message, flag: option.to_s.tr('_', '-'))
    end
  end
end

#validate_compatibilityObject

rubocop:disable Metrics/MethodLength



257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
# File 'lib/rubocop/options.rb', line 257

def validate_compatibility # rubocop:disable Metrics/MethodLength
  if only_includes_unneeded_disable?
    raise OptionArgumentError, 'Lint/UnneededCopDisableDirective can not ' \
                               'be used with --only.'
  end
  if except_syntax?
    raise OptionArgumentError, 'Syntax checking can not be turned off.'
  end
  unless boolean_or_empty_cache?
    raise OptionArgumentError, '-C/--cache argument must be true or false'
  end

  if display_only_fail_level_offenses_with_autocorrect?
    raise OptionArgumentError, '--autocorrect can not be used with ' \
      '--display-only-fail-level-offenses'
  end
  validate_auto_gen_config
  validate_parallel

  return if incompatible_options.size <= 1

  raise OptionArgumentError, 'Incompatible cli options: ' \
                             "#{incompatible_options.inspect}"
end

#validate_exclude_limit_optionObject

Raises:

  • (OptionParser::MissingArgument)


345
346
347
348
349
350
351
# File 'lib/rubocop/options.rb', line 345

def validate_exclude_limit_option
  return if @options[:exclude_limit] =~ /^\d+$/

  # Emulate OptionParser's behavior to make failures consistent regardless
  # of option order.
  raise OptionParser::MissingArgument
end

#validate_parallelObject



296
297
298
299
300
301
302
303
304
305
306
# File 'lib/rubocop/options.rb', line 296

def validate_parallel
  return unless @options.key?(:parallel)

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

  validate_parallel_with_combo_option
end

#validate_parallel_with_combo_optionObject



308
309
310
311
312
313
314
315
316
317
318
319
320
# File 'lib/rubocop/options.rb', line 308

def validate_parallel_with_combo_option
  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 do |key, msg|
    raise OptionArgumentError, msg if @options.key?(key)
  end
end