summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan Richter <stephan.richter@gmail.com>2013-02-28 13:32:52 -0500
committerStephan Richter <stephan.richter@gmail.com>2013-02-28 13:32:52 -0500
commit3318f66c771c70f6e9941b8d6ca6adce0ef846bf (patch)
tree751b6c93d83db84a926a7cf3ea0688fdad986f02
parentc9f9d437b2a7b781b90bdb9f740ea30ff903adb9 (diff)
downloadzope-pagetemplate-3318f66c771c70f6e9941b8d6ca6adce0ef846bf.tar.gz
- Only allow ``zope.untrustedpython`` to be a dependency in Python 2.
- Fix buildout to work properly.
-rw-r--r--.gitignore12
-rw-r--r--CHANGES.txt7
-rw-r--r--MANIFEST.in1
-rw-r--r--bootstrap.py186
-rw-r--r--buildout.cfg12
-rw-r--r--setup.py8
-rw-r--r--tox.ini23
7 files changed, 170 insertions, 79 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..401eb52
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,12 @@
+*.pyc
+*.so
+*.dll
+__pycache__
+src/*.egg-info
+
+.installed.cfg
+.tox
+bin
+build
+develop-eggs
+parts
diff --git a/CHANGES.txt b/CHANGES.txt
index ff2942d..32fdac5 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -5,15 +5,16 @@ CHANGES
4.0.3 (unreleased)
------------------
-- Nothing changed yet.
+- Only allow ``zope.untrustedpython`` to be a dependency in Python 2.
+- Fix buildout to work properly.
4.0.2 (2013-02-22)
------------------
-- Migrated from zope.security.untrustedpython to zope.untrustedpython.
+- Migrated from ``zope.security.untrustedpython`` to ``zope.untrustedpython``.
-- Made zope.untrustedpython an extra dependency. Without it, python
+- Made ``zope.untrustedpython`` an extra dependency. Without it, python
expressions are not protected, even though path expressions are still
security wrapped.
diff --git a/MANIFEST.in b/MANIFEST.in
index 6374187..4364906 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,4 +1,5 @@
include *.txt
include bootstrap.py
include buildout.cfg
+include tox.ini
recursive-include src *.txt *.html *.pt
diff --git a/bootstrap.py b/bootstrap.py
index a6da5d3..ec3757a 100644
--- a/bootstrap.py
+++ b/bootstrap.py
@@ -18,102 +18,148 @@ The script accepts buildout command-line options, so you can
use the -c option to specify an alternate configuration file.
"""
-import os, shutil, sys, tempfile, urllib2
+import os, shutil, sys, tempfile
from optparse import OptionParser
tmpeggs = tempfile.mkdtemp()
-is_jython = sys.platform.startswith('java')
+usage = '''\
+[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
-# parsing arguments
-parser = OptionParser()
-parser.add_option("-v", "--version", dest="version",
- help="use a specific zc.buildout version")
-parser.add_option("-d", "--distribute",
- action="store_true", dest="distribute", default=False,
- help="Use Disribute rather than Setuptools.")
+Bootstraps a buildout-based project.
-parser.add_option("-c", None, action="store", dest="config_file",
+Simply run this script in a directory containing a buildout.cfg, using the
+Python that you want bin/buildout to use.
+
+Note that by using --setup-source and --download-base to point to
+local resources, you can keep this script from going over the network.
+'''
+
+parser = OptionParser(usage=usage)
+parser.add_option("-v", "--version", help="use a specific zc.buildout version")
+
+parser.add_option("-t", "--accept-buildout-test-releases",
+ dest='accept_buildout_test_releases',
+ action="store_true", default=False,
+ help=("Normally, if you do not specify a --version, the "
+ "bootstrap script and buildout gets the newest "
+ "*final* versions of zc.buildout and its recipes and "
+ "extensions for you. If you use this flag, "
+ "bootstrap and buildout will get the newest releases "
+ "even if they are alphas or betas."))
+parser.add_option("-c", "--config-file",
help=("Specify the path to the buildout configuration "
"file to be used."))
+parser.add_option("-f", "--find-links",
+ help=("Specify a URL to search for buildout releases"))
-options, args = parser.parse_args()
-
-# if -c was provided, we push it back into args for buildout' main function
-if options.config_file is not None:
- args += ['-c', options.config_file]
-if options.version is not None:
- VERSION = '==%s' % options.version
-else:
- VERSION = ''
+options, args = parser.parse_args()
-USE_DISTRIBUTE = options.distribute
-args = args + ['bootstrap']
+######################################################################
+# load/install distribute
to_reload = False
try:
- import pkg_resources
+ import pkg_resources, setuptools
if not hasattr(pkg_resources, '_distribute'):
to_reload = True
raise ImportError
except ImportError:
ez = {}
- if USE_DISTRIBUTE:
- exec urllib2.urlopen('http://python-distribute.org/distribute_setup.py'
- ).read() in ez
- ez['use_setuptools'](to_dir=tmpeggs, download_delay=0, no_fake=True)
- else:
- exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py'
- ).read() in ez
- ez['use_setuptools'](to_dir=tmpeggs, download_delay=0)
+
+ try:
+ from urllib.request import urlopen
+ except ImportError:
+ from urllib2 import urlopen
+
+ exec(urlopen('http://python-distribute.org/distribute_setup.py').read(), ez)
+ setup_args = dict(to_dir=tmpeggs, download_delay=0, no_fake=True)
+ ez['use_setuptools'](**setup_args)
if to_reload:
reload(pkg_resources)
- else:
- import pkg_resources
-
-if sys.platform == 'win32':
- def quote(c):
- if ' ' in c:
- return '"%s"' % c # work around spawn lamosity on windows
- else:
- return c
-else:
- def quote (c):
- return c
-
-cmd = 'from setuptools.command.easy_install import main; main()'
+ import pkg_resources
+ # This does not (always?) update the default working set. We will
+ # do it.
+ for path in sys.path:
+ if path not in pkg_resources.working_set.entries:
+ pkg_resources.working_set.add_entry(path)
+
+######################################################################
+# Install buildout
+
ws = pkg_resources.working_set
-if USE_DISTRIBUTE:
- requirement = 'distribute'
-else:
- requirement = 'setuptools'
-
-if is_jython:
- import subprocess
-
- assert subprocess.Popen([sys.executable] + ['-c', quote(cmd), '-mqNxd',
- quote(tmpeggs), 'zc.buildout' + VERSION],
- env=dict(os.environ,
- PYTHONPATH=
- ws.find(pkg_resources.Requirement.parse(requirement)).location
- ),
- ).wait() == 0
-
-else:
- assert os.spawnle(
- os.P_WAIT, sys.executable, quote (sys.executable),
- '-c', quote (cmd), '-mqNxd', quote (tmpeggs), 'zc.buildout' + VERSION,
- dict(os.environ,
- PYTHONPATH=
- ws.find(pkg_resources.Requirement.parse(requirement)).location
- ),
- ) == 0
+cmd = [sys.executable, '-c',
+ 'from setuptools.command.easy_install import main; main()',
+ '-mZqNxd', tmpeggs]
+
+find_links = os.environ.get(
+ 'bootstrap-testing-find-links',
+ options.find_links or
+ ('http://downloads.buildout.org/'
+ if options.accept_buildout_test_releases else None)
+ )
+if find_links:
+ cmd.extend(['-f', find_links])
+
+distribute_path = ws.find(
+ pkg_resources.Requirement.parse('distribute')).location
+
+requirement = 'zc.buildout'
+version = options.version
+if version is None and not options.accept_buildout_test_releases:
+ # Figure out the most recent final version of zc.buildout.
+ import setuptools.package_index
+ _final_parts = '*final-', '*final'
+ def _final_version(parsed_version):
+ for part in parsed_version:
+ if (part[:1] == '*') and (part not in _final_parts):
+ return False
+ return True
+ index = setuptools.package_index.PackageIndex(
+ search_path=[distribute_path])
+ if find_links:
+ index.add_find_links((find_links,))
+ req = pkg_resources.Requirement.parse(requirement)
+ if index.obtain(req) is not None:
+ best = []
+ bestv = None
+ for dist in index[req.project_name]:
+ distv = dist.parsed_version
+ if _final_version(distv):
+ if bestv is None or distv > bestv:
+ best = [dist]
+ bestv = distv
+ elif distv == bestv:
+ best.append(dist)
+ if best:
+ best.sort()
+ version = best[-1].version
+if version:
+ requirement = '=='.join((requirement, version))
+cmd.append(requirement)
+
+import subprocess
+if subprocess.call(cmd, env=dict(os.environ, PYTHONPATH=distribute_path)) != 0:
+ raise Exception(
+ "Failed to execute command:\n%s",
+ repr(cmd)[1:-1])
+
+######################################################################
+# Import and run buildout
ws.add_entry(tmpeggs)
-ws.require('zc.buildout' + VERSION)
+ws.require(requirement)
import zc.buildout.buildout
+
+if not [a for a in args if '=' not in a]:
+ args.append('bootstrap')
+
+# if -c was provided, we push it back into args for buildout' main function
+if options.config_file is not None:
+ args[0:0] = ['-c', options.config_file]
+
zc.buildout.buildout.main(args)
shutil.rmtree(tmpeggs)
diff --git a/buildout.cfg b/buildout.cfg
index 83873d2..d8d3e42 100644
--- a/buildout.cfg
+++ b/buildout.cfg
@@ -1,14 +1,15 @@
[buildout]
develop = .
parts = py test testcompat coverage-test coverage-report
+versions = versions
[test]
recipe = zc.recipe.testrunner
-eggs = zope.pagetemplate [test, untrusted]
+eggs = zope.pagetemplate [test]
[testcompat]
recipe = zc.recipe.testrunner
-eggs = zope.pagetemplate [test, untrusted]
+eggs = zope.pagetemplate [test]
z3c.pt
z3c.ptcompat
Chameleon
@@ -28,3 +29,10 @@ recipe = zc.recipe.egg
eggs = z3c.coverage
scripts = coverage=coverage-report
arguments = ('coverage', 'coverage/report')
+
+[versions]
+zope.i18n=4.0.0a3
+zope.publisher = 4.0.0a2
+zope.security = 4.0.0a4
+zope.traversing = 4.0.0a2
+zope.tal = 4.0.0a1
diff --git a/setup.py b/setup.py
index ac8efed..90a473c 100644
--- a/setup.py
+++ b/setup.py
@@ -19,8 +19,11 @@
"""Setup for zope.pagetemplate package
"""
import os
+import sys
from setuptools import setup, find_packages
+PY3 = sys.version_info[0] >= 3
+
def read(*rnames):
return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
@@ -62,7 +65,8 @@ TESTS_REQUIRE = [
'zope.testing',
'zope.proxy',
'zope.security',
-]
+] + (['zope.untrustedpython'] if not PY3 else [])
+
setup(name='zope.pagetemplate',
version='4.0.3.dev0',
@@ -103,7 +107,7 @@ setup(name='zope.pagetemplate',
namespace_packages=['zope'],
extras_require=dict(
test=TESTS_REQUIRE,
- untrusted=['zope.untrustedpython'],
+ untrusted=['zope.untrustedpython'] if not PY3 else [],
),
install_requires=['setuptools',
'six',
diff --git a/tox.ini b/tox.ini
index 0c459e6..8048286 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,11 +1,30 @@
[tox]
envlist =
- # py32 needs a py3k-compatible zope.security at the very least
py26,py27,py33
[testenv]
deps =
zope.pagetemplate[test]
-commands =
+ zope.component
+ zope.i18n
+ zope.i18nmessageid
+ zope.interface
+ zope.proxy
+ zope.security
+ zope.tal
+ zope.tales
+ zope.testing
+ zope.testrunner
+ zope.traversing
+commands =
python setup.py test -q
+[testenv:py26]
+deps =
+ {[testenv]deps}
+ zope.untrustedpython
+ RestrictedPython
+
+[testenv:py27]
+deps =
+ {[testenv:py26]deps}