Class: RuboCop::OptionsValidator Private

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

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ OptionsValidator

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of OptionsValidator.



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

def initialize(options)
  @options = options
end

Class Method Details

.validate_cop_list(names) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

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



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

def validate_cop_list(names)
  return unless names

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

  names.each do |name|
    next if cop_names.include?(name)
    next if departments.include?(name)
    next if SYNTAX_DEPARTMENTS.include?(name)

    raise IncorrectCopNameError, format_message_from(name, cop_names)
  end
end

Instance Method Details

#boolean_or_empty_cache?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


443
444
445
# File 'lib/rubocop/options.rb', line 443

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

#disable_parallel_when_invalid_option_comboObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



411
412
413
414
415
416
417
418
419
420
421
422
# File 'lib/rubocop/options.rb', line 411

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

  invalid_flags = invalid_arguments_for_parallel

  return if invalid_flags.empty?

  @options.delete(:parallel)

  puts '-P/--parallel is being ignored because ' \
       "it is not compatible with #{invalid_flags.join(', ')}."
end

#display_only_fail_level_offenses_with_autocorrect?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


435
436
437
# File 'lib/rubocop/options.rb', line 435

def display_only_fail_level_offenses_with_autocorrect?
  @options.key?(:display_only_fail_level_offenses) && @options.key?(:autocorrect)
end

#except_syntax?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


439
440
441
# File 'lib/rubocop/options.rb', line 439

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

#incompatible_optionsObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



447
448
449
# File 'lib/rubocop/options.rb', line 447

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

#invalid_arguments_for_parallelObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



424
425
426
427
428
# File 'lib/rubocop/options.rb', line 424

def invalid_arguments_for_parallel
  [('--auto-gen-config' if @options.key?(:auto_gen_config)),
   ('-F/--fail-fast'    if @options.key?(:fail_fast)),
   ('--cache false'     if @options > { cache: 'false' })].compact
end

#only_includes_redundant_disable?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


430
431
432
433
# File 'lib/rubocop/options.rb', line 430

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

#validate_auto_gen_configObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

rubocop:enable Metrics/AbcSize



358
359
360
361
362
363
364
365
366
367
368
369
# File 'lib/rubocop/options.rb', line 358

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 offense_counts 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_autocorrectObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



397
398
399
400
401
402
403
404
405
406
407
408
409
# File 'lib/rubocop/options.rb', line 397

def validate_autocorrect
  if @options.key?(:safe_autocorrect) && @options.key?(:autocorrect_all)
    message = Rainbow("      Error: Both safe and unsafe autocorrect options are specified, use only one.\n    MESSAGE\n    raise OptionArgumentError, message\n  end\n  return if @options.key?(:autocorrect)\n  return unless @options.key?(:disable_uncorrectable)\n\n  raise OptionArgumentError,\n        format('--disable-uncorrectable can only be used together with --autocorrect.')\nend\n").red

#validate_cache_enabled_for_cache_rootObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



459
460
461
462
463
# File 'lib/rubocop/options.rb', line 459

def validate_cache_enabled_for_cache_root
  return unless @options[:cache] == 'false'

  raise OptionArgumentError, '--cache-root cannot be used with --cache false'
end

#validate_compatibilityObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

rubocop:disable Metrics/AbcSize



332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
# File 'lib/rubocop/options.rb', line 332

def validate_compatibility # rubocop:disable Metrics/MethodLength
  if only_includes_redundant_disable?
    raise OptionArgumentError, 'Lint/RedundantCopDisableDirective cannot be used with --only.'
  end
  raise OptionArgumentError, 'Syntax checking cannot be turned off.' if except_syntax?
  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 cannot be used with ' \
                               '--display-only-fail-level-offenses.'
  end
  validate_auto_gen_config
  validate_autocorrect
  validate_display_only_failed
  validate_display_only_failed_and_display_only_correctable
  validate_display_only_correctable_and_autocorrect
  disable_parallel_when_invalid_option_combo

  return if incompatible_options.size <= 1

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

#validate_cop_optionsObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



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

def validate_cop_options
  i[only except].each { |opt| OptionsValidator.validate_cop_list(@options[opt]) }
end

#validate_display_only_correctable_and_autocorrectObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



379
380
381
382
383
384
385
386
# File 'lib/rubocop/options.rb', line 379

def validate_display_only_correctable_and_autocorrect
  return unless @options.key?(:autocorrect)
  return if !@options.key?(:display_only_correctable) &&
            !@options.key?(:display_only_safe_correctable)

  raise OptionArgumentError,
        '--autocorrect cannot be used with --display-only-[safe-]correctable.'
end

#validate_display_only_failedObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



371
372
373
374
375
376
377
# File 'lib/rubocop/options.rb', line 371

def validate_display_only_failed
  return unless @options.key?(:display_only_failed)
  return if @options[:format] == 'junit'

  raise OptionArgumentError,
        format('--display-only-failed can only be used together with --format junit.')
end

#validate_display_only_failed_and_display_only_correctableObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



388
389
390
391
392
393
394
395
# File 'lib/rubocop/options.rb', line 388

def validate_display_only_failed_and_display_only_correctable
  return unless @options.key?(:display_only_failed)
  return if !@options.key?(:display_only_correctable) &&
            !@options.key?(:display_only_safe_correctable)

  raise OptionArgumentError,
        format('--display-only-failed cannot be used together with other display options.')
end

#validate_exclude_limit_optionObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Raises:

  • (OptionParser::MissingArgument)


451
452
453
454
455
456
457
# File 'lib/rubocop/options.rb', line 451

def validate_exclude_limit_option
  return if /^\d+$/.match?(@options[:exclude_limit])

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