~schooltool-owners/schooltool.gradebook/flourish

2 by ignas
Initial commit for schooltool.gradebook
1
##############################################################################
2
#
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
3
# Copyright (c) 2006 Zope Foundation and Contributors.
2 by ignas
Initial commit for schooltool.gradebook
4
# All Rights Reserved.
5
#
6
# This software is subject to the provisions of the Zope Public License,
7
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
8
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
9
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
10
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
11
# FOR A PARTICULAR PURPOSE.
12
#
13
##############################################################################
14
"""Bootstrap a buildout-based project
15
16
Simply run this script in a directory containing a buildout.cfg.
17
The script accepts buildout command-line options, so you can
18
use the -c option to specify an alternate configuration file.
19
"""
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
20
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
21
import os, shutil, sys, tempfile, urllib, urllib2, subprocess
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
22
from optparse import OptionParser
23
24
if sys.platform == 'win32':
25
    def quote(c):
26
        if ' ' in c:
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
27
            return '"%s"' % c  # work around spawn lamosity on windows
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
28
        else:
29
            return c
30
else:
31
    quote = str
32
33
# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments.
34
stdout, stderr = subprocess.Popen(
35
    [sys.executable, '-Sc',
36
     'try:\n'
37
     '    import ConfigParser\n'
38
     'except ImportError:\n'
39
     '    print 1\n'
40
     'else:\n'
41
     '    print 0\n'],
42
    stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
43
has_broken_dash_S = bool(int(stdout.strip()))
44
45
# In order to be more robust in the face of system Pythons, we want to
46
# run without site-packages loaded.  This is somewhat tricky, in
47
# particular because Python 2.6's distutils imports site, so starting
48
# with the -S flag is not sufficient.  However, we'll start with that:
49
if not has_broken_dash_S and 'site' in sys.modules:
50
    # We will restart with python -S.
51
    args = sys.argv[:]
52
    args[0:0] = [sys.executable, '-S']
53
    args = map(quote, args)
54
    os.execv(sys.executable, args)
55
# Now we are running with -S.  We'll get the clean sys.path, import site
56
# because distutils will do it later, and then reset the path and clean
57
# out any namespace packages from site-packages that might have been
58
# loaded by .pth files.
59
clean_path = sys.path[:]
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
60
import site  # imported because of its side effects
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
61
sys.path[:] = clean_path
62
for k, v in sys.modules.items():
63
    if k in ('setuptools', 'pkg_resources') or (
64
        hasattr(v, '__path__') and
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
65
        len(v.__path__) == 1 and
66
        not os.path.exists(os.path.join(v.__path__[0], '__init__.py'))):
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
67
        # This is a namespace package.  Remove it.
68
        sys.modules.pop(k)
69
70
is_jython = sys.platform.startswith('java')
71
72
setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py'
73
distribute_source = 'http://python-distribute.org/distribute_setup.py'
74
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
75
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
76
# parsing arguments
77
def normalize_to_url(option, opt_str, value, parser):
78
    if value:
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
79
        if '://' not in value:  # It doesn't smell like a URL.
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
80
            value = 'file://%s' % (
81
                urllib.pathname2url(
82
                    os.path.abspath(os.path.expanduser(value))),)
83
        if opt_str == '--download-base' and not value.endswith('/'):
84
            # Download base needs a trailing slash to make the world happy.
85
            value += '/'
86
    else:
87
        value = None
88
    name = opt_str[2:].replace('-', '_')
89
    setattr(parser.values, name, value)
90
91
usage = '''\
92
[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
93
94
Bootstraps a buildout-based project.
95
96
Simply run this script in a directory containing a buildout.cfg, using the
97
Python that you want bin/buildout to use.
98
99
Note that by using --setup-source and --download-base to point to
100
local resources, you can keep this script from going over the network.
101
'''
102
103
parser = OptionParser(usage=usage)
104
parser.add_option("-v", "--version", dest="version",
105
                          help="use a specific zc.buildout version")
106
parser.add_option("-d", "--distribute",
107
                   action="store_true", dest="use_distribute", default=False,
108
                   help="Use Distribute rather than Setuptools.")
109
parser.add_option("--setup-source", action="callback", dest="setup_source",
110
                  callback=normalize_to_url, nargs=1, type="string",
111
                  help=("Specify a URL or file location for the setup file. "
112
                        "If you use Setuptools, this will default to " +
113
                        setuptools_source + "; if you use Distribute, this "
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
114
                        "will default to " + distribute_source + "."))
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
115
parser.add_option("--download-base", action="callback", dest="download_base",
116
                  callback=normalize_to_url, nargs=1, type="string",
117
                  help=("Specify a URL or directory for downloading "
118
                        "zc.buildout and either Setuptools or Distribute. "
119
                        "Defaults to PyPI."))
120
parser.add_option("--eggs",
121
                  help=("Specify a directory for storing eggs.  Defaults to "
122
                        "a temporary directory that is deleted when the "
123
                        "bootstrap script completes."))
124
parser.add_option("-t", "--accept-buildout-test-releases",
125
                  dest='accept_buildout_test_releases',
126
                  action="store_true", default=False,
127
                  help=("Normally, if you do not specify a --version, the "
128
                        "bootstrap script and buildout gets the newest "
129
                        "*final* versions of zc.buildout and its recipes and "
130
                        "extensions for you.  If you use this flag, "
131
                        "bootstrap and buildout will get the newest releases "
132
                        "even if they are alphas or betas."))
133
parser.add_option("-c", None, action="store", dest="config_file",
134
                   help=("Specify the path to the buildout configuration "
135
                         "file to be used."))
136
137
options, args = parser.parse_args()
138
139
if options.eggs:
140
    eggs_dir = os.path.abspath(os.path.expanduser(options.eggs))
141
else:
142
    eggs_dir = tempfile.mkdtemp()
143
144
if options.setup_source is None:
145
    if options.use_distribute:
146
        options.setup_source = distribute_source
147
    else:
148
        options.setup_source = setuptools_source
149
150
if options.accept_buildout_test_releases:
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
151
    args.insert(0, 'buildout:accept-buildout-test-releases=true')
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
152
153
try:
154
    import pkg_resources
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
155
    import setuptools  # A flag.  Sometimes pkg_resources is installed alone.
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
156
    if not hasattr(pkg_resources, '_distribute'):
157
        raise ImportError
158
except ImportError:
159
    ez_code = urllib2.urlopen(
160
        options.setup_source).read().replace('\r\n', '\n')
2 by ignas
Initial commit for schooltool.gradebook
161
    ez = {}
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
162
    exec ez_code in ez
163
    setup_args = dict(to_dir=eggs_dir, download_delay=0)
164
    if options.download_base:
165
        setup_args['download_base'] = options.download_base
166
    if options.use_distribute:
167
        setup_args['no_fake'] = True
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
168
        if sys.version_info[:2] == (2, 4):
169
            setup_args['version'] = '0.6.32'
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
170
    ez['use_setuptools'](**setup_args)
171
    if 'pkg_resources' in sys.modules:
172
        reload(sys.modules['pkg_resources'])
2 by ignas
Initial commit for schooltool.gradebook
173
    import pkg_resources
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
174
    # This does not (always?) update the default working set.  We will
175
    # do it.
176
    for path in sys.path:
177
        if path not in pkg_resources.working_set.entries:
178
            pkg_resources.working_set.add_entry(path)
179
180
cmd = [quote(sys.executable),
181
       '-c',
182
       quote('from setuptools.command.easy_install import main; main()'),
183
       '-mqNxd',
184
       quote(eggs_dir)]
185
186
if not has_broken_dash_S:
187
    cmd.insert(1, '-S')
188
189
find_links = options.download_base
190
if not find_links:
191
    find_links = os.environ.get('bootstrap-testing-find-links')
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
192
if not find_links and options.accept_buildout_test_releases:
193
    find_links = 'http://downloads.buildout.org/'
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
194
if find_links:
195
    cmd.extend(['-f', quote(find_links)])
196
197
if options.use_distribute:
198
    setup_requirement = 'distribute'
199
else:
200
    setup_requirement = 'setuptools'
201
ws = pkg_resources.working_set
202
setup_requirement_path = ws.find(
203
    pkg_resources.Requirement.parse(setup_requirement)).location
204
env = dict(
205
    os.environ,
206
    PYTHONPATH=setup_requirement_path)
207
208
requirement = 'zc.buildout'
209
version = options.version
210
if version is None and not options.accept_buildout_test_releases:
211
    # Figure out the most recent final version of zc.buildout.
212
    import setuptools.package_index
213
    _final_parts = '*final-', '*final'
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
214
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
215
    def _final_version(parsed_version):
216
        for part in parsed_version:
217
            if (part[:1] == '*') and (part not in _final_parts):
218
                return False
219
        return True
220
    index = setuptools.package_index.PackageIndex(
221
        search_path=[setup_requirement_path])
222
    if find_links:
223
        index.add_find_links((find_links,))
224
    req = pkg_resources.Requirement.parse(requirement)
225
    if index.obtain(req) is not None:
226
        best = []
227
        bestv = None
228
        for dist in index[req.project_name]:
229
            distv = dist.parsed_version
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
230
            if distv >= pkg_resources.parse_version('2dev'):
231
                continue
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
232
            if _final_version(distv):
233
                if bestv is None or distv > bestv:
234
                    best = [dist]
235
                    bestv = distv
236
                elif distv == bestv:
237
                    best.append(dist)
238
        if best:
239
            best.sort()
240
            version = best[-1].version
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
241
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
242
if version:
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
243
    requirement += '=='+version
244
else:
245
    requirement += '<2dev'
246
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
247
cmd.append(requirement)
248
249
if is_jython:
250
    import subprocess
251
    exitcode = subprocess.Popen(cmd, env=env).wait()
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
252
else:  # Windows prefers this, apparently; otherwise we would prefer subprocess
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
253
    exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env]))
254
if exitcode != 0:
255
    sys.stdout.flush()
256
    sys.stderr.flush()
257
    print ("An error occurred when trying to install zc.buildout. "
258
           "Look above this message for any errors that "
259
           "were output by easy_install.")
260
    sys.exit(exitcode)
261
262
ws.add_entry(eggs_dir)
263
ws.require(requirement)
264
import zc.buildout.buildout
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
265
266
# If there isn't already a command in the args, add bootstrap
267
if not [a for a in args if '=' not in a]:
268
    args.append('bootstrap')
269
270
271
# if -c was provided, we push it back into args for buildout's main function
272
if options.config_file is not None:
273
    args[0:0] = ['-c', options.config_file]
274
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
275
zc.buildout.buildout.main(args)
546 by Gediminas Paulauskas
Local buildout.cfg and other build improvements
276
if not options.eggs:  # clean up temporary egg directory
255.3.23 by Gediminas Paulauskas
Make sandbox with virtualenv, and other build improvements
277
    shutil.rmtree(eggs_dir)