Changeset 117
- Timestamp:
- 11/16/08 08:11:41 (2 months ago)
- Location:
- trunk
- Files:
-
- 10 modified
- 3 moved
-
setup.py (modified) (1 diff)
-
tests/test_custom_transport_injection.py (moved) (moved from trunk/tests/test_custom_provider_injection.py) (4 diffs)
-
tests/test_debug_transport.py (moved) (moved from trunk/tests/test_debug_provider.py) (4 diffs)
-
tests/test_tm2_compatibility.py (modified) (2 diffs)
-
turbomail/api.py (modified) (3 diffs)
-
turbomail/control.py (modified) (3 diffs)
-
turbomail/exceptions.py (modified) (2 diffs)
-
turbomail/managers/demand.py (modified) (3 diffs)
-
turbomail/managers/immediate.py (modified) (3 diffs)
-
turbomail/message.py (modified) (2 diffs)
-
turbomail/transports (moved) (moved from trunk/turbomail/providers)
-
turbomail/transports/debug.py (modified) (3 diffs)
-
turbomail/transports/smtp.py (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/setup.py
r110 r117 101 101 "immediate = turbomail.managers.immediate" 102 102 ], 103 'turbomail. providers': [104 "smtp = turbomail. providers.smtp",105 # "sendmail = turbomail. providers.sendmail"106 # "disk = turbomail. providers.disk",107 "debug = turbomail. providers.debug"103 'turbomail.transports': [ 104 "smtp = turbomail.transports.smtp", 105 # "sendmail = turbomail.transports.sendmail" 106 # "disk = turbomail.transports.disk", 107 "debug = turbomail.transports.debug" 108 108 ], 109 109 'turbomail.extensions': [ -
trunk/tests/test_custom_transport_injection.py
r108 r117 1 1 #!/usr/bin/env python 2 2 # -*- coding: UTF-8 -*- 3 '''Test the injection of custom TurboMail providers without setuptools.'''3 '''Test the injection of custom TurboMail transports without setuptools.''' 4 4 5 5 import logging 6 6 import unittest 7 7 8 from turbomail.api import Manager, Provider8 from turbomail.api import Manager, Transport 9 9 from turbomail.control import interface 10 10 from turbomail.message import Message … … 13 13 14 14 15 class Dummy Provider(Provider):15 class DummyTransport(Transport): 16 16 def deliver(self, message): 17 17 return True … … 23 23 24 24 25 class TestCustom ProviderInjection(unittest.TestCase):26 """Test the injection of custom TurboMail providers without setuptools."""25 class TestCustomTransportInjection(unittest.TestCase): 26 """Test the injection of custom TurboMail transports without setuptools.""" 27 27 28 28 def setUp(self): 29 29 self.manager = DummyManager() 30 self. provider = DummyProvider()30 self.transport = DummyTransport() 31 31 self.message = Message(author=("Author", "author@example.com"), 32 32 to=("Recipient", "recipient@example.com"), … … 39 39 interface.config = {'mail.on': False} 40 40 41 def test_provide_dict_with_additional_managers_and_ providers_which_overrides_setuptools(self):41 def test_provide_dict_with_additional_managers_and_transports_which_overrides_setuptools(self): 42 42 interface.config.update({'mail.manager': 'immediate', 43 'mail. provider': 'foo',})44 interface.start(extra_classes=dict(immediate=self.manager, foo=self. provider))43 'mail.transport': 'foo',}) 44 interface.start(extra_classes=dict(immediate=self.manager, foo=self.transport)) 45 45 self.assertEqual(self.manager, interface.manager) 46 self.assertEqual(self. provider, interface.provider)46 self.assertEqual(self.transport, interface.transport) 47 47 interface.send(self.message) 48 48 -
trunk/tests/test_debug_transport.py
r107 r117 1 1 #!/usr/bin/env python 2 2 # -*- coding: UTF-8 -*- 3 '''Test that the debug providerstores all "sent" mails.'''3 '''Test that the debug transport stores all "sent" mails.''' 4 4 5 5 import unittest … … 8 8 from turbomail.message import Message 9 9 from turbomail.managers.immediate import ImmediateManager 10 from turbomail. providers.debug import DebugProviderFactory10 from turbomail.transports.debug import DebugTransportFactory 11 11 12 class TestDebug ProviderStoresAllMail(unittest.TestCase):12 class TestDebugTransportStoresAllMail(unittest.TestCase): 13 13 14 14 def setUp(self): 15 15 interface.config = {'mail.on': True, 16 16 'mail.manager': 'immediate', 17 'mail. provider': 'debug',}17 'mail.transport': 'debug',} 18 18 # conciously using classes and instances for fake_setuptools so that 19 19 # the test also checks that TurboMail will do the right thing. 20 20 fake_setuptools = {'immediate': ImmediateManager, 21 'debug': Debug ProviderFactory()}21 'debug': DebugTransportFactory()} 22 22 interface.start(extra_classes=fake_setuptools) 23 23 self.msg = Message('foo@example.com', 'to@example.com', 'Test', … … 32 32 interface.send(self.msg) 33 33 34 stored_mails = interface.manager. provider.get_sent_mails()34 stored_mails = interface.manager.transport.get_sent_mails() 35 35 self.assertEqual(1, len(stored_mails)) 36 36 self.assertEqual(msg_string, str(stored_mails[0])) … … 40 40 self.msg.send() 41 41 42 stored_mails = interface.manager. provider.get_sent_mails()42 stored_mails = interface.manager.transport.get_sent_mails() 43 43 self.assertEqual(1, len(stored_mails)) 44 44 self.assertEqual(msg_string, str(stored_mails[0])) -
trunk/tests/test_tm2_compatibility.py
r113 r117 9 9 from turbomail import Message, MailNotEnabledException 10 10 from turbomail.managers.immediate import ImmediateManager 11 from turbomail. providers.debug import DebugProviderFactory11 from turbomail.transports.debug import DebugTransportFactory 12 12 13 13 class TestTurboMail2xCompatibility(unittest.TestCase): … … 58 58 turbomail.control.interface.config = {'mail.on': True} 59 59 fake_setuptools = {'immediate': ImmediateManager, 60 'debug': Debug ProviderFactory}60 'debug': DebugTransportFactory} 61 61 turbomail.control.interface.start(extra_classes=fake_setuptools) 62 62 -
trunk/turbomail/api.py
r116 r117 10 10 from turbomail.control import interface 11 11 12 __all__ = ['Extension', ' ProviderFactory', 'Provider', 'Manager']12 __all__ = ['Extension', 'TransportFactory', 'Transport', 'Manager'] 13 13 14 14 … … 35 35 36 36 37 class ProviderFactory(Extension):38 """docstring for ProviderFactory"""39 provider= None37 class TransportFactory(Extension): 38 """docstring for TransportFactory""" 39 transport = None 40 40 41 41 def __init__(self): 42 super( ProviderFactory, self).__init__()42 super(TransportFactory, self).__init__() 43 43 44 44 def new(self): 45 45 if not self.ready: return None 46 return self. provider()46 return self.transport() 47 47 48 48 49 class Provider(object):50 """A Providercan deliver messages towards their recipients with a specific49 class Transport(object): 50 """A Transport can deliver messages towards their recipients with a specific 51 51 method, e.g. SMTP. They don't care about delivery strategies like queing or 52 52 batch submission.""" 53 53 54 54 def __init__(self): 55 super( Provider, self).__init__()55 super(Transport, self).__init__() 56 56 57 57 def deliver(self, message): 58 raise NotImplementedError, " Providerplugin must override this method without inheritance."58 raise NotImplementedError, "Transport plugin must override this method without inheritance." 59 59 60 60 … … 85 85 86 86 def stop(self): 87 """Called by the manager before the providerinstance is destroyed. The88 providercan do some final cleanups (like releasing external resources)87 """Called by the manager before the transport instance is destroyed. The 88 transport can do some final cleanups (like releasing external resources) 89 89 here.""" 90 90 pass -
trunk/turbomail/control.py
r114 r117 46 46 self.config = dict() 47 47 self.manager = None 48 self. provider= None48 self.transport = None 49 49 50 50 def __load_single_entry(self, group, name): … … 79 79 getattr(self, t).start() 80 80 81 # Load the requested manager and provider.81 # Load the requested manager and transport. 82 82 load('manager', 'immediate', extra_classes) 83 load(' provider', 'debug', extra_classes)83 load('transport', 'debug', extra_classes) 84 84 85 85 # Load and initialize the various extensions. … … 116 116 if hasattr(ext, "stop"): ext.stop() 117 117 118 # Unload the providerand manager.119 if self. provider and hasattr(self.provider, "stop"): self.provider.stop()118 # Unload the transport and manager. 119 if self.transport and hasattr(self.transport, "stop"): self.transport.stop() 120 120 if self.manager and hasattr(self.manager, "stop"): self.manager.stop() 121 121 122 self. provider= None122 self.transport = None 123 123 self.manager = None 124 124 -
trunk/turbomail/exceptions.py
r113 r117 5 5 __version__ = "$Revision$" 6 6 __all__ = ['MailException', 'MailNotEnabledException', 'MailConfigurationException', 7 ' ProviderException', 'ProviderExhaustedException', 'ManagerException']7 'TransportException', 'TransportExhaustedException', 'ManagerException'] 8 8 9 9 … … 29 29 30 30 31 class ProviderException(MailException):32 """The base for all TurboMail Providerexceptions."""31 class TransportException(MailException): 32 """The base for all TurboMail Transport exceptions.""" 33 33 34 34 pass 35 35 36 36 37 class ProviderExhaustedException(MailException):37 class TransportExhaustedException(MailException): 38 38 """Attempted to use TurboMail before being enabled.""" 39 39 40 40 def __str__(self): 41 return "This Providerinstance is no longer capable of delivering mail."41 return "This Transport instance is no longer capable of delivering mail." 42 42 43 43 -
trunk/turbomail/managers/demand.py
r85 r117 10 10 from turbomail.exceptions import * 11 11 from turbomail.api import Manager 12 from turbomail.exceptions import ProviderExhaustedException12 from turbomail.exceptions import TransportExhaustedException 13 13 from turbomail.control import interface 14 14 … … 85 85 86 86 def worker(self): 87 log.debug("Requesting new providerinstance from.")88 provider = interface.provider.new()89 if not provider: raise ManagerException, "Unable to allocate new provider."87 log.debug("Requesting new transport instance from.") 88 transport = interface.transport.new() 89 if not transport: raise ManagerException, "Unable to allocate new transport." 90 90 91 91 while True: 92 92 try: 93 93 message = self.queue.get(True, self.timeout) 94 provider.deliver(message)94 transport.deliver(message) 95 95 96 96 except Empty: … … 98 98 break 99 99 100 except ProviderExhaustedException:101 log.debug("Worker death from providerexhaustion - spawning child.")100 except TransportExhaustedException: 101 log.debug("Worker death from transport exhaustion - spawning child.") 102 102 self.deliver(message) 103 103 self.spawn() -
trunk/turbomail/managers/immediate.py
r111 r117 10 10 from turbomail.api import Manager 11 11 from turbomail.control import interface 12 from turbomail.exceptions import ProviderExhaustedException12 from turbomail.exceptions import TransportExhaustedException 13 13 14 14 __all__ = ['load'] … … 29 29 super(ImmediateManager, self).__init__() 30 30 31 self. provider= None31 self.transport = None 32 32 33 33 log.info("Immediate manager ready.") … … 41 41 return False 42 42 43 if not self. provider:44 log.debug("Requesting new providerinstance.")45 self. provider = interface.provider.new()46 if not self. provider:47 raise ManagerException, "Unable to allocate new provider."43 if not self.transport: 44 log.debug("Requesting new transport instance.") 45 self.transport = interface.transport.new() 46 if not self.transport: 47 raise ManagerException, "Unable to allocate new transport." 48 48 49 49 try: 50 self. provider.deliver(message)50 self.transport.deliver(message) 51 51 52 except ProviderExhaustedException:53 log.debug(" Providerexhausted.")54 self. provider.stop()55 self. provider= None52 except TransportExhaustedException: 53 log.debug("Transport exhausted.") 54 self.transport.stop() 55 self.transport = None 56 56 self.deliver(message) 57 57 -
trunk/turbomail/message.py
r109 r117 96 96 97 97 # TODO: This parameter should be present in a base message class 98 # smtp providerassumes that all messages have it!98 # smtp transport assumes that all messages have it! 99 99 self.tries = kwpop("tries", "mail.tries", 3) 100 100 … … 234 234 headers.append(('X-TurboMail-Message-GUID', self.id)) 235 235 236 if interface. provider:236 if interface.transport: 237 237 headers.extend([ 238 ('X-TurboMail- Provider', "%s <%s>" % (interface.provider.name, interface.provider.url)),239 ('X-TurboMail- Provider-Version', interface.provider.version),238 ('X-TurboMail-Transport', "%s <%s>" % (interface.transport.name, interface.transport.url)), 239 ('X-TurboMail-Transport-Version', interface.transport.version), 240 240 ]) 241 241 -
trunk/turbomail/transports/debug.py
r104 r117 6 6 import logging 7 7 8 from turbomail.api import ProviderFactory, Provider8 from turbomail.api import TransportFactory, Transport 9 9 10 10 11 log = logging.getLogger("turbomail. provider")11 log = logging.getLogger("turbomail.transport") 12 12 deliverylog = logging.getLogger("turbomail.delivery") 13 13 … … 16 16 17 17 def load(): 18 return Debug ProviderFactory()18 return DebugTransportFactory() 19 19 20 20 21 class Debug Provider(Provider):21 class DebugTransport(Transport): 22 22 def __init__(self): 23 super(Debug Provider, self).__init__()24 log.debug("Debug providersetup.")23 super(DebugTransport, self).__init__() 24 log.debug("Debug transport setup.") 25 25 self._sent_mails = [] 26 26 27 27 def __del__(self): 28 28 if log: 29 log.debug("Debug providerteardown.")29 log.debug("Debug transport teardown.") 30 30 31 31 def deliver(self, message): … … 44 44 45 45 46 class Debug ProviderFactory(ProviderFactory):46 class DebugTransportFactory(TransportFactory): 47 47 name = "Debug" 48 48 version = "1.0" 49 url = "http://www.python-turbomail.org/wiki/Debug Provider"50 provider = DebugProvider49 url = "http://www.python-turbomail.org/wiki/DebugTransport" 50 transport = DebugTransport 51 51 -
trunk/turbomail/transports/smtp.py
r115 r117 7 7 import logging 8 8 9 log = logging.getLogger("turbomail. provider")9 log = logging.getLogger("turbomail.transport") 10 10 deliverylog = logging.getLogger("turbomail.delivery") 11 11 12 from turbomail.api import ProviderFactory, Provider13 from turbomail.exceptions import MailConfigurationException, ProviderExhaustedException12 from turbomail.api import TransportFactory, Transport 13 from turbomail.exceptions import MailConfigurationException, TransportExhaustedException 14 14 from turbomail.control import interface 15 15 … … 20 20 21 21 def load(): 22 return SMTP ProviderFactory()22 return SMTPTransportFactory() 23 23 24 24 25 class SMTP Provider(Provider):25 class SMTPTransport(Transport): 26 26 def __init__(self): 27 super(SMTP Provider, self).__init__()28 log.debug("SMTP Providercreated.")27 super(SMTPTransport, self).__init__() 28 log.debug("SMTPTransport created.") 29 29 30 30 self.server = self.config_get('mail.smtp.server', 'localhost') … … 76 76 77 77 if self.count == 0: 78 raise ProviderExhaustedException78 raise TransportExhaustedException 79 79 80 80 try: … … 94 94 95 95 except SMTPServerDisconnected, e: 96 raise ProviderExhaustedException96 raise TransportExhaustedException 97 97 98 98 except Exception, e: … … 112 112 113 113 114 class SMTP ProviderFactory(ProviderFactory):114 class SMTPTransportFactory(TransportFactory): 115 115 name = "SMTP" 116 116 version = "1.0" 117 url = "http://www.python-turbomail.org/wiki/SMTP Provider"118 provider = SMTPProvider117 url = "http://www.python-turbomail.org/wiki/SMTPTransport" 118 transport = SMTPTransport
