release.py fixes
* Let PATH through when easy installing (so I can use Pythons installed in ~/.local)
* Run easy install tests with the correct Python
* Verify the right version of mechanize gets installed when testing zope.testbrowser
* Run Python 2.4 functional tests against local server
diff --git a/release.py b/release.py
index 2a30b84..3721812 100644
--- a/release.py
+++ b/release.py
@@ -146,6 +146,12 @@
return ["sh", "-c", set_path_script, "inline_script"]
+def clean_environ_env(env):
+ return cmd_env.PrefixCmdEnv(
+ ["sh", "-c", 'env -i HOME="$HOME" PATH="$PATH" "$@"',
+ "clean_environ_env"], env)
+
+
def ensure_trailing_slash(path):
return path.rstrip("/") + "/"
@@ -155,6 +161,33 @@
env.cmd(["mkdir", "-p", path])
+def check_version_equals(env, version):
+ try:
+ output = release.get_cmd_stdout(
+ env,
+ ["python", "-c",
+ "import mechanize; print mechanize.__version__"],
+ stderr=subprocess.PIPE)
+ except cmd_env.CommandFailedError:
+ raise WrongVersionError(None)
+ else:
+ version_tuple_string = output.strip()
+ assert len(version.tuple) == 6, len(version.tuple)
+ if not(version_tuple_string == str(version.tuple) or
+ version_tuple_string == str(version.tuple[:-1])):
+ raise WrongVersionError(version_tuple_string)
+
+
+def check_not_installed(env, version):
+ try:
+ check_version_equals(env, version)
+ except WrongVersionError:
+ pass
+ else:
+ raise WrongVersionError("Expected version != %s" % version)
+
+
+
class EasyInstallTester(object):
def __init__(self, env, install_dir, project_name,
@@ -169,34 +202,10 @@
self._install_dir_on_pythonpath = cmd_env.set_environ_vars_env(
[("PYTHONPATH", self._install_dir)], env)
- def _check_version_equals(self, version):
- try:
- output = release.get_cmd_stdout(
- self._install_dir_on_pythonpath,
- ["python", "-c",
- "import mechanize; print mechanize.__version__"],
- stderr=subprocess.PIPE)
- except cmd_env.CommandFailedError:
- raise WrongVersionError(None)
- else:
- version_tuple_string = output.strip()
- assert len(version.tuple) == 6, len(version.tuple)
- if not(version_tuple_string == str(version.tuple) or
- version_tuple_string == str(version.tuple[:-1])):
- raise WrongVersionError(version_tuple_string)
-
- def _check_not_installed(self):
- try:
- self._check_version_equals(self._expected_version)
- except WrongVersionError:
- pass
- else:
- raise WrongVersionError("Expected version != %s" %
- self._expected_version)
-
def easy_install(self, log):
clean_dir(self._env, self._install_dir)
- self._check_not_installed()
+ check_not_installed(self._install_dir_on_pythonpath,
+ self._expected_version)
output = release.get_cmd_stdout(
self._install_dir_on_pythonpath,
self._easy_install_cmd + ["-d", self._install_dir,
@@ -204,7 +213,8 @@
# easy_install doesn't fail properly :-(
if "SyntaxError" in output:
raise Exception(output)
- self._check_version_equals(self._expected_version)
+ check_version_equals(self._install_dir_on_pythonpath,
+ self._expected_version)
def test(self, log):
self._install_dir_on_pythonpath.cmd(self._test_cmd)
@@ -219,7 +229,9 @@
def make_source_dist_easy_install_test_step(env, install_dir,
source_dir,
- test_cmd, expected_version):
+ test_cmd, expected_version,
+ python_version):
+ python = "python%d.%d" % python_version
tester = EasyInstallTester(
env,
install_dir,
@@ -227,30 +239,36 @@
test_cmd=test_cmd,
expected_version=expected_version,
easy_install_cmd=(cmd_env.in_dir(source_dir) +
- ["python", "setup.py", "easy_install"]))
+ [python, "setup.py", "easy_install"]))
return tester.easy_install_test
def make_pypi_easy_install_test_step(env, install_dir,
- test_cmd, expected_version):
+ test_cmd, expected_version,
+ python_version):
+ easy_install = "easy_install-%d.%d" % python_version
tester = EasyInstallTester(
env,
install_dir,
project_name="mechanize",
test_cmd=test_cmd,
- expected_version=expected_version)
+ expected_version=expected_version,
+ easy_install_cmd=[easy_install])
return tester.easy_install_test
def make_tarball_easy_install_test_step(env, install_dir,
tarball_path,
- test_cmd, expected_version):
+ test_cmd, expected_version,
+ python_version):
+ easy_install = "easy_install-%d.%d" % python_version
tester = EasyInstallTester(
env,
install_dir,
project_name=tarball_path,
test_cmd=test_cmd,
- expected_version=expected_version)
+ expected_version=expected_version,
+ easy_install_cmd=[easy_install])
return tester.easy_install_test
@@ -300,7 +318,7 @@
self._easy_install_test_dir)
# prevent anything other than functional test dependencies being on
# sys.path due to cwd or PYTHONPATH
- self._easy_install_env = cmd_env.clean_environ_except_home_env(
+ self._easy_install_env = clean_environ_env(
release.CwdEnv(env, self._test_deps_dir))
self._zope_testbrowser_dir = os.path.join(release_dir,
"zope_testbrowser_test")
@@ -375,12 +393,12 @@
actions.append(
(package_name.replace(".", ""),
lambda log: self._ensure_installed(package_name, ppa)))
+ add_dependency("python2.6")
# required, but ubuntu doesn't have them any more :-( I installed these
- # by hand
+ # (and zope.interface and twisted SVN trunk) by hand
# add_dependency("python2.4"),
# add_dependency("python2.5")
- add_dependency("python2.6")
- #add_dependency("python2.7")
+ # add_dependency("python2.7")
add_dependency("python-setuptools")
add_dependency("git-core")
# for running zope_testbrowser tests
@@ -400,7 +418,7 @@
add_dependency("wdg-html-validator")
# for collecting code coverage data and generating coverage reports
# no 64 bit .deb ATM
- #add_dependency("python-figleaf", ppa="jjl/figleaf")
+ # add_dependency("python-figleaf", ppa="jjl/figleaf")
# for css validator
add_dependency("default-jre")
@@ -461,37 +479,38 @@
self._in_repo.cmd(["rm", "-f", ".figleaf"])
self._in_repo.cmd(release.rm_rf_cmd("html"))
- def _make_test_step(self, env, *args, **kwds):
- test_cmd = self._make_test_cmd(*args, **kwds)
+ def _make_test_step(self, env, **kwds):
+ test_cmd = self._make_test_cmd(**kwds)
def test_step(log):
env.cmd(test_cmd)
return test_step
- def _make_easy_install_test_cmd(self, *args, **kwds):
- test_cmd = self._make_test_cmd(*args, **kwds)
+ def _make_easy_install_test_cmd(self, **kwds):
+ test_cmd = self._make_test_cmd(**kwds)
test_cmd.extend(["discover", "--start-directory", self._test_deps_dir])
return test_cmd
- def _make_source_dist_easy_install_test_step(self, env, *args, **kwds):
- test_cmd = self._make_easy_install_test_cmd(*args, **kwds)
+ def _make_source_dist_easy_install_test_step(self, env, **kwds):
+ test_cmd = self._make_easy_install_test_cmd(**kwds)
return make_source_dist_easy_install_test_step(
self._easy_install_env, self._easy_install_test_dir,
- self._repo_path, test_cmd, self._release_version)
+ self._repo_path, test_cmd, self._release_version,
+ kwds["python_version"])
- def _make_pypi_easy_install_test_step(self, env, *args, **kwds):
- test_cmd = self._make_easy_install_test_cmd(*args, **kwds)
+ def _make_pypi_easy_install_test_step(self, env, **kwds):
+ test_cmd = self._make_easy_install_test_cmd(**kwds)
return make_pypi_easy_install_test_step(
self._easy_install_env, self._easy_install_test_dir,
- test_cmd, self._release_version)
+ test_cmd, self._release_version, kwds["python_version"])
- def _make_tarball_easy_install_test_step(self, env, *args, **kwds):
- test_cmd = self._make_easy_install_test_cmd(*args, **kwds)
+ def _make_tarball_easy_install_test_step(self, env, **kwds):
+ test_cmd = self._make_easy_install_test_cmd(**kwds)
[tarball] = list(d for d in self._source_distributions if
d.endswith(".tar.gz"))
return make_tarball_easy_install_test_step(
self._easy_install_env, self._easy_install_test_dir,
- os.path.abspath(os.path.join("dist", tarball)),
- test_cmd, self._release_version)
+ os.path.abspath(os.path.join(self._repo_path, "dist", tarball)),
+ test_cmd, self._release_version, kwds["python_version"])
@action_tree.action_node
def test(self):
@@ -511,14 +530,9 @@
r.append(("python25_easy_install_test",
self._make_source_dist_easy_install_test_step(
self._in_repo, python_version=(2, 5))))
- # the functional tests rely on a local web server implemented using
- # twisted.web2, which depends on zope.interface, but ubuntu karmic
- # doesn't have a Python 2.4 package for zope.interface, so run them
- # against external website
- r.append(("python24_easy_install_test_internet",
+ r.append(("python24_easy_install_test",
self._make_source_dist_easy_install_test_step(
- self._in_repo, python_version=(2, 4),
- local_server=False, uri=self._test_uri)))
+ self._in_repo, python_version=(2, 4))))
r.append(self.performance_test)
return r
@@ -776,9 +790,7 @@
project_dir = os.path.join(self._zope_testbrowser_dir,
"zope.testbrowser")
in_project_dir = release.CwdEnv(self._env, project_dir)
- # TODO: If anything else depends on a specific version of mechanize
- # this won't work. Assert that importing mechanize yields expected
- # version.
+ check_not_installed(in_project_dir, self._release_version)
in_project_dir.cmd(
["sed", "-i", "-e", "s/mechanize[^\"']*/mechanize/", "setup.py"])
in_project_dir.cmd(["bin/easy_install", "zc.buildout"])
@@ -794,6 +806,8 @@
"zope.testbrowser")
env = cmd_env.clean_environ_except_home_env(
release.CwdEnv(self._env, project_dir))
+ check_version_equals(self._install_dir_on_pythonpath,
+ self._expected_version)
env.cmd(["bin/test"])
@action_tree.action_node