diff options
Diffstat (limited to 'pygerrit/events.py')
| -rw-r--r-- | pygerrit/events.py | 46 |
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. """ |
