Merge lp:~cjwatson/storm/tox into lp:storm

Proposed by Colin Watson
Status: Merged
Merged at revision: 490
Proposed branch: lp:~cjwatson/storm/tox
Merge into: lp:storm
Diff against target: 483 lines (+51/-323)
8 files modified
.bzrignore (+1/-0)
MANIFEST.in (+1/-1)
Makefile (+4/-13)
NEWS (+1/-0)
dev/ubuntu-deps (+4/-1)
ez_setup.py (+0/-284)
setup.py (+25/-24)
tox.ini (+15/-0)
To merge this branch: bzr merge lp:~cjwatson/storm/tox
Reviewer Review Type Date Requested Status
Simon Poirier (community) Approve
Review via email: mp+368142@code.launchpad.net

Commit message

Add tox testing support.

Description of the change

My goal here is to make it easier to test with various versions of dependencies, and in particular to make it easier to test with multiple Python versions in order to facilitate a port to Python 3.

This has IMO already pulled its weight by uncovering https://code.launchpad.net/~cjwatson/storm/transaction-2.4.0/+merge/368072. I haven't made that a formal prerequisite, but it or something like it should be merged before this.

To post a comment you must log in.
Revision history for this message
Simon Poirier (simpoir) wrote :

I"m generally ok with this change, but I do get some failures when running test under tox+py27 vs py27 on a fresh container. Am I missing something or will this be in a follow-up branch?

review: Needs Information
Revision history for this message
Colin Watson (cjwatson) wrote :

What failures do you see? I have a couple of associated MPs that fix some failures, but I'd need to know details of your problems to tell whether they're relevant.

Revision history for this message
Simon Poirier (simpoir) wrote :

