From c811c353337d84cb0ecfcd517d2f69439f8dd8b5 Mon Sep 17 00:00:00 2001 From: Lucas Moura Date: Thu, 30 Jul 2015 11:23:14 -0300 Subject: [PATCH] Create abstract signal class for plugins --- colab/plugins/gitlab/apps.py | 7 ------- colab/plugins/gitlab/models.py | 2 -- colab/plugins/gitlab/signals.py | 16 ++++++++++++++++ colab/plugins/utils/apps.py | 26 ++++++++++++++++++++++++++ colab/plugins/utils/signals.py | 8 ++++++++ colab/signals/signals.py | 38 ++++++++++++++++++++++++++++++++++++++ colab/signals/tasks.py | 38 -------------------------------------- 7 files changed, 88 insertions(+), 47 deletions(-) create mode 100644 colab/plugins/gitlab/signals.py create mode 100644 colab/plugins/utils/signals.py create mode 100644 colab/signals/signals.py delete mode 100644 colab/signals/tasks.py diff --git a/colab/plugins/gitlab/apps.py b/colab/plugins/gitlab/apps.py index cdb583c..df9c0ba 100644 --- a/colab/plugins/gitlab/apps.py +++ b/colab/plugins/gitlab/apps.py @@ -1,7 +1,5 @@ from ..utils.apps import ColabProxiedAppConfig -from colab.signals.tasks import register_signal, connect_signal -from colab.plugins.gitlab.tasks import handling_method class ProxyGitlabAppConfig(ColabProxiedAppConfig): @@ -10,8 +8,3 @@ class ProxyGitlabAppConfig(ColabProxiedAppConfig): short_name = 'gitlab' signals_list = ['gitlab_create_project'] - - def __init__(self, app_name, app_module): - super(ProxyGitlabAppConfig, self).__init__(app_name, app_module) - register_signal(self.short_name, self.signals_list) - connect_signal(self.signals_list[0], self.short_name, handling_method) diff --git a/colab/plugins/gitlab/models.py b/colab/plugins/gitlab/models.py index 5d8cc53..cbc9b2e 100644 --- a/colab/plugins/gitlab/models.py +++ b/colab/plugins/gitlab/models.py @@ -2,7 +2,6 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from colab.plugins.utils.models import Collaboration from hitcounter.models import HitCounterModelMixin -from colab.signals.tasks import send class GitlabProject(models.Model, HitCounterModelMixin): @@ -18,7 +17,6 @@ class GitlabProject(models.Model, HitCounterModelMixin): @property def url(self): - send('gitlab_create_project', 'colab.plugins.gitlab') return u'/gitlab/{}'.format(self.path_with_namespace) class Meta: diff --git a/colab/plugins/gitlab/signals.py b/colab/plugins/gitlab/signals.py new file mode 100644 index 0000000..3396276 --- /dev/null +++ b/colab/plugins/gitlab/signals.py @@ -0,0 +1,16 @@ +from colab.plugins.utils.signals import AbstractSignal +from colab.plugins.gitlab.tasks import handling_method +from colab.signals.signals import register_signal, connect_signal + +class GitlabSignals(AbstractSignal): + + short_name = 'gitlab' + signals_list = ['gitlab_create_project'] + + + def register_signal(self): + register_signal(self.short_name, self.signals_list) + + + def connect_signal(self): + connect_signal(self.signals_list[0], self.short_name, handling_method) diff --git a/colab/plugins/utils/apps.py b/colab/plugins/utils/apps.py index 9369ff1..c3fd56a 100644 --- a/colab/plugins/utils/apps.py +++ b/colab/plugins/utils/apps.py @@ -1,6 +1,32 @@ +import importlib +import inspect from django.apps import AppConfig +from colab.plugins.utils.signals import AbstractSignal class ColabProxiedAppConfig(AppConfig): colab_proxied_app = True + + def __init__(self, app_name, app_module): + super(ColabProxiedAppConfig, self).__init__(app_name, app_module) + self.__import_signals(app_name) + self.signals.register_signal() + + + def _import_signals(self, app_name): + self.module_path = app_name + '.signals' + self.module = importlib.import_module(self.module_path) + + for module_item_name in dir(self.module): + module_item = getattr(self.module, module_item_name) + if not inspect.isclass(module_item): + continue + if issubclass(module_item, AbstractSignal): + if module_item != AbstractSignal: + self.signals = module_item() + break + + + def ready(self): + self.signals.connect_signal() diff --git a/colab/plugins/utils/signals.py b/colab/plugins/utils/signals.py new file mode 100644 index 0000000..b1cd4b5 --- /dev/null +++ b/colab/plugins/utils/signals.py @@ -0,0 +1,8 @@ +class AbstractSignal(): + + def register_signal(self): + raise(Exception, 'NOT IMPLEMENTED') + + + def connect_signal(self): + raise(Exception, 'NOT IMPLEMENTED') diff --git a/colab/signals/signals.py b/colab/signals/signals.py new file mode 100644 index 0000000..4ad4abb --- /dev/null +++ b/colab/signals/signals.py @@ -0,0 +1,38 @@ +from django.dispatch import Signal +from colab.signals.celery import app + + +registered_signals = {} +signal_instances = {} + + +# Fix celery serialization for signal +def reducer(self): + return (Signal, (self.providing_args,)) +Signal.__reduce__ = reducer + + +def register_signal(plugin_name, list_signals): + for signal in list_signals: + if signal in registered_signals: + if not plugin_name in registered_signals[signal]: + registered_signals[signal].append(plugin_name) + else: + registered_signals[signal] = [] + registered_signals[signal].append(plugin_name) + signal_instances[signal] = Signal() + + +def connect_signal(signal_name, sender, handling_method): + if signal_name in signal_instances: + signal_instances[signal_name].connect(handling_method.delay, + sender=sender) + else: + raise Exception("Signal does not exist!") + + +def send(signal_name, sender, **kwargs): + if signal_name in signal_instances: + signal_instances[signal_name].send(sender=sender, **kwargs) + else: + raise Exception("Signal does not exist!") diff --git a/colab/signals/tasks.py b/colab/signals/tasks.py deleted file mode 100644 index 4ad4abb..0000000 --- a/colab/signals/tasks.py +++ /dev/null @@ -1,38 +0,0 @@ -from django.dispatch import Signal -from colab.signals.celery import app - - -registered_signals = {} -signal_instances = {} - - -# Fix celery serialization for signal -def reducer(self): - return (Signal, (self.providing_args,)) -Signal.__reduce__ = reducer - - -def register_signal(plugin_name, list_signals): - for signal in list_signals: - if signal in registered_signals: - if not plugin_name in registered_signals[signal]: - registered_signals[signal].append(plugin_name) - else: - registered_signals[signal] = [] - registered_signals[signal].append(plugin_name) - signal_instances[signal] = Signal() - - -def connect_signal(signal_name, sender, handling_method): - if signal_name in signal_instances: - signal_instances[signal_name].connect(handling_method.delay, - sender=sender) - else: - raise Exception("Signal does not exist!") - - -def send(signal_name, sender, **kwargs): - if signal_name in signal_instances: - signal_instances[signal_name].send(sender=sender, **kwargs) - else: - raise Exception("Signal does not exist!") -- libgit2 0.21.2