import json from abc import ABCMeta, abstractmethod from collections import namedtuple from six import add_metaclass class RepositoryNotification( namedtuple( "RepositoryNotification", [ "uuid", "title", "event_name", "method_name", "config_json", "event_config_json", "number_of_failures", ], ) ): """ RepositoryNotification represents a notification for a repository. :type uuid: string :type event: string :type method: string :type config: string :type title: string :type event_config: string :type number_of_failures: int """ def to_dict(self): try: config = json.loads(self.config_json) except ValueError: config = {} try: event_config = json.loads(self.event_config_json) except ValueError: event_config = {} return { "uuid": self.uuid, "title": self.title, "event": self.event_name, "method": self.method_name, "config": config, "event_config": event_config, "number_of_failures": self.number_of_failures, } @add_metaclass(ABCMeta) class RepoNotificationInterface(object): """ Interface that represents all data store interactions required by the RepositoryNotification API. """ @abstractmethod def create_repo_notification( self, namespace_name, repository_name, event_name, method_name, method_config, event_config, title=None, ): """ Args: namespace_name: namespace of repository repository_name: name of repository event_name: name of event method_name: name of method method_config: method config, json string event_config: event config, json string title: title of the notification Returns: RepositoryNotification object """ pass @abstractmethod def list_repo_notifications(self, namespace_name, repository_name, event_name=None): """ Args: namespace_name: namespace of repository repository_name: name of repository event_name: name of event Returns: list(RepositoryNotification) """ pass @abstractmethod def get_repo_notification(self, uuid): """ Args: uuid: uuid of notification Returns: RepositoryNotification or None """ pass @abstractmethod def delete_repo_notification(self, namespace_name, repository_name, uuid): """ Args: namespace_name: namespace of repository repository_name: name of repository uuid: uuid of notification Returns: RepositoryNotification or None """ pass @abstractmethod def reset_notification_number_of_failures(self, namespace_name, repository_name, uuid): """ Args: namespace_name: namespace of repository repository_name: name of repository uuid: uuid of notification Returns: RepositoryNotification """ pass @abstractmethod def queue_test_notification(self, uuid): """ Args: uuid: uuid of notification Returns: RepositoryNotification or None """ pass