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.

@example

# bad
exit(0)

# good
raise 'a bad error has happened'

Constants

EXPLICIT_RECEIVERS
MSG
RESTRICT_ON_SEND

Public Instance Methods

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

Private Instance Methods

offending_node?(node) click to toggle source
# File lib/rubocop/cop/rails/exit.rb, line 39
def offending_node?(node)
  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 45
def right_argument_count?(arg_nodes)
  arg_nodes.size <= 1
end
right_receiver?(receiver_node) click to toggle source

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

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

  _a, receiver_node_class, _c = *receiver_node

  EXPLICIT_RECEIVERS.include?(receiver_node_class)
end