From 5975ae7b186fda3f16d8c21185b33d47ae877601 Mon Sep 17 00:00:00 2001 From: Lucas Kanashiro Date: Tue, 21 Jul 2015 17:14:42 -0300 Subject: [PATCH] Create structure for colab signals --- colab/settings.py | 1 + colab/signals/__init__.py | 0 colab/signals/apps.py | 6 ++++++ colab/signals/celery.py | 22 ++++++++++++++++++++++ colab/signals/signals.py | 31 +++++++++++++++++++++++++++++++ colab/signals/tests/__init__.py | 0 colab/signals/tests/test_signals.py | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 142 insertions(+), 0 deletions(-) create mode 100644 colab/signals/__init__.py create mode 100644 colab/signals/apps.py create mode 100644 colab/signals/celery.py create mode 100644 colab/signals/signals.py create mode 100644 colab/signals/tests/__init__.py create mode 100644 colab/signals/tests/test_signals.py diff --git a/colab/settings.py b/colab/settings.py index f326007..6f98e25 100644 --- a/colab/settings.py +++ b/colab/settings.py @@ -57,6 +57,7 @@ INSTALLED_APPS = ( 'colab.search', 'colab.tz', 'colab.utils', + 'colab.signals', ) ROOT_URLCONF = 'colab.urls' diff --git a/colab/signals/__init__.py b/colab/signals/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/signals/__init__.py diff --git a/colab/signals/apps.py b/colab/signals/apps.py new file mode 100644 index 0000000..aa98493 --- /dev/null +++ b/colab/signals/apps.py @@ -0,0 +1,6 @@ + +from django.apps import AppConfig + + +class SignalsConfig(AppConfig): + name = 'colab.signals' diff --git a/colab/signals/celery.py b/colab/signals/celery.py new file mode 100644 index 0000000..6d19e21 --- /dev/null +++ b/colab/signals/celery.py @@ -0,0 +1,22 @@ +from __future__ import absolute_import + +import os + +from celery import Celery + +# set the default Django settings module for the 'celery' program. +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'colab.settings') + +from django.conf import settings + +app = Celery('colab') + +app.config_from_object('django.conf:settings') +app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) + +app.conf.update( + CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend', +) +app.conf.update( + CELERY_RESULT_BACKEND='djcelery.backends.cache:CacheBackend', +) diff --git a/colab/signals/signals.py b/colab/signals/signals.py new file mode 100644 index 0000000..e35f74c --- /dev/null +++ b/colab/signals/signals.py @@ -0,0 +1,31 @@ +from django.dispatch import Signal +import colab.signals.celery + +class Signals(): + def __init__(self): + self.registered_signals = {} + self.signal_instances = {} + + + def register_signal(self, plugin_name, list_signals): + for signal in list_signals: + if signal in self.registered_signals: + if not plugin_name in self.registered_signals[signal]: + self.registered_signals[signal].append(plugin_name) + else: + self.registered_signals[signal] = [] + self.registered_signals[signal].append(plugin_name) + self.signal_instances[signal] = Signal() + + + def connect_signal(self, signal_name, sender, handling_method): + if signal_name in self.signal_instances: + self.signal_instances[signal_name].connect(handling_method, + sender=sender) + else: + raise Exception("Signal does not exist!") + + + def send(self, signal_name, sender, **kwargs): + if signal_name in self.signal_instances: + self.signal_instances[signal_name].send(sender=sender) diff --git a/colab/signals/tests/__init__.py b/colab/signals/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/colab/signals/tests/__init__.py diff --git a/colab/signals/tests/test_signals.py b/colab/signals/tests/test_signals.py new file mode 100644 index 0000000..b75c49a --- /dev/null +++ b/colab/signals/tests/test_signals.py @@ -0,0 +1,82 @@ +""" +Test Signals class. +Objective: Test parameters, and behavior. +""" + +from django.test import TestCase +from colab.signals.signals import Signals +from mock import patch + + +class SignalsTest(TestCase): + + def setUp(self): + self.list_signal = ['a', 'b', 'c'] + self.plugin_name = 'test_signal' + self.signals = Signals() + + + def test_register_signal_(self): + self.signals.register_signal(self.plugin_name, self.list_signal) + + signal_name ='a' + signal_list = ['test_signal'] + self.assertEqual(len(self.signals.registered_signals[signal_name]), 1) + self.assertEqual(self.signals.registered_signals[signal_name], + signal_list) + + + def test_register_signal_already_registered(self): + signal_name ='a' + signal_list = ['test_signal'] + + self.signals.register_signal(self.plugin_name, self.list_signal) + self.assertEqual(len(self.signals.registered_signals[signal_name]), 1) + + self.signals.register_signal(self.plugin_name, self.list_signal) + self.assertEqual(len(self.signals.registered_signals[signal_name]), 1) + self.assertEqual(self.signals.registered_signals[signal_name], + signal_list) + + + def test_connect_non_registered_signal(self): + sender = 'Test' + handling_method = 'Test' + signal_name = 'Test' + + self.assertRaises(Exception, self.signals.connect_signal, signal_name, + sender, handling_method) + + + @patch('colab.signals.signals.Signal.connect') + def test_connect_already_registered_signal(self, mock): + sender = 'Test' + handling_method = 'Test' + signal_name = 'a' + + self.signals.register_signal(self.plugin_name, self.list_signal) + + self.signals.connect_signal(signal_name, sender, handling_method) + args, kwargs = mock.call_args + + self.assertEqual(args[0], handling_method) + self.assertEqual(kwargs['sender'], sender) + self.assertTrue(mock.is_called) + + + @patch('colab.signals.signals.Signal.send') + def test_send_signal(self, mock): + sender = 'Test' + handling_method = 'Test' + signal_name = 'a' + + self.signals.register_signal(self.plugin_name, self.list_signal) + self.signals.send(signal_name, sender) + + args, kwargs = mock.call_args + + self.assertEqual(kwargs['sender'], sender) + self.assertTrue(mock.is_called) + + + -- libgit2 0.21.2