lib/rubocop/cop/betterment/active_job_performable.rb



# frozen_string_literal: true

module RuboCop
  module Cop
    module Betterment
      class ActiveJobPerformable < Base
        MSG = <<~DOC
          Classes that are "performable" should be ActiveJobs

          class MyJob < ApplicationJob
            def perform
            end
          end

          You can learn more about ActiveJob here:
          https://guides.rubyonrails.org/active_job_basics.html
        DOC

        def_node_matcher :subclasses_application_job?, <<-PATTERN
          (class (const ...) (const _ :ApplicationJob) ...)
        PATTERN

        def_node_matcher :is_perform_method?, <<-PATTERN
          (def :perform ...)
        PATTERN

        def on_class(node)
          return if subclasses_application_job?(node)
          return unless has_perform_method?(node)

          add_offense(node.identifier)
        end

        private

        def has_perform_method?(node)
          possible_methods_within(node).any? { |n| is_perform_method?(n) }
        end

        def possible_methods_within(node)
          if node.body.nil?
            []
          elsif node.body.begin_type?
            node.body.children
          else
            [node.body]
          end
        end
      end
    end
  end
end