Class: RuboCop::Cop::Operandi::PreferFailMethod

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Defined in:
lib/operandi/rubocop/cop/operandi/prefer_fail_method.rb

Overview

Detects errors.add(:base, "message") and suggests using fail!("message") instead.

This cop checks calls inside service classes that inherit from Operandi::Base or any configured base service classes.

Examples:

# bad
class User::Create < ApplicationService
  step :process

  private

  def process
    errors.add(:base, "user is required")
  end
end

# good
class User::Create < ApplicationService
  step :process

  private

  def process
    fail!("user is required")
  end
end

Constant Summary collapse

MSG =
"Use `fail!(...)` instead of `errors.add(:base, ...)`."
DEFAULT_BASE_CLASSES =
["ApplicationService"].freeze

Instance Method Summary collapse

Instance Method Details

#after_class(_node) ⇒ Object



56
57
58
# File 'lib/operandi/rubocop/cop/operandi/prefer_fail_method.rb', line 56

def after_class(_node)
  @in_service_class = false
end

#on_class(node) ⇒ Object



52
53
54
# File 'lib/operandi/rubocop/cop/operandi/prefer_fail_method.rb', line 52

def on_class(node)
  @in_service_class = service_class?(node)
end

#on_send(node) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/operandi/rubocop/cop/operandi/prefer_fail_method.rb', line 60

def on_send(node)
  return unless @in_service_class
  return unless node.method_name == :add

  return unless errors_add_base?(node)

  # Only flag if there's a message argument after :base
  # errors.add(:base) without a message is invalid Operandi syntax
  message_args = node.arguments[1..]
  return if message_args.empty?

  add_offense(node, message: MSG) do |corrector|
    autocorrect(corrector, node, message_args)
  end
end