Mercurial > kallithea
annotate ez_setup.py @ 4219:24498ba2fbec kallithea-2.2.5-rebrand
SETTINGS_PREFIX for identifiers (e.g., db table names) incl. project's name.
kallithea.SETTINGS_PREFIX is a variable string used as a prefix for specific
external identifiers, such as database table names (and likely later form
fields), so that the name of the project need not necessarily be encoded into
data.
This setting is configurable so that compatibility with old, similar
databases can be maintained at the users' request.
author | Bradley M. Kuhn <bkuhn@sfconservancy.org> |
---|---|
date | Fri, 23 May 2014 17:36:09 -0400 |
parents | bf263968da47 |
children |
rev | line source |
---|---|
0 | 1 #!python |
2 """Bootstrap setuptools installation | |
3 | |
4 If you want to use setuptools in your package's setup.py, just include this | |
5 file in the same directory with it, and add this to the top of your setup.py:: | |
6 | |
7 from ez_setup import use_setuptools | |
8 use_setuptools() | |
9 | |
10 If you want to require a specific version of setuptools, set a download | |
11 mirror, or use an alternate download directory, you can do so by supplying | |
12 the appropriate options to ``use_setuptools()``. | |
13 | |
14 This file can also be run as a script to install or upgrade setuptools. | |
15 """ | |
16 import sys | |
17 DEFAULT_VERSION = "0.6c9" | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
18 DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" \ |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
19 % sys.version[:3] |
0 | 20 |
21 md5_data = { | |
22 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', | |
23 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', | |
24 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', | |
25 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', | |
26 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', | |
27 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', | |
28 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', | |
29 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', | |
30 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', | |
31 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', | |
32 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27', | |
33 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277', | |
34 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa', | |
35 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', | |
36 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', | |
37 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f', | |
38 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2', | |
39 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc', | |
40 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167', | |
41 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64', | |
42 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d', | |
43 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20', | |
44 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab', | |
45 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53', | |
46 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2', | |
47 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e', | |
48 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372', | |
49 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902', | |
50 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de', | |
51 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b', | |
52 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03', | |
53 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a', | |
54 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6', | |
55 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a', | |
56 } | |
57 | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
58 import os |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
59 |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
60 try: |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
61 from hashlib import md5 |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
62 except ImportError: |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
63 from md5 import md5 |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
64 |
0 | 65 |
66 def _validate_md5(egg_name, data): | |
67 if egg_name in md5_data: | |
68 digest = md5(data).hexdigest() | |
69 if digest != md5_data[egg_name]: | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
70 print >> sys.stderr, ( |
0 | 71 "md5 validation of %s failed! (Possible download problem?)" |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
72 % egg_name) |
0 | 73 sys.exit(2) |
74 return data | |
75 | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
76 |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
77 def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
78 to_dir=os.curdir, download_delay=15): |
0 | 79 """Automatically find/download setuptools and make it available on sys.path |
80 | |
81 `version` should be a valid setuptools version number that is available | |
82 as an egg for download under the `download_base` URL (which should end with | |
83 a '/'). `to_dir` is the directory where setuptools will be downloaded, if | |
84 it is not already available. If `download_delay` is specified, it should | |
85 be the number of seconds that will be paused before initiating a download, | |
86 should one be required. If an older version of setuptools is installed, | |
87 this routine will print a message to ``sys.stderr`` and raise SystemExit in | |
88 an attempt to abort the calling script. | |
89 """ | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
90 was_imported = 'pkg_resources' in sys.modules or ('setuptools' in |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
91 sys.modules) |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
92 |
0 | 93 def do_download(): |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
94 egg = download_setuptools(version, download_base, to_dir, |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
95 download_delay) |
0 | 96 sys.path.insert(0, egg) |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
97 import setuptools |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
98 setuptools.bootstrap_install_from = egg |
0 | 99 try: |
100 import pkg_resources | |
101 except ImportError: | |
1203
6832ef664673
source code cleanup: remove trailing white space, normalize file endings
Marcin Kuzminski <marcin@python-works.com>
parents:
0
diff
changeset
|
102 return do_download() |
0 | 103 try: |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
104 pkg_resources.require("setuptools>=" + version) |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
105 return |
0 | 106 except pkg_resources.VersionConflict, e: |
107 if was_imported: | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
108 print >> sys.stderr, ( |
0 | 109 "The required version of setuptools (>=%s) is not available, and\n" |
110 "can't be installed while this script is running. Please install\n" | |
111 " a more recent version first, using 'easy_install -U setuptools'." | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
112 "\n\n(Currently using %r)") % (version, e.args[0]) |
0 | 113 sys.exit(2) |
114 else: | |
115 del pkg_resources, sys.modules['pkg_resources'] # reload ok | |
116 return do_download() | |
117 except pkg_resources.DistributionNotFound: | |
118 return do_download() | |
119 | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
120 |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
121 def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
122 to_dir=os.curdir, delay=15): |
0 | 123 """Download setuptools from a specified location and return its filename |
124 | |
125 `version` should be a valid setuptools version number that is available | |
126 as an egg for download under the `download_base` URL (which should end | |
127 with a '/'). `to_dir` is the directory where the egg will be downloaded. | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
128 `delay` is the number of seconds to pause before an actual download |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
129 attempt. |
0 | 130 """ |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
131 import urllib2 |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
132 |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
133 egg_name = "setuptools-%s-py%s.egg" % (version, sys.version[:3]) |
0 | 134 url = download_base + egg_name |
135 saveto = os.path.join(to_dir, egg_name) | |
136 src = dst = None | |
137 if not os.path.exists(saveto): # Avoid repeated downloads | |
138 try: | |
139 from distutils import log | |
140 if delay: | |
141 log.warn(""" | |
142 --------------------------------------------------------------------------- | |
143 This script requires setuptools version %s to run (even to display | |
144 help). I will attempt to download it for you (from | |
145 %s), but | |
146 you may need to enable firewall access for this script first. | |
147 I will start the download in %d seconds. | |
148 | |
149 (Note: if this machine does not have network access, please obtain the file | |
150 | |
151 %s | |
152 | |
153 and place it in this directory before rerunning this script.) | |
154 ---------------------------------------------------------------------------""", | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
155 version, download_base, delay, url) |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
156 from time import sleep |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
157 sleep(delay) |
0 | 158 log.warn("Downloading %s", url) |
159 src = urllib2.urlopen(url) | |
160 # Read/write all in one block, so we don't create a corrupt file | |
161 # if the download is interrupted. | |
162 data = _validate_md5(egg_name, src.read()) | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
163 dst = open(saveto, "wb") |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
164 dst.write(data) |
0 | 165 finally: |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
166 if src: |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
167 src.close() |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
168 if dst: |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
169 dst.close() |
0 | 170 return os.path.realpath(saveto) |
171 | |
172 | |
173 def main(argv, version=DEFAULT_VERSION): | |
174 """Install or upgrade setuptools and EasyInstall""" | |
175 try: | |
176 import setuptools | |
177 except ImportError: | |
178 egg = None | |
179 try: | |
180 egg = download_setuptools(version, delay=0) | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
181 sys.path.insert(0, egg) |
0 | 182 from setuptools.command.easy_install import main |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
183 return main(list(argv) + [egg]) # we're done here |
0 | 184 finally: |
185 if egg and os.path.exists(egg): | |
186 os.unlink(egg) | |
187 else: | |
188 if setuptools.__version__ == '0.0.1': | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
189 print >> sys.stderr, ( |
0 | 190 "You have an obsolete version of setuptools installed. Please\n" |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
191 "remove it from your system entirely before rerunning" |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
192 " this script.") |
0 | 193 sys.exit(2) |
194 | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
195 req = "setuptools>=" + version |
0 | 196 import pkg_resources |
197 try: | |
198 pkg_resources.require(req) | |
199 except pkg_resources.VersionConflict: | |
200 try: | |
201 from setuptools.command.easy_install import main | |
202 except ImportError: | |
203 from easy_install import main | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
204 main(list(argv) + [download_setuptools(delay=0)]) |
0 | 205 sys.exit(0) # try to force an exit |
206 else: | |
207 if argv: | |
208 from setuptools.command.easy_install import main | |
209 main(argv) | |
210 else: | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
211 print "Setuptools version", version, "or greater has been installed." |
0 | 212 print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' |
213 | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
214 |
0 | 215 def update_md5(filenames): |
216 """Update our built-in md5 registry""" | |
217 | |
218 import re | |
219 | |
220 for name in filenames: | |
221 base = os.path.basename(name) | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
222 f = open(name, 'rb') |
0 | 223 md5_data[base] = md5(f.read()).hexdigest() |
224 f.close() | |
225 | |
226 data = [" %r: %r,\n" % it for it in md5_data.items()] | |
227 data.sort() | |
228 repl = "".join(data) | |
229 | |
230 import inspect | |
231 srcfile = inspect.getsourcefile(sys.modules[__name__]) | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
232 f = open(srcfile, 'rb') |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
233 src = f.read() |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
234 f.close() |
0 | 235 |
236 match = re.search("\nmd5_data = {\n([^}]+)}", src) | |
237 if not match: | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
238 print >> sys.stderr, "Internal error!" |
0 | 239 sys.exit(2) |
240 | |
241 src = src[:match.start(1)] + repl + src[match.end(1):] | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
242 f = open(srcfile, 'w') |
0 | 243 f.write(src) |
244 f.close() | |
245 | |
246 | |
1204
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
247 if __name__ == '__main__': |
faf31099a70a
pep8ify root py files
Marcin Kuzminski <marcin@python-works.com>
parents:
1203
diff
changeset
|
248 if len(sys.argv) > 2 and sys.argv[1] == '--md5update': |
0 | 249 update_md5(sys.argv[2:]) |
250 else: | |
251 main(sys.argv[1:]) |