summaryrefslogtreecommitdiff
path: root/rubocop/cop/gitlab/event_store_subscriber.rb
diff options
context:
space:
mode:
Diffstat (limited to 'rubocop/cop/gitlab/event_store_subscriber.rb')
-rw-r--r--rubocop/cop/gitlab/event_store_subscriber.rb71
1 files changed, 71 insertions, 0 deletions
diff --git a/rubocop/cop/gitlab/event_store_subscriber.rb b/rubocop/cop/gitlab/event_store_subscriber.rb
new file mode 100644
index 00000000000..0b2dd94bc42
--- /dev/null
+++ b/rubocop/cop/gitlab/event_store_subscriber.rb
@@ -0,0 +1,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