class RuboCop::Cop::Rails::Exit
raise ‘a bad error has happened’
# good
exit(0)
# bad
@example
do its job.
the program exiting, which could result in the code failing to run and
- Usage in application code outside of the web process could result in
is used.)
code will result in specs exiting (potentially silently if exit(0)
rescue from a SystemExit and continue on, unit testing that library
- Usage in library code for your application. Even though rails will
There are two obvious cases where ‘exit’ is particularly harmful:
other form of stopping execution of current request.
Valid options are instead to raise an error, break, return or some
This cop enforces that ‘exit’ calls are not used within a rails app.
def offending_node?(node)
def offending_node?(node) right_method_name?(node.method_name) && right_argument_count?(node.arguments) && right_receiver?(node.receiver) end
def on_send(node)
def on_send(node) add_offense(node, location: :selector) if offending_node?(node) end
def right_argument_count?(arg_nodes)
More than 1 argument likely means it is a different
def right_argument_count?(arg_nodes) arg_nodes.size <= 1 end
def right_method_name?(method_name)
def right_method_name?(method_name) TARGET_METHODS.include?(method_name) end
def right_receiver?(receiver_node)
Kernel or Process or if receiver node is nil for plain
Only register if exit is being called explicitly on
def right_receiver?(receiver_node) return true unless receiver_node _a, receiver_node_class, _c = *receiver_node EXPLICIT_RECEIVERS.include?(receiver_node_class) end