checked with the other branches +1

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file '.bzrignore'
--- .bzrignore 2011-10-18 11:20:25 +0000
+++ .bzrignore 2019-05-30 13:25:31 +0000
@@ -10,6 +10,7 @@
10debian/python-storm.prerm.debhelper10debian/python-storm.prerm.debhelper
11debian/python-storm.substvars11debian/python-storm.substvars
12apidoc12apidoc
13.tox
13_trial_temp14_trial_temp
14*.egg15*.egg
15TAGS16TAGS
1617
=== modified file 'MANIFEST.in'
--- MANIFEST.in 2011-10-25 10:47:06 +0000
+++ MANIFEST.in 2019-05-30 13:25:31 +0000
@@ -1,4 +1,4 @@
1recursive-include storm *.py *.c *.zcml1recursive-include storm *.py *.c *.zcml
2recursive-include tests *.py *.txt2recursive-include tests *.py *.txt
33
4include MANIFEST.in LICENSE README TODO NEWS Makefile setup.cfg test ez_setup.py4include MANIFEST.in LICENSE README TODO NEWS Makefile setup.cfg test tox.ini
55
=== modified file 'Makefile'
--- Makefile 2016-03-10 12:04:01 +0000
+++ Makefile 2019-05-30 13:25:31 +0000
@@ -1,15 +1,8 @@
1PYTHON ?= python1PYTHON ?= python
2PYDOCTOR ?= pydoctor2PYDOCTOR ?= pydoctor
3PGPORT ?= 5432
43
5TEST_COMMAND = $(PYTHON) setup.py test4TEST_COMMAND = $(PYTHON) setup.py test
65
7STORM_POSTGRES_URI = postgres:storm_test
8STORM_POSTGRES_HOST_URI = postgres://localhost:$(PGPORT)/storm_test
9
10export STORM_POSTGRES_URI
11export STORM_POSTGRES_HOST_URI
12
13all: build6all: build
147
15build:8build:
@@ -19,13 +12,10 @@
19 $(TEST_COMMAND) --quiet --dry-run12 $(TEST_COMMAND) --quiet --dry-run
2013
21check:14check:
22 @ # Run the tests once with C extensions and once without them.15 tox
23 STORM_CEXTENSIONS=0 $(TEST_COMMAND)
24 STORM_CEXTENSIONS=1 $(TEST_COMMAND)
2516
26check-with-trial: develop17check-with-trial:
27 STORM_TEST_RUNNER=trial STORM_CEXTENSIONS=0 $(PYTHON) test18 STORM_TEST_RUNNER=trial tox
28 STORM_TEST_RUNNER=trial STORM_CEXTENSIONS=1 $(PYTHON) test
2919
30doc:20doc:
31 $(PYDOCTOR) --make-html --html-output apidoc --add-package storm21 $(PYDOCTOR) --make-html --html-output apidoc --add-package storm
@@ -41,6 +31,7 @@
41 rm -rf debian/files31 rm -rf debian/files
42 rm -rf debian/python-storm32 rm -rf debian/python-storm
43 rm -rf debian/python-storm.*33 rm -rf debian/python-storm.*
34 rm -rf .tox
44 rm -rf *.egg35 rm -rf *.egg
45 rm -rf _trial_temp36 rm -rf _trial_temp
46 find . -name "*.so" -type f -exec rm -f {} \;37 find . -name "*.so" -type f -exec rm -f {} \;
4738
=== modified file 'NEWS'
--- NEWS 2016-03-01 13:09:28 +0000
+++ NEWS 2019-05-30 13:25:31 +0000
@@ -7,6 +7,7 @@
7- A new storm.schema.sharding.Sharding class has been added to the schema7- A new storm.schema.sharding.Sharding class has been added to the schema
8 package, which can apply patches "in parallel" against a set of stores. See8 package, which can apply patches "in parallel" against a set of stores. See
9 the module docstring for more information.9 the module docstring for more information.
10- Added tox testing support.
1011
11Bug fixes12Bug fixes
12---------13---------
1314
=== modified file 'dev/ubuntu-deps'
--- dev/ubuntu-deps 2016-03-10 12:04:01 +0000
+++ dev/ubuntu-deps 2019-05-30 13:25:31 +0000
@@ -8,7 +8,9 @@
8apt_get install --no-install-recommends \8apt_get install --no-install-recommends \
9 postgresql \9 postgresql \
10 pgbouncer \10 pgbouncer \
11 libpq-dev \
11 build-essential \12 build-essential \
13 python-dev \
12 python-fixtures \14 python-fixtures \
13 python-psycopg2 \15 python-psycopg2 \
14 python-testresources \16 python-testresources \
@@ -16,7 +18,8 @@
16 python-twisted \18 python-twisted \
17 python-zope.component \19 python-zope.component \
18 python-zope.security \20 python-zope.security \
19 python-setuptools21 python-setuptools \
22 tox
2023
2124
22echo " * All Done!"25echo " * All Done!"
2326
=== removed file 'ez_setup.py'
--- ez_setup.py 2011-10-18 13:59:56 +0000
+++ ez_setup.py 1970-01-01 00:00:00 +0000
@@ -1,284 +0,0 @@
1#!python
2"""Bootstrap setuptools installation
3
4If you want to use setuptools in your package's setup.py, just include this
5file 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
10If you want to require a specific version of setuptools, set a download
11mirror, or use an alternate download directory, you can do so by supplying
12the appropriate options to ``use_setuptools()``.
13
14This file can also be run as a script to install or upgrade setuptools.
15"""
16import sys
17DEFAULT_VERSION = "0.6c11"
18DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
19
20md5_data = {
21 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
22 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
23 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
24 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
25 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
26 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
27 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
28 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
29 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
30 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
31 'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090',
32 'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4',
33 'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7',
34 'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5',
35 'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de',
36 'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b',
37 'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2',
38 'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086',
39 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
40 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
41 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
42 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
43 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
44 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
45 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
46 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
47 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
48 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
49 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
50 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
51 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
52 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
53 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
54 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
55 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
56 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
57 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
58 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
59 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
60 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
61 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
62 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
63}
64
65import sys, os
66try: from hashlib import md5
67except ImportError: from md5 import md5
68
69def _validate_md5(egg_name, data):
70 if egg_name in md5_data:
71 digest = md5(data).hexdigest()
72 if digest != md5_data[egg_name]:
73 print >>sys.stderr, (
74 "md5 validation of %s failed! (Possible download problem?)"
75 % egg_name
76 )
77 sys.exit(2)
78 return data
79
80def use_setuptools(
81 version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
82 download_delay=15
83):
84 """Automatically find/download setuptools and make it available on sys.path
85
86 `version` should be a valid setuptools version number that is available
87 as an egg for download under the `download_base` URL (which should end with
88 a '/'). `to_dir` is the directory where setuptools will be downloaded, if
89 it is not already available. If `download_delay` is specified, it should
90 be the number of seconds that will be paused before initiating a download,
91 should one be required. If an older version of setuptools is installed,
92 this routine will print a message to ``sys.stderr`` and raise SystemExit in
93 an attempt to abort the calling script.
94 """
95 was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
96 def do_download():
97 egg = download_setuptools(version, download_base, to_dir, download_delay)
98 sys.path.insert(0, egg)
99 import setuptools; setuptools.bootstrap_install_from = egg
100 try:
101 import pkg_resources
102 except ImportError:
103 return do_download()
104 try:
105 pkg_resources.require("setuptools>="+version); return
106 except pkg_resources.VersionConflict, e:
107 if was_imported:
108 print >>sys.stderr, (
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'."
112 "\n\n(Currently using %r)"
113 ) % (version, e.args[0])
114 sys.exit(2)
115 except pkg_resources.DistributionNotFound:
116 pass
117
118 del pkg_resources, sys.modules['pkg_resources'] # reload ok
119 return do_download()
120
121def download_setuptools(
122 version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
123 delay = 15
124):
125 """Download setuptools from a specified location and return its filename
126
127 `version` should be a valid setuptools version number that is available
128 as an egg for download under the `download_base` URL (which should end
129 with a '/'). `to_dir` is the directory where the egg will be downloaded.
130 `delay` is the number of seconds to pause before an actual download attempt.
131 """
132 import urllib2, shutil
133 egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
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---------------------------------------------------------------------------
143This script requires setuptools version %s to run (even to display
144help). I will attempt to download it for you (from
145%s), but
146you may need to enable firewall access for this script first.
147I 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
153and place it in this directory before rerunning this script.)
154---------------------------------------------------------------------------""",
155 version, download_base, delay, url
156 ); from time import sleep; sleep(delay)
157 log.warn("Downloading %s", url)
158 src = urllib2.urlopen(url)
159 # Read/write all in one block, so we don't create a corrupt file
160 # if the download is interrupted.
161 data = _validate_md5(egg_name, src.read())
162 dst = open(saveto,"wb"); dst.write(data)
163 finally:
164 if src: src.close()
165 if dst: dst.close()
166 return os.path.realpath(saveto)
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203def main(argv, version=DEFAULT_VERSION):
204 """Install or upgrade setuptools and EasyInstall"""
205 try:
206 import setuptools
207 except ImportError:
208 egg = None
209 try:
210 egg = download_setuptools(version, delay=0)
211 sys.path.insert(0,egg)
212 from setuptools.command.easy_install import main
213 return main(list(argv)+[egg]) # we're done here
214 finally:
215 if egg and os.path.exists(egg):
216 os.unlink(egg)
217 else:
218 if setuptools.__version__ == '0.0.1':
219 print >>sys.stderr, (
220 "You have an obsolete version of setuptools installed. Please\n"
221 "remove it from your system entirely before rerunning this script."
222 )
223 sys.exit(2)
224
225 req = "setuptools>="+version
226 import pkg_resources
227 try:
228 pkg_resources.require(req)
229 except pkg_resources.VersionConflict:
230 try:
231 from setuptools.command.easy_install import main
232 except ImportError:
233 from easy_install import main
234 main(list(argv)+[download_setuptools(delay=0)])
235 sys.exit(0) # try to force an exit
236 else:
237 if argv:
238 from setuptools.command.easy_install import main
239 main(argv)
240 else:
241 print "Setuptools version",version,"or greater has been installed."
242 print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
243
244def update_md5(filenames):
245 """Update our built-in md5 registry"""
246
247 import re
248
249 for name in filenames:
250 base = os.path.basename(name)
251 f = open(name,'rb')
252 md5_data[base] = md5(f.read()).hexdigest()
253 f.close()
254
255 data = [" %r: %r,\n" % it for it in md5_data.items()]
256 data.sort()
257 repl = "".join(data)
258
259 import inspect
260 srcfile = inspect.getsourcefile(sys.modules[__name__])
261 f = open(srcfile, 'rb'); src = f.read(); f.close()
262
263 match = re.search("\nmd5_data = {\n([^}]+)}", src)
264 if not match:
265 print >>sys.stderr, "Internal error!"
266 sys.exit(2)
267
268 src = src[:match.start(1)] + repl + src[match.end(1):]
269 f = open(srcfile,'w')
270 f.write(src)
271 f.close()
272
273
274if __name__=='__main__':
275 if len(sys.argv)>2 and sys.argv[1]=='--md5update':
276 update_md5(sys.argv[2:])
277 else:
278 main(sys.argv[1:])
279
280
281
282
283
284
2850
=== modified file 'setup.py'
--- setup.py 2016-03-01 13:09:28 +0000
+++ setup.py 2019-05-30 13:25:31 +0000
@@ -2,9 +2,6 @@
2import os2import os
3import re3import re
44
5import ez_setup
6ez_setup.use_setuptools()
7
8from setuptools import setup, Extension, find_packages5from setuptools import setup, Extension, find_packages
96
107
@@ -19,6 +16,28 @@
19 open("storm/__init__.py").read()).group(1)16 open("storm/__init__.py").read()).group(1)
2017
2118
19tests_require = [
20 # Versions based on Lucid, where packaged.
21 "fixtures >= 0.3.5",
22 # pgbouncer (the Python module) is not yet packaged in Ubuntu.
23 "pgbouncer >= 0.0.7",
24 "psycopg2 >= 2.0.13",
25 "testresources >= 0.2.4",
26 "testtools >= 0.9.8",
27 # timeline is not yet packaged in Ubuntu.
28 "timeline >= 0.0.2",
29 "transaction >= 1.0.0",
30 "twisted >= 10.0.0",
31 "zope.component >= 3.8.0",
32 # zope.component 3.11.0 requires a version of zope.interface that no
33 # version of Ubuntu yet packages. The following rule exists for the
34 # sake of convenience rather than necessity, for the situation where
35 # zope.interface is installed via a package but zope.component is not.
36 "zope.component < 3.11.0",
37 "zope.security >= 3.7.2",
38 ]
39
40
22setup(41setup(
23 name="storm",42 name="storm",
24 version=VERSION,43 version=VERSION,
@@ -50,25 +69,7 @@
50 # warning) by distutils.69 # warning) by distutils.
51 include_package_data=True,70 include_package_data=True,
52 zip_safe=False,71 zip_safe=False,
53 test_suite = "tests.find_tests",72 test_suite="tests.find_tests",
54 tests_require=[73 tests_require=tests_require,
55 # Versions based on Lucid, where packaged.74 extras_require={"test": tests_require},
56 "fixtures >= 0.3.5",
57 # pgbouncer (the Python module) is not yet packaged in Ubuntu.
58 "pgbouncer >= 0.0.7",
59 "psycopg2 >= 2.0.13",
60 "testresources >= 0.2.4",
61 "testtools >= 0.9.8",
62 # timeline is not yet packaged in Ubuntu.
63 "timeline >= 0.0.2",
64 "transaction >= 1.0.0",
65 "twisted >= 10.0.0",
66 "zope.component >= 3.8.0",
67 # zope.component 3.11.0 requires a version of zope.interface that no
68 # version of Ubuntu yet packages. The following rule exists for the
69 # sake of convenience rather than necessity, for the situation where
70 # zope.interface is installed via a package but zope.component is not.
71 "zope.component < 3.11.0",
72 "zope.security >= 3.7.2",
73 ],
74 )75 )
7576
=== added file 'tox.ini'
--- tox.ini 1970-01-01 00:00:00 +0000
+++ tox.ini 2019-05-30 13:25:31 +0000
@@ -0,0 +1,15 @@
1[tox]
2envlist =
3 py27-{cextensions,nocextensions}
4
5[testenv]
6deps =
7 .[test]
8passenv = STORM_TEST_RUNNER USER
9setenv =
10 STORM_POSTGRES_URI = postgres:storm_test
11 STORM_POSTGRES_HOST_URI = postgres://localhost:5432/storm_test
12 cextensions: STORM_CEXTENSIONS = 0
13 nocextensions: STORM_CEXTENSIONS = 1
14commands =
15 python test {posargs}

Subscribers

People subscribed via source and target branches

to status/vote changes: