summaryrefslogtreecommitdiff
path: root/pygerrit/events.py
diff options
context:
space:
mode:
Diffstat (limited to 'pygerrit/events.py')
-rw-r--r--pygerrit/events.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/pygerrit/events.py b/pygerrit/events.py
index c07979a..4a7200d 100644
--- a/pygerrit/events.py
+++ b/pygerrit/events.py
@@ -4,6 +4,45 @@ from pygerrit.error import GerritError
from pygerrit.models import Account, Approval, Change, Patchset, RefUpdate
+class GerritEventFactory(object):
+
+ """ Gerrit event factory. """
+
+ _events = {}
+
+ @classmethod
+ def register(cls, name):
+ """ Decorator to register the event identified by `name`.
+
+ Raise GerritError if the event is already registered.
+
+ """
+
+ def decorate(klazz):
+ if name in cls._events:
+ raise GerritError("Duplicate event: %s" % name)
+ cls._events[name] = klazz.__name__
+ return klazz
+ return decorate
+
+ @classmethod
+ def create(cls, json_data):
+ """ Create a new event instance.
+
+ Return an instance of the `GerritEvent` subclass from `json_data`
+ Raise GerritError if `json_data` does not contain a `type` key, or
+ no corresponding event is registered.
+
+ """
+ if not "type" in json_data:
+ raise GerritError("`type` not in json_data")
+ name = json_data["type"]
+ if not name in cls._events:
+ raise GerritError("Unknown event: %s" % name)
+ classname = cls._events[name]
+ return globals()[classname](json_data)
+
+
class GerritEvent(object):
""" Gerrit event base class. """
@@ -12,6 +51,7 @@ class GerritEvent(object):
pass
+@GerritEventFactory.register("patchset-created")
class PatchsetCreatedEvent(GerritEvent):
""" Gerrit "patchset-created" event. """
@@ -26,6 +66,7 @@ class PatchsetCreatedEvent(GerritEvent):
raise GerritError("PatchsetCreatedEvent: %s" % e)
+@GerritEventFactory.register("draft-published")
class DraftPublishedEvent(GerritEvent):
""" Gerrit "draft-published" event. """
@@ -40,6 +81,7 @@ class DraftPublishedEvent(GerritEvent):
raise GerritError("DraftPublishedEvent: %s" % e)
+@GerritEventFactory.register("comment-added")
class CommentAddedEvent(GerritEvent):
""" Gerrit "comment-added" event. """
@@ -59,6 +101,7 @@ class CommentAddedEvent(GerritEvent):
raise GerritError("CommentAddedEvent: %s" % e)
+@GerritEventFactory.register("change-merged")
class ChangeMergedEvent(GerritEvent):
""" Gerrit "change-merged" event. """
@@ -73,6 +116,7 @@ class ChangeMergedEvent(GerritEvent):
raise GerritError("ChangeMergedEvent: %s" % e)
+@GerritEventFactory.register("change-abandoned")
class ChangeAbandonedEvent(GerritEvent):
""" Gerrit "change-abandoned" event. """
@@ -88,6 +132,7 @@ class ChangeAbandonedEvent(GerritEvent):
raise GerritError("ChangeAbandonedEvent: %s" % e)
+@GerritEventFactory.register("change-restored")
class ChangeRestoredEvent(GerritEvent):
""" Gerrit "change-restored" event. """
@@ -103,6 +148,7 @@ class ChangeRestoredEvent(GerritEvent):
raise GerritError("ChangeRestoredEvent: %s" % e)
+@GerritEventFactory.register("ref-updated")
class RefUpdatedEvent(GerritEvent):
""" Gerrit "ref-updated" event. """