Class: RuboCop::Cop::Lint::NonDeterministicRequireOrder

Inherits:
Cop
  • Object
show all
Defined in:
lib/rubocop/cop/lint/non_deterministic_require_order.rb

Overview

`Dir` and `Dir.glob(…)` do not make any guarantees about the order in which files are returned. The final order is determined by the operating system and file system. This means that using them in cases where the order matters, such as requiring files, can lead to intermittent failures that are hard to debug. To ensure this doesn't happen, always sort the list.

Examples:


# bad
Dir["./lib/**/*.rb"].each do |file|
  require file
end

# good
Dir["./lib/**/*.rb"].sort.each do |file|
  require file
end

# bad
Dir.glob(Rails.root.join(__dir__, 'test', '*.rb')) do |file|
  require file
end

# good
Dir.glob(Rails.root.join(__dir__, 'test', '*.rb')).sort.each do |file|
  require file
end

Constant Summary collapse

MSG =
'Sort files before requiring them.'

Instance Method Summary collapse

Methods inherited from Cop

#highlights, #messages

Instance Method Details

#autocorrect(node) ⇒ Object


52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/rubocop/cop/lint/non_deterministic_require_order.rb', line 52

def autocorrect(node)
  if unsorted_dir_block?(node)
    lambda do |corrector|
      corrector.replace(node, "#{node.source}.sort.each")
    end
  else
    lambda do |corrector|
      source = node.receiver.source
      corrector.replace(node, "#{source}.sort.each")
    end
  end
end

#on_block(node) ⇒ Object


41
42
43
44
45
46
47
48
49
50
# File 'lib/rubocop/cop/lint/non_deterministic_require_order.rb', line 41

def on_block(node)
  return unless node.body
  return unless unsorted_dir_loop?(node.send_node)

  loop_variable(node.arguments) do |var_name|
    return unless var_is_required?(node.body, var_name)

    add_offense(node.send_node)
  end
end