[Checkins] SVN: zc.recipe.wrapper/trunk/ Initial code checkin.
Aaron Lehmann
aaron at zope.com
Wed Sep 3 16:35:46 EDT 2008
Log message for revision 90771:
Initial code checkin.
Changed:
A zc.recipe.wrapper/trunk/CHANGES.txt
A zc.recipe.wrapper/trunk/buildout.cfg
A zc.recipe.wrapper/trunk/setup.py
A zc.recipe.wrapper/trunk/src/
A zc.recipe.wrapper/trunk/src/zc/
A zc.recipe.wrapper/trunk/src/zc/__init__.py
A zc.recipe.wrapper/trunk/src/zc/recipe/
A zc.recipe.wrapper/trunk/src/zc/recipe/__init__.py
A zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/
A zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/README.txt
A zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/__init__.py
A zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/tests.py
-=-
Added: zc.recipe.wrapper/trunk/CHANGES.txt
===================================================================
--- zc.recipe.wrapper/trunk/CHANGES.txt (rev 0)
+++ zc.recipe.wrapper/trunk/CHANGES.txt 2008-09-03 20:35:45 UTC (rev 90771)
@@ -0,0 +1,13 @@
+CHANGES
+=======
+
+1.0.0 (2008-09-03)
+------------------
+
+- First Open Source release.
+
+
+1.0.0a1 (2008-08-28)
+--------------------
+
+- First internal release
Added: zc.recipe.wrapper/trunk/buildout.cfg
===================================================================
--- zc.recipe.wrapper/trunk/buildout.cfg (rev 0)
+++ zc.recipe.wrapper/trunk/buildout.cfg 2008-09-03 20:35:45 UTC (rev 90771)
@@ -0,0 +1,16 @@
+[buildout]
+develop = .
+parts = test
+versions = versions
+
+[versions]
+setuptools = 0.6c8
+zc.recipe.testrunner = 1.0.0
+zc.recipe.egg = 1.0.0
+zc.buildout = 1.0.0
+zope.testing = 3.5.0
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = zc.recipe.wrapper
+defaults = ["-1"]
Added: zc.recipe.wrapper/trunk/setup.py
===================================================================
--- zc.recipe.wrapper/trunk/setup.py (rev 0)
+++ zc.recipe.wrapper/trunk/setup.py 2008-09-03 20:35:45 UTC (rev 90771)
@@ -0,0 +1,111 @@
+##############################################################################
+#
+# Copyright (c) 2006-2008 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+import os
+import setuptools
+from setuptools import setup, find_packages
+
+# generic helpers primarily for the long_description
+try:
+ import docutils
+except ImportError:
+ def validateReST(text):
+ return ''
+else:
+ import docutils.utils
+ import docutils.parsers.rst
+ import StringIO
+ def validateReST(text):
+ doc = docutils.utils.new_document('validator')
+ # our desired settings
+ doc.reporter.halt_level = 5
+ doc.reporter.report_level = 1
+ stream = doc.reporter.stream = StringIO.StringIO()
+ # docutils buglets (?)
+ doc.settings.tab_width = 2
+ doc.settings.pep_references = doc.settings.rfc_references = False
+ doc.settings.trim_footnote_reference_space = None
+ # and we're off...
+ parser = docutils.parsers.rst.Parser()
+ parser.parse(text, doc)
+ return stream.getvalue()
+
+def text(*args, **kwargs):
+ # note: distutils explicitly disallows unicode for setup values :-/
+ # http://docs.python.org/dist/meta-data.html
+ tmp = []
+ for a in args:
+ if a.endswith('.txt'):
+ f = open(os.path.join(*a.split('/')))
+ tmp.append(f.read())
+ f.close()
+ tmp.append('\n\n')
+ else:
+ tmp.append(a)
+ if len(tmp) == 1:
+ res = tmp[0]
+ else:
+ res = ''.join(tmp)
+ out = kwargs.get('out')
+ if out is True:
+ out = 'TEST_THIS_REST_BEFORE_REGISTERING.txt'
+ if out:
+ f = open(out, 'w')
+ f.write(res)
+ f.close()
+ report = validateReST(res)
+ if report:
+ print report
+ raise ValueError('ReST validation error')
+ return res
+# end helpers; below this line should be code custom to this package
+
+
+
+ENTRY_POINTS = """
+[zc.buildout]
+default = zc.recipe.wrapper:Wrapper
+"""
+
+
+setuptools.setup(
+ name="zc.recipe.wrapper",
+ version="1.0.0",
+ description="Recipe that creates shell wrapper scripts",
+ long_description=text(
+ 'CHANGES.txt',
+ out=True),
+ keywords="development build wrapper generater",
+ classifiers = [
+ 'Framework :: Buildout',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: Zope Public License',
+ 'Topic :: Software Development :: Build Tools',
+ 'Topic :: Software Development :: Libraries :: Python Modules',
+ ],
+ author="Aaron Lehmann",
+ author_email="aaron at zope.com",
+ license="ZPL 2.1",
+
+ package_dir={"": "src"},
+ packages=setuptools.find_packages("src"),
+ namespace_packages=["zc", "zc.recipe"],
+ install_requires=[
+ "setuptools",
+ "zc.recipe.testrunner",
+ "zope.testing",
+ ],
+ include_package_data=True,
+ zip_safe=False,
+ entry_points=ENTRY_POINTS,
+ )
Added: zc.recipe.wrapper/trunk/src/zc/__init__.py
===================================================================
--- zc.recipe.wrapper/trunk/src/zc/__init__.py (rev 0)
+++ zc.recipe.wrapper/trunk/src/zc/__init__.py 2008-09-03 20:35:45 UTC (rev 90771)
@@ -0,0 +1,10 @@
+# This directory is a Python namespace package.
+try:
+ import pkg_resources
+except ImportError:
+ import pkgutil
+ __path__ = pkgutil.extend_path(__path__, __name__)
+ del pkgutil
+else:
+ pkg_resources.declare_namespace(__name__)
+ del pkg_resources
Added: zc.recipe.wrapper/trunk/src/zc/recipe/__init__.py
===================================================================
--- zc.recipe.wrapper/trunk/src/zc/recipe/__init__.py (rev 0)
+++ zc.recipe.wrapper/trunk/src/zc/recipe/__init__.py 2008-09-03 20:35:45 UTC (rev 90771)
@@ -0,0 +1,10 @@
+# This directory is a Python namespace package.
+try:
+ import pkg_resources
+except ImportError:
+ import pkgutil
+ __path__ = pkgutil.extend_path(__path__, __name__)
+ del pkgutil
+else:
+ pkg_resources.declare_namespace(__name__)
+ del pkg_resources
Added: zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/README.txt
===================================================================
--- zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/README.txt (rev 0)
+++ zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/README.txt 2008-09-03 20:35:45 UTC (rev 90771)
@@ -0,0 +1,258 @@
+zc.recipe.wrapper
+=================
+
+One of the goals to using buildout is to avoid changing the system in order to
+develop. Another goal is to generate the ancillary scripts necessary for
+testing and administration and ensure that they use the same version of all
+dependancies in dev and stage enviroments as production environments.
+Unfortunately in the case of dynamic libraries, the former goal works against
+the latter goal, because the generated scripts will not include the
+appropriate libraries at the start of the python interpreter, which is
+necessary to access external libraries using ctypes (essential for some
+libraries, such as lcms), and OS X compatibility. zc.recipe.wrapper aims to
+solve this by providing a generic interface to create wrapper scripts.
+
+Basic Use
+---------
+
+To start off, lets create a buildout that generates a python interpreter,
+called `py`.
+
+ >>> import os
+ >>> buildout = setupBuildout(sample_buildout, "buildout.cfg",
+ ... """
+ ... [buildout]
+ ... parts = interpreter
+ ... versions = versions
+ ... develop = %s
+ ...
+ ... [versions]
+ ... zc.recipe.egg = 1.0.0
+ ... setuptools = 0.6c8
+ ... zc.recipe.testrunner = 1.0.0
+ ... zc.buildout = 1.0.0
+ ... zope.testing = 3.5.0
+ ...
+ ... [interpreter]
+ ... recipe = zc.recipe.egg
+ ... eggs = zc.recipe.wrapper
+ ... interpreter = py
+ ... """ % wrapper)
+ >>> os.chdir(sample_buildout)
+ >>> buildout.install([])
+ Develop: '/.../USER/work/zc.recipe.wrapper'
+ Installing interpreter.
+ Getting distribution for 'zope.testing==3.5.0'.
+ Got zope.testing 3.5.0.
+ Getting distribution for 'zc.recipe.testrunner==1.0.0'.
+ Got zc.recipe.testrunner 1.0.0.
+ Getting distribution for 'zc.recipe.egg==1.0.0'.
+ Got zc.recipe.egg 1.0.0.
+ Generated interpreter 'PREFIX/bin/py'.
+ >>> buildout_pprint(dict(buildout))
+ {'buildout': {...},
+ 'interpreter': {...
+ 'interpreter': 'py',
+ 'recipe': 'zc.recipe.egg'},
+ 'versions': {...}}
+ >>> print ls(os.path.join(sample_buildout, 'bin/py'))
+ -rwxr-xr-x USER USER PREFIX/bin/py
+ >>> print ls(os.path.join(sample_buildout, 'bin/basepy'))
+ Traceback (most recent call last):
+ ...
+ OSError: [Errno 2] No such file or directory: '/.../sample-buildout/bin/basepy'
+ >>> os.chdir(wrapper)
+
+We might desire to run `py` with an addition to the dynamic load path:
+
+ >>> buildout = setupBuildout(sample_buildout, "buildout.cfg",
+ ... """
+ ... [buildout]
+ ... parts = interpreter py
+ ... versions = versions
+ ... develop = %s
+ ...
+ ... [versions]
+ ... zc.recipe.egg = 1.0.0
+ ... setuptools = 0.6c8
+ ... zc.recipe.testrunner = 1.0.0
+ ... zc.buildout = 1.0.0
+ ... zope.testing = 3.5.0
+ ...
+ ... [interpreter]
+ ... recipe = zc.recipe.egg
+ ... eggs = zc.recipe.wrapper
+ ... interpreter = basepy
+ ...
+ ... [py-environment]
+ ... LD_LIBRARY = some_library_I_like
+ ...
+ ... [py]
+ ... recipe = zc.recipe.wrapper
+ ... target = bin/${interpreter:interpreter}
+ ... environment = py-environment
+ ... """ % wrapper)
+ >>> os.chdir(sample_buildout)
+ >>> buildout.install([])
+ Develop: '/.../USER/work/zc.recipe.wrapper'
+ Installing interpreter.
+ Getting distribution for 'zope.testing==3.5.0'.
+ Got zope.testing 3.5.0.
+ Getting distribution for 'zc.recipe.testrunner==1.0.0'.
+ Got zc.recipe.testrunner 1.0.0.
+ Getting distribution for 'zc.recipe.egg==1.0.0'.
+ Got zc.recipe.egg 1.0.0.
+ Generated interpreter 'PREFIX/bin/basepy'.
+ Installing py.
+
+ >>> buildout_pprint(dict(buildout))
+ {'buildout': {...},
+ 'interpreter': {...
+ 'interpreter': 'basepy',
+ 'recipe': 'zc.recipe.egg'},
+ 'py': {'deployment': '',
+ 'environment': 'py-environment',
+ 'if-os': 'ANY',
+ 'name': 'py',
+ 'path': 'PREFIX/bin/py',
+ 'recipe': 'zc.recipe.wrapper',
+ 'target': 'bin/basepy'},
+ 'py-environment': {'LD_LIBRARY': 'some_library_I_like'},
+ 'versions': {...}}
+ >>> print ls(os.path.join(sample_buildout, 'bin/py'))
+ -rwxr-xr-x USER USER PREFIX/bin/py
+ >>> print ls(os.path.join(sample_buildout, 'bin/basepy'))
+ -rwxr-xr-x USER USER PREFIX/bin/basepy
+ >>> cat(sample_buildout, 'bin', 'py')
+ #!...
+ import os
+ import sys
+ env = {}
+ env.update(os.environ)
+ newenv = {'LD_LIBRARY': 'some_library_I_like'}
+ env.update(newenv)
+ target = 'bin/basepy'
+ path = os.path.join(
+ *([os.sep,] + 'PREFIX'.split(os.sep) + target.split(os.sep)))
+ args = [sys.executable] + [path] + sys.argv[1:]
+ os.execve(sys.executable, args, env)
+ >>> os.chdir(wrapper)
+
+This bin/py will replace itself with a call to bin/basepy, baking in the added
+environment. More environment could be added by putting more options in the
+`py` section.
+
+
+Platform Specific Wrappers
+--------------------------
+
+Environment variables are often platform specific. It is possible to use the
+`if-os` option to confine building of a wrapper to a particular platform.
+
+The following buildout is Linux specific. We'll mokeypatch the function that
+gets the platform to ensure that this test runs on all platforms.
+
+ >>> import zc.recipe.wrapper
+ >>> zc.recipe.wrapper.get_platform = lambda: 'linux2'
+ >>> buildout_cfg = """
+ ... [buildout]
+ ... parts = interpreter py
+ ... versions = versions
+ ... develop = %s
+ ...
+ ... [versions]
+ ... zc.recipe.egg = 1.0.0
+ ... setuptools = 0.6c8
+ ... zc.recipe.testrunner = 1.0.0
+ ... zc.buildout = 1.0.0
+ ... zope.testing = 3.5.0
+ ...
+ ... [interpreter]
+ ... recipe = zc.recipe.egg
+ ... eggs = zc.recipe.wrapper
+ ... interpreter = basepy
+ ...
+ ... [py-environment]
+ ... LD_LIBRARY = some_library_I_like
+ ...
+ ... [py]
+ ... recipe = zc.recipe.wrapper
+ ... if-os = linux2
+ ... target = bin/${interpreter:interpreter}
+ ... environment = py-environment
+ ... """ % wrapper
+ >>> buildout = setupBuildout(sample_buildout, "buildout.cfg", buildout_cfg)
+ >>> os.chdir(sample_buildout)
+ >>> buildout.install([])
+ Develop: '/.../USER/work/zc.recipe.wrapper'
+ Installing interpreter.
+ Getting distribution for 'zope.testing==3.5.0'.
+ Got zope.testing 3.5.0.
+ Getting distribution for 'zc.recipe.testrunner==1.0.0'.
+ Got zc.recipe.testrunner 1.0.0.
+ Getting distribution for 'zc.recipe.egg==1.0.0'.
+ Got zc.recipe.egg 1.0.0.
+ Generated interpreter 'PREFIX/bin/basepy'.
+ Installing py.
+ >>> print ls(os.path.join(sample_buildout, 'bin/py'))
+ -rwxr-xr-x USER USER PREFIX/bin/py
+ >>> os.chdir(wrapper)
+
+Now, suppose we were to run it on a Macintosh?
+
+ >>> zc.recipe.wrapper.get_platform = lambda: 'darwin'
+ >>> buildout = setupBuildout(sample_buildout, "buildout.cfg", buildout_cfg)
+ >>> os.chdir(sample_buildout)
+ >>> buildout.install([])
+ Develop: '/.../USER/work/zc.recipe.wrapper'
+ Installing interpreter.
+ Getting distribution for 'zope.testing==3.5.0'.
+ Got zope.testing 3.5.0.
+ Getting distribution for 'zc.recipe.testrunner==1.0.0'.
+ Got zc.recipe.testrunner 1.0.0.
+ Getting distribution for 'zc.recipe.egg==1.0.0'.
+ Got zc.recipe.egg 1.0.0.
+ Generated interpreter 'PREFIX/bin/basepy'.
+ Installing py.
+ Unused options for py: 'environment' 'target'.
+ >>> print ls(os.path.join(sample_buildout, 'bin/py'))
+ Traceback (most recent call last):
+ ...
+ OSError: [Errno 2] No such file or directory: '/.../sample-buildout/bin/py'
+
+Note that the `bin/py` script was not installed.
+
+
+Required Options
+----------------
+
+zc.recipe.wrapper requires this option:
+
+target
+ The relative path of the program to execute respective to the deployment or
+ the ${buildout:directory}.
+environment
+ The name of a section which will be used to construct the environment
+ mapping.
+
+
+Optional Options
+----------------
+
+There are some optional options that can be provided to zc.recipe.wrapper to
+modify its function:
+
+deployment
+ The name of the zc.recipe.deployment part that sets where to put the
+ wrapper, where it should look for its target, and the user who will have
+ permissions. If this is not provided, ${buildout:directory} will be used for
+ the directory, and the permissions will be those of the user who runs the
+ buildout.
+if-os
+ This can be filled in with a string, or space delimited sequence of
+ strings, which are the set of values sys.platform must return in order for
+ this recipe to be installed. Defaults to 'ANY', meaning that the part is
+ OS-agnostic.
+name
+ This is the name of the script to create. Defaults to the name of the
+ part.
Added: zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/__init__.py
===================================================================
--- zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/__init__.py (rev 0)
+++ zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/__init__.py 2008-09-03 20:35:45 UTC (rev 90771)
@@ -0,0 +1,67 @@
+import pwd
+import pprint
+import os
+import os.path
+import sys
+
+TEMPLATE = """#!%(interpreter)s
+import os
+import sys
+env = {}
+env.update(os.environ)
+newenv = %(env)s
+env.update(newenv)
+target = '%(target)s'
+path = os.path.join(
+ *([os.sep,] + '%(base)s'.split(os.sep) + target.split(os.sep)))
+args = [sys.executable] + [path] + sys.argv[1:]
+os.execve(sys.executable, args, env)"""
+
+def get_platform():
+ # Monkeypatch me for tests.
+ return sys.platform
+
+class Wrapper(object):
+ def __init__(self, buildout, name, options):
+ self.buildout = buildout
+ self.name = name
+ self.options = options
+ self.supported_os = self.options.get('if-os', '').split() or ['ANY']
+
+ def install(self):
+ if set(['ANY'] + [get_platform()]) & set(self.supported_os):
+ options = {}
+ options.update(self.options)
+ options['deployment'] = self.options.get('deployment', '')
+ options['if-os'] = self.options.get('if-os', 'ANY')
+ options['name'] = self.options.get('name', self.name)
+ if 'deployment' in self.options:
+ deployment = self.buildout[self.options['deployment']]
+ path = deployment['rc-directory']
+ user = deployment['user']
+ else:
+ path = self.buildout['buildout']['directory']
+ user = pwd.getpwuid(os.geteuid()).pw_name
+
+ options['path'] = os.path.join(
+ os.sep, path, 'bin', options['name'])
+ self.options.update(options)
+
+ parameters = dict(
+ base = path,
+ env = pprint.pformat(
+ self.buildout[self.options['environment']]),
+ interpreter = self.buildout['buildout']['executable'],
+ target = self.options['target'],)
+ wrapper = open(self.options['path'], 'w')
+ wrapper.write(TEMPLATE % parameters)
+ wrapper.close()
+ os.chmod(options['path'], 0755)
+ os.chown(options['path'], *(pwd.getpwnam(user)[2:4]))
+ return ()
+ update = install
+
+ def uninstall(self):
+ if set(['ANY'] + [get_platform()]) & set(self.supported_os):
+ os.remove(self.options['path'])
+
Added: zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/tests.py
===================================================================
--- zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/tests.py (rev 0)
+++ zc.recipe.wrapper/trunk/src/zc/recipe/wrapper/tests.py 2008-09-03 20:35:45 UTC (rev 90771)
@@ -0,0 +1,126 @@
+import re
+import zc.buildout.testing
+
+import unittest
+import zope.testing
+from zope.testing import doctest, renormalizing
+import getpass
+import os
+import os.path
+import stat
+import logging
+import pwd
+import pprint
+import grp
+
+here = os.path.abspath(os.path.dirname(__file__))
+user = pwd.getpwuid(os.geteuid()).pw_name
+group = grp.getgrgid(os.getegid()).gr_name
+
+def buildout_pprint(buildout):
+ b_dict = dict((key, dict(value)) for (key, value) in buildout.iteritems())
+ string = pprint.pformat(b_dict).replace('\\n', '\n')
+ print string
+
+def setupBuildout(test, *args):
+ rmdir, write, tmpdir = (
+ test.globs['rmdir'],
+ test.globs['write'],
+ test.globs['tmpdir'])
+ args = list(args)
+ cfg = args.pop()
+ filename = args.pop()
+ directory = os.path.join(*args)
+ eggs = os.path.join(os.path.join(directory, 'eggs'))
+ eggs = os.path.join(os.path.join(directory, 'eggs'))
+ path = os.path.join(directory, filename)
+ install_eggs = test.globs.get('eggs', tuple())
+ sample_buildout = test.globs['sample_buildout']
+ rmdir(directory)
+ test.globs['sample_buildout'] = sample_buildout = tmpdir(sample_buildout)
+ write(path, cfg)
+ os.chdir(sample_buildout)
+ buildout = zc.buildout.buildout.Buildout(
+ path,
+ [# trick bootstrap into putting the buildout develop egg
+ # in the eggs dir.
+ ('buildout', 'develop-eggs-directory', 'eggs'),
+ ],
+ user_defaults=False
+ )
+ # Create the develop-eggs dir, which didn't get created the usual
+ # way due to the trick above:
+ os.mkdir('develop-eggs')
+
+ #Raise the log threshold for the bootstrap, because we don't care about
+ #it
+ logger = logging.getLogger('zc.buildout')
+ level = logging.getLogger('zc.buildout').level
+ logging.getLogger('zc.buildout').setLevel(99999)
+ buildout.bootstrap([])
+ logging.getLogger('zc.buildout').setLevel(level)
+
+ #Remove extra log handlers that dump output outside of the test or mess
+ #the test up.
+ logger.removeHandler(logger.handlers[0])
+ if logger.parent:
+ logger.parent.removeHandler(logger.parent.handlers[1])
+
+ #Install the eggs we need.
+ for egg in install_eggs:
+ zc.buildout.testing.install(egg, eggs)
+ return buildout
+
+
+def ls(path):
+ def perm(power, mode):
+ bit = (mode & 2 ** power) << (31 - power)
+ if bit:
+ if power in [2, 5, 8]:
+ return 'r'
+ elif power in [1, 4, 7]:
+ return 'w'
+ else:
+ return 'x'
+ else:
+ return '-'
+ st = os.stat(path)
+ if stat.S_ISDIR(st.st_mode):
+ permissions = ['d']
+ else:
+ permissions = ['-']
+ permissions = ''.join(permissions + [perm(power, st.st_mode) for power in reversed(xrange(9))])
+ return '%s %s %s %s' % (permissions, user, group, path)
+
+def setUp(test):
+ zc.buildout.testing.buildoutSetUp(test)
+ zc.buildout.testing.install_develop('zc.recipe.wrapper', test)
+ test.globs['user'] = getpass.getuser()
+ test.globs['ls'] = ls
+ test.globs['here'] = here
+ test.globs['wrapper'] = os.path.abspath(os.path.join(here,'../../../..'))
+ test.globs['setupBuildout'] = (
+ lambda *args: setupBuildout(test, ('zc.recipe.egg',), *args))
+ test.globs['buildout_pprint'] = buildout_pprint
+ os.chdir(test.globs['wrapper'])
+
+
+def test_suite():
+ return unittest.TestSuite((
+ #doctest.DocTestSuite(),
+ doctest.DocFileSuite(
+ 'README.txt',
+ setUp=setUp, tearDown=zc.buildout.testing.buildoutTearDown,
+ checker=renormalizing.RENormalizing([
+ (re.compile('\d+ \d\d\d\d-\d\d-\d\d \d\d:\d\d'), ''),
+ (re.compile(user), 'USER'),
+ (re.compile('/.*/sample-buildout'), 'PREFIX'),
+ ]),
+ optionflags = (zope.testing.doctest.REPORT_NDIFF
+ | zope.testing.doctest.ELLIPSIS)
+ ),
+
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
More information about the Checkins
mailing list