[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