class RuboCop::Cop::Style::RequireOrder

Sort `require` and `require_relative` in alphabetical order.

@safety

This cop's autocorrection is unsafe because it will obviously change the execution order.

@example

# bad
require 'b'
require 'a'

# good
require 'a'
require 'b'

# bad
require_relative 'b'
require_relative 'a'

# good
require_relative 'a'
require_relative 'b'

# good (sorted within each section separated by a blank line)
require 'a'
require 'd'

require 'b'
require 'c'

# good
require 'b'
require_relative 'c'
require 'a'

Constants

RESTRICT_ON_SEND

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/style/require_order.rb, line 46
def on_send(node)
  previous_older_sibling = find_previous_older_sibling(node)
  return unless previous_older_sibling

  add_offense(
    node,
    message: "Sort `#{node.method_name}` in alphabetical order."
  ) do |corrector|
    swap(
      range_with_comments_and_lines(previous_older_sibling),
      range_with_comments_and_lines(node),
      corrector: corrector
    )
  end
end

Private Instance Methods

find_previous_older_sibling(node) click to toggle source
# File lib/rubocop/cop/style/require_order.rb, line 64
def find_previous_older_sibling(node)
  node.left_siblings.reverse.find do |sibling|
    break unless sibling.send_type?
    break unless sibling.method?(node.method_name)
    break unless in_same_section?(sibling, node)

    node.first_argument.source < sibling.first_argument.source
  end
end
in_same_section?(node1, node2) click to toggle source
# File lib/rubocop/cop/style/require_order.rb, line 74
def in_same_section?(node1, node2)
  !node1.location.expression.with(
    end_pos: node2.location.expression.end_pos
  ).source.include?("\n\n")
end
swap(range1, range2, corrector:) click to toggle source
# File lib/rubocop/cop/style/require_order.rb, line 80
def swap(range1, range2, corrector:)
  inserted = range2.source
  corrector.insert_before(range1, inserted)
  corrector.remove(range2)
end