Package turbomail :: Module control
[hide private]
[frames] | no frames]

Source Code for Module turbomail.control

  1  # encoding: utf-8 
  2   
  3  """TurboMail startup and shutdown interface. 
  4   
  5  To start and stop TurboMail in your own applications:: 
  6   
  7    import turbomail 
  8     
  9    turbomail.interface.config = {'mail.on': True, ...} 
 10    turbomail.interface.start() 
 11     
 12    message = turbomail.Message(...) 
 13    turbomail.interface.send(message) 
 14     
 15    turbomail.interface.stop() 
 16   
 17  Remember to configure your outbound settings in the config dictionary. 
 18   
 19  TurboMail will, by default, immediately delete any messages remaining in 
 20  the queue and wait on any in-progress deliveries. 
 21  """ 
 22   
 23   
 24  import logging 
 25  import warnings 
 26   
 27  import pkg_resources 
 28   
 29  from turbomail.exceptions import MailNotEnabledException 
 30   
 31   
 32  __all__ = ['extension'] 
 33   
 34  log = logging.getLogger("turbomail.control") 
 35   
 36   
 37   
38 -class ControlClass(object):
39 """Control TurboMail startup and shutdown.""" 40
41 - def __init__(self):
42 self.running = False 43 self._loaded_extensions = [] 44 self.config = dict() 45 self.manager = None
46
47 - def __load_single_entry(self, group, name):
48 for entrypoint in pkg_resources.iter_entry_points(group, name): 49 return entrypoint.load() 50 51 return None
52
53 - def _is_extension_enabled(self, extension_name):
54 config_name = "mail.%s.on" % extension_name 55 return self.config.get(config_name, False)
56
57 - def _initialize_extension(self, extension_name, extension):
58 log.info("Loading extension '%s'." % extension_name) 59 60 if hasattr(extension, 'interface'): 61 extension = extension.interface 62 63 elif hasattr(extension, 'load'): 64 extension = extension.load() 65 66 if hasattr(extension, 'start'): 67 extension.start() 68 69 self._loaded_extensions.append(extension)
70
72 extensions = pkg_resources.iter_entry_points("turbomail.extensions") 73 for entrypoint in extensions: 74 extension_name = entrypoint.name 75 log.debug("Found extension '%s'." % extension_name) 76 if self._is_extension_enabled(extension_name): 77 extension = entrypoint.load() 78 self._initialize_extension(extension_name, extension)
79
80 - def _initialize_extensions_from_dict(self, extra_classes):
81 for extension_name in extra_classes: 82 if self._is_extension_enabled(extension_name): 83 extension = extra_classes[extension_name] 84 self._initialize_extension(extension_name, extension)
85
86 - def initialize_enabled_extensions(self, extra_classes):
87 if extra_classes is None: 88 self._find_and_initialize_extensions_with_setuptools() 89 else: 90 self._initialize_extensions_from_dict(extra_classes)
91
92 - def start(self, config, extra_classes=None):
93 self.config = config 94 if not self.config.get("mail.on", False): 95 return 96 97 log.info("TurboMail extension starting up.") 98 99 def load(t, default, extra_classes): 100 extension = self.config.get("mail.%s" % t, default) 101 if extra_classes != None and extension in extra_classes: 102 controller = extra_classes[extension] 103 if isinstance(controller, type): 104 controller = controller() 105 else: 106 entry_point = "turbomail.%ss" % t 107 controller = self.__load_single_entry(entry_point, extension) 108 if not controller: 109 self.config.update({"mail.on": False}) 110 log.error("Unable to locate %s %s, TurboMail disabled." % (extension, t)) 111 self.stop(force=True) 112 return 113 setattr(self, t, controller) 114 if hasattr(getattr(self, t), 'load'): 115 setattr(self, t, getattr(self, t).load()) 116 if hasattr(getattr(self, t), 'start'): 117 getattr(self, t).start()
118 119 # Load the requested manager and transport. 120 load('manager', 'immediate', extra_classes) 121 load('transport', 'debug', extra_classes) 122 123 self.initialize_enabled_extensions(extra_classes) 124 self.running = True
125
126 - def _stop_all_loaded_extensions(self):
127 for extension in self._loaded_extensions: 128 if hasattr(extension, 'stop'): 129 extension.stop() 130 self._loaded_extensions = []
131
132 - def stop(self, force=False):
133 if not self.running and not force: 134 return 135 log.info("TurboMail extension shutting down.") 136 137 self._stop_all_loaded_extensions() 138 if self.manager and hasattr(self.manager, "stop"): 139 self.manager.stop() 140 self.manager = None 141 self.running = False
142
143 - def send(self, message):
144 if not self.manager: 145 raise MailNotEnabledException 146 if isinstance(message, dict): 147 from turbomail import WrappedMessage 148 text = 'Sending pre-generated messages in dicts is deprecated, ' + \ 149 'please use WrappedMessage instead.' 150 warnings.warn(text, category=DeprecationWarning) 151 message = WrappedMessage(message['sender'], message['recipients'], 152 message['message']) 153 return self.manager.deliver(message)
154 155 156 interface = ControlClass() 157