Welcome to mirror list, hosted at ThFree Co, Russian Federation.

event_store_subscriber.rb « gitlab « cop « rubocop - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 0b2dd94bc4236c424108eccc40726fdcabc4a2ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# frozen_string_literal: true

module RuboCop
  module Cop
    module Gitlab
      # Cop that checks the implementation of Gitlab::EventStore::Subscriber
      #
      # A worker that implements Gitlab::EventStore::Subscriber
      # must implement the method #handle_event(event) and
      # must not override the method #perform(*args)
      #
      #  # bad
      #  class MySubscriber
      #    include Gitlab::EventStore::Subscriber
      #
      #    def perform(*args)
      #    end
      #  end
      #
      #  # bad
      #  class MySubscriber
      #    include Gitlab::EventStore::Subscriber
      #  end
      #
      #  # good
      #  class MySubscriber
      #    include Gitlab::EventStore::Subscriber
      #
      #    def handle_event(event)
      #    end
      #  end
      #
      class EventStoreSubscriber < RuboCop::Cop::Cop
        SUBSCRIBER_MODULE_NAME = 'Gitlab::EventStore::Subscriber'
        FORBID_PERFORM_OVERRIDE = "Do not override `perform` in a `#{SUBSCRIBER_MODULE_NAME}`."
        REQUIRE_HANDLE_EVENT = "A `#{SUBSCRIBER_MODULE_NAME}` must implement `#handle_event(event)`."

        def_node_matcher :includes_subscriber?, <<~PATTERN
          (send nil? :include (const (const (const nil? :Gitlab) :EventStore) :Subscriber))
        PATTERN

        def on_send(node)
          return unless includes_subscriber?(node)

          self.is_subscriber ||= true
          self.include_subscriber_node ||= node
        end

        def on_def(node)
          if is_subscriber && node.method_name == :perform
            add_offense(node, message: FORBID_PERFORM_OVERRIDE)
          end

          self.implements_handle_event ||= true if node.method_name == :handle_event
        end

        def on_investigation_end
          super

          if is_subscriber && !implements_handle_event
            add_offense(include_subscriber_node, message: REQUIRE_HANDLE_EVENT)
          end
        end

        private

        attr_accessor :is_subscriber, :include_subscriber_node, :implements_handle_event
      end
    end
  end
end