class RuboCop::Cop::Rails::Exit

This cop enforces that 'exit' calls are not used within a rails app. Valid options are instead to raise an error, break, return or some other form of stopping execution of current request.

There are two obvious cases where 'exit' is particularly harmful:

rescue from a SystemExit and continue on, unit testing that library code will result in specs exiting (potentially silently if exit(0) is used.)

the program exiting, which could result in the code failing to run and do its job.

Constants

EXPLICIT_RECEIVERS
MSG
TARGET_METHODS

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/rails/exit.rb, line 25
def on_send(node)
  add_offense(node, location: :selector) if offending_node?(node)
end

Private Instance Methods

offending_node?(node) click to toggle source
# File lib/rubocop/cop/rails/exit.rb, line 31
def offending_node?(node)
  right_method_name?(node.method_name) &&
    right_argument_count?(node.arguments) &&
    right_receiver?(node.receiver)
end
right_argument_count?(arg_nodes) click to toggle source

More than 1 argument likely means it is a different `exit` implementation than the one we are preventing.

# File lib/rubocop/cop/rails/exit.rb, line 43
def right_argument_count?(arg_nodes)
  arg_nodes.size <= 1
end
right_method_name?(method_name) click to toggle source
# File lib/rubocop/cop/rails/exit.rb, line 37
def right_method_name?(method_name)
  TARGET_METHODS.include?(method_name)
end
right_receiver?(receiver_node) click to toggle source

Only register if exit is being called explicitly on Kernel or Process or if receiver node is nil for plain `exit` calls.

# File lib/rubocop/cop/rails/exit.rb, line 50
def right_receiver?(receiver_node)
  return true unless receiver_node

  _a, receiver_node_class, _c = *receiver_node

  EXPLICIT_RECEIVERS.include?(receiver_node_class)
end