import abc from operator import attrgetter from commando.util import getLoggerWithNullHandler, load_python_object from hyde._compat import with_metaclass """ Contains abstract classes and utilities that help publishing a website to a server. """ class Publisher(with_metaclass(abc.ABCMeta)): """ The abstract base class for publishers. """ def __init__(self, site, settings, message): super(Publisher, self).__init__() self.logger = getLoggerWithNullHandler( 'hyde.engine.%s' % self.__class__.__name__) self.site = site self.message = message self.initialize(settings) @abc.abstractmethod def initialize(self, settings): pass @abc.abstractmethod def publish(self): if not self.site.config.deploy_root_path.exists: raise Exception("Please generate the site first") @staticmethod def load_publisher(site, publisher, message): logger = getLoggerWithNullHandler('hyde.engine.publisher') try: settings = attrgetter("publisher.%s" % publisher)(site.config) except AttributeError: settings = False if not settings: # Find the first configured publisher try: publisher = site.config.publisher.__dict__.iterkeys().next() logger.warning( "No default publisher configured. Using: %s" % publisher) settings = attrgetter("publisher.%s" % publisher)(site.config) except (AttributeError, StopIteration): logger.error( "Cannot find the publisher configuration: %s" % publisher) raise if not hasattr(settings, 'type'): logger.error( "Publisher type not specified: %s" % publisher) raise Exception("Please specify the publisher type in config.") pub_class = load_python_object(settings.type) return pub_class(site, settings, message)