diff options
Diffstat (limited to 'src/mailman/styles/manager.py')
| -rw-r--r-- | src/mailman/styles/manager.py | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/mailman/styles/manager.py b/src/mailman/styles/manager.py new file mode 100644 index 000000000..cf3d07711 --- /dev/null +++ b/src/mailman/styles/manager.py @@ -0,0 +1,94 @@ +# Copyright (C) 2007-2009 by the Free Software Foundation, Inc. +# +# This file is part of GNU Mailman. +# +# GNU Mailman is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# +# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along with +# GNU Mailman. If not, see <http://www.gnu.org/licenses/>. + +"""Style manager.""" + +from __future__ import absolute_import, unicode_literals + +__metaclass__ = type +__all__ = [ + 'StyleManager', + ] + + +import sys + +from operator import attrgetter +from zope.interface import implements +from zope.interface.verify import verifyObject + +from mailman.interfaces.styles import ( + DuplicateStyleError, IStyle, IStyleManager) + + + +class StyleManager: + """The built-in style manager.""" + + implements(IStyleManager) + + def __init__(self): + """Install all styles from the configuration files.""" + self._styles = {} + + def populate(self): + self._styles.clear() + # Avoid circular imports. + from mailman.config import config + # Install all the styles described by the configuration files. + for section in config.style_configs: + class_path = section['class'] + module_name, class_name = class_path.rsplit('.', 1) + __import__(module_name) + style = getattr(sys.modules[module_name], class_name)() + assert section.name.startswith('style'), ( + 'Bad style section name: %s' % section.name) + style.name = section.name[6:] + style.priority = int(section.priority) + self.register(style) + + def get(self, name): + """See `IStyleManager`.""" + return self._styles.get(name) + + def lookup(self, mailing_list): + """See `IStyleManager`.""" + matched_styles = [] + for style in self.styles: + style.match(mailing_list, matched_styles) + for style in matched_styles: + yield style + + @property + def styles(self): + """See `IStyleManager`.""" + for style in sorted(self._styles.values(), + key=attrgetter('priority'), + reverse=True): + yield style + + def register(self, style): + """See `IStyleManager`.""" + verifyObject(IStyle, style) + if style.name in self._styles: + raise DuplicateStyleError(style.name) + self._styles[style.name] = style + + def unregister(self, style): + """See `IStyleManager`.""" + # Let KeyErrors percolate up. + del self._styles[style.name] |
