Class: RuboCop::Cop::Style::RandomWithOffset

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/rubocop/cop/style/random_with_offset.rb

Overview

Checks for the use of randomly generated numbers, added/subtracted with integer literals, as well as those with Integer#succ and Integer#pred methods. Prefer using ranges instead, as it clearly states the intentions.

Examples:

# bad
rand(6) + 1
1 + rand(6)
rand(6) - 1
1 - rand(6)
rand(6).succ
rand(6).pred
Random.rand(6) + 1
Kernel.rand(6) + 1
rand(0..5) + 1

# good
rand(1..6)
rand(1...7)

Constant Summary collapse

MSG =
'Prefer ranges when generating random numbers instead of integers with offsets.'
RESTRICT_ON_SEND =
%i[+ - succ pred next].freeze

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods inherited from Base

#active_support_extensions_enabled?, #add_global_offense, #add_offense, autocorrect_incompatible_with, badge, #begin_investigation, callbacks_needed, #callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, #inspect, joining_forces, lint?, match?, #message, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #ready, #relevant_file?, support_autocorrect?, support_multiple_source?, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

silence_warnings

Constructor Details

This class inherits a constructor from RuboCop::Cop::Base

Instance Method Details

#integer_op_rand?(node) ⇒ Object



33
34
35
36
37
38
39
40
# File 'lib/rubocop/cop/style/random_with_offset.rb', line 33

def_node_matcher :integer_op_rand?, <<~PATTERN
  (send
    int {:+ :-}
    (send
      {nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
      :rand
      {int (irange int int) (erange int int)}))
PATTERN

#on_send(node) ⇒ Object



63
64
65
66
67
68
# File 'lib/rubocop/cop/style/random_with_offset.rb', line 63

def on_send(node)
  return unless node.receiver
  return unless integer_op_rand?(node) || rand_op_integer?(node) || rand_modified?(node)

  add_offense(node) { |corrector| autocorrect(corrector, node) }
end

#rand_modified?(node) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/rubocop/cop/style/random_with_offset.rb', line 54

def_node_matcher :rand_modified?, <<~PATTERN
  (send
    (send
      {nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
      :rand
      {int (irange int int) (erange int int)})
    {:succ :pred :next})
PATTERN

#rand_op_integer?(node) ⇒ Object



43
44
45
46
47
48
49
50
51
# File 'lib/rubocop/cop/style/random_with_offset.rb', line 43

def_node_matcher :rand_op_integer?, <<~PATTERN
  (send
    (send
      {nil? (const {nil? cbase} :Random) (const {nil? cbase} :Kernel)}
      :rand
      {int (irange int int) (erange int int)})
    {:+ :-}
    int)
PATTERN