source: isenes/mpl_buildout/trunk/recipes/recipe.py @ 5435

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/isenes/mpl_buildout/trunk/recipes/recipe.py@5435
Revision 5435, 3.2 KB checked in by spascoe, 11 years ago (diff)

Work in progress

Line 
1# -*- coding: utf-8 -*-
2"""
3Courtesy of collective.recipe.buildbot.
4@author: Gael Pasgrimaud <gail.pasgrimaud@ingeniweb.com>
5@license: ZPL
6
7"""
8
9import os
10import sys
11import glob
12import shutil
13import virtualenv
14import subprocess
15from os.path import join
16from ConfigParser import ConfigParser
17
18class BaseRecipe(object):
19
20    config_dir = ''
21
22    def log(self, msg):
23        print msg
24
25    recipe_dir = os.path.dirname(__file__)
26
27    def __init__(self, buildout, name, options):
28        self.buildout, self.name, self.options = buildout, name, options
29        self.location = join(buildout['buildout']['parts-directory'], self.name)
30        dirname = join(self.buildout['buildout']['parts-directory'],
31                        self.config_dir or self.name)
32        if not os.path.isdir(dirname):
33            os.mkdir(dirname)
34
35    def create_virtualenv(self, location):
36        is_win = (sys.platform == 'win32')
37        is_cygwin = (sys.platform == 'cygwin')
38        executable = (is_win or is_cygwin) and 'python.exe' or 'python'
39        binFolder = is_win and 'Scripts' or 'bin'
40        binLocation = join(location, binFolder)
41
42        if is_cygwin:
43            # Virtualenv doesn't work on cygwin, but create a
44            # bin/python using the one of buildout
45            buildoutExecutable = self.buildout['buildout']['executable']
46            if not buildoutExecutable.endswith('exe'):
47                buildoutExecutable += '.exe'
48            unixBinLocation = join(location, 'bin')
49            if not os.path.isfile(join(unixBinLocation, executable)):
50                if not os.path.exists(unixBinLocation):
51                    os.mkdir(unixBinLocation)
52                os.symlink(buildoutExecutable,
53                           join(unixBinLocation, executable))
54        else:
55            old = sys.argv
56            try:
57                sys.argv = ['virtualenv', '--no-site-packages', location]
58                virtualenv.main()
59                if 'eggs' in self.options:
60                    eggs = [e for e in self.options['eggs'].split('\n') if e]
61                    subprocess.call([join(binLocation, 'easy_install'),] + eggs)
62            finally:
63                sys.argv = old
64
65        if is_win:
66            # On windows, add a bin/python
67            unixBinLocation = join(location, 'bin')
68            if not os.path.isfile(join(unixBinLocation, executable)):
69                pythons = glob.glob(join(binLocation, 'python*'))
70                if not os.path.exists(unixBinLocation):
71                    os.mkdir(unixBinLocation)
72                shutil.copyfile(pythons[0],
73                                join(unixBinLocation, executable))
74
75
76    def write_config(self, name, **kwargs):
77        config = ConfigParser()
78        for section, options in sorted(kwargs.items(), reverse=True):
79            config.add_section(section)
80            for key, value in sorted(options.items(), reverse=True):
81                config.set(section, key, value)
82        filename = join(self.buildout['buildout']['parts-directory'],
83                        self.config_dir or self.name, '%s.cfg' % name)
84        fd = open(filename, 'w')
85        config.write(fd)
86        fd.close()
87        self.log('Generated config %r.' % filename)
88        return filename
89
Note: See TracBrowser for help on using the repository browser.