view buttercup/buttercup.py @ 50:0c66ca55e336

reflect move to http://k0s.org/hg/toolbox/
author Jeff Hammel <k0scist@gmail.com>
date Sun, 11 May 2014 09:10:29 -0700
parents e3770a2530ff
children b717de8b384f
line wrap: on
line source

"""
the flower blooming to k0s.org
"""

import os
import source
from subprocess import check_call as call


__all__ = ['Buttercup', 'SetupError']


class SetupError(Exception):
    """error during setup"""

    def __init__(self, message, directory, uri=None):
        self.directory = os.path.abspath(directory)
        self.uri = uri
        _message = "Error setting up '{}'".format(directory)
        if uri:
            _message += " (from {})".format(uri)
        _message += "\n  {}".format(message)
        Exception.__init__(self, _message)


class Buttercup(object):
    """k0sware software"""

    HG='http://k0s.org/hg'
    PACKAGES=['bitsyapps',
              'bitsyauth',
              'bitsyblog',
              'bitsytweet',
              'buttercup',
              'clwapp',
              'commentator',
              'contenttransformer',
              'cropresize',
              'decoupage',
              'emaildispatcher',
              'genshi_view',
              'hgpaste',
              'lxmlmiddleware',
              'martINI',
              'montage',
              'pyloader',
              'redirector',
              'relocator',
              'svgsitemap',
              'toolbox',
              'uploader',
              'webob_view',
              'wordstream',
              'wsgintegrate']

    def __init__(self, srcdir):
        self.srcdir = srcdir

        # TODO: this should all go in a `pip` requirements file

        # base webapps and dependencies
        self.sources = {'hg': ['%s/%s' % (self.HG, package)
                               for package in self.PACKAGES ]}
        self.sources['git'] = []


    def install(self):
        """install all software needed for this flower"""
        source_objs = source.sources(self.sources, srcdir=self.srcdir)
        for source_obj in source_objs:
            source_obj() # clone/update the software

    def setup(self, source_objs=None):
        """setup python packages for development"""
        if source_objs is None:
            source_objs = source.sources(self.sources, srcdir=self.srcdir)
        for source_obj in source_objs:
            directory = source_obj.directory()
            if os.path.exists(os.path.join(directory, 'setup.py')):
                try:
                    call(['python', 'setup.py', 'develop'], cwd=source_obj.directory())
                except Exception as e:
                    raise SetupError(str(e), directory, source_obj.uri)

    def deploy(self):
        self.install()
        self.setup()

    __call__ = deploy