[Checkins] SVN: z3c.recipe.i18n/trunk/ merge gary-0.8.0 branch to add compatibility for zc.buildout-1.5.1

Jan-Wijbrand Kolman janwijbrand at gmail.com
Tue Oct 5 11:29:54 EDT 2010


Log message for revision 117252:
  merge gary-0.8.0 branch to add compatibility for zc.buildout-1.5.1

Changed:
  U   z3c.recipe.i18n/trunk/CHANGES.txt
  U   z3c.recipe.i18n/trunk/bootstrap.py
  U   z3c.recipe.i18n/trunk/buildout-zope212.cfg
  U   z3c.recipe.i18n/trunk/buildout-ztk10.cfg
  U   z3c.recipe.i18n/trunk/setup.py
  U   z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/README.txt
  U   z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/i18n.py
  U   z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/i18nextract.py
  U   z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/tests.py

-=-
Modified: z3c.recipe.i18n/trunk/CHANGES.txt
===================================================================
--- z3c.recipe.i18n/trunk/CHANGES.txt	2010-10-05 14:41:03 UTC (rev 117251)
+++ z3c.recipe.i18n/trunk/CHANGES.txt	2010-10-05 15:29:53 UTC (rev 117252)
@@ -2,7 +2,7 @@
 CHANGES
 =======
 
-0.7.1 (unreleased)
+0.8.0 (unreleased)
 ------------------
 
 - Fixed test setup to run with current zopetoolkit packages.
@@ -11,7 +11,11 @@
 - Using python's `doctest` module instead of deprecated
   `zope.testing.doctest`.
 
+- Support new features of zc.buildout 1.5 line.
 
+- Typo change in configuration: exludeDirNames becomes excludeDirNames
+
+
 0.7.0 (2010-02-18)
 ------------------
 

Modified: z3c.recipe.i18n/trunk/bootstrap.py
===================================================================
--- z3c.recipe.i18n/trunk/bootstrap.py	2010-10-05 14:41:03 UTC (rev 117251)
+++ z3c.recipe.i18n/trunk/bootstrap.py	2010-10-05 15:29:53 UTC (rev 117252)
@@ -1,6 +1,6 @@
 ##############################################################################
 #
-# Copyright (c) 2006 Zope Foundation and Contributors.
+# Copyright (c) 2006-2010 Zope Foundation and Contributors.
 # All Rights Reserved.
 #
 # This software is subject to the provisions of the Zope Public License,
@@ -16,112 +16,243 @@
 Simply run this script in a directory containing a buildout.cfg.
 The script accepts buildout command-line options, so you can
 use the -c option to specify an alternate configuration file.
-
-$Id: bootstrap.py 115394 2010-08-03 00:03:02Z gary $
 """
 
-import os, shutil, sys, tempfile, urllib2
+import os, shutil, sys, tempfile, textwrap, urllib, urllib2, subprocess
 from optparse import OptionParser
 
-tmpeggs = tempfile.mkdtemp()
+if sys.platform == 'win32':
+    def quote(c):
+        if ' ' in c:
+            return '"%s"' % c # work around spawn lamosity on windows
+        else:
+            return c
+else:
+    quote = str
 
+# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments.
+stdout, stderr = subprocess.Popen(
+    [sys.executable, '-Sc',
+     'try:\n'
+     '    import ConfigParser\n'
+     'except ImportError:\n'
+     '    print 1\n'
+     'else:\n'
+     '    print 0\n'],
+    stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
+has_broken_dash_S = bool(int(stdout.strip()))
+
+# In order to be more robust in the face of system Pythons, we want to
+# run without site-packages loaded.  This is somewhat tricky, in
+# particular because Python 2.6's distutils imports site, so starting
+# with the -S flag is not sufficient.  However, we'll start with that:
+if not has_broken_dash_S and 'site' in sys.modules:
+    # We will restart with python -S.
+    args = sys.argv[:]
+    args[0:0] = [sys.executable, '-S']
+    args = map(quote, args)
+    os.execv(sys.executable, args)
+# Now we are running with -S.  We'll get the clean sys.path, import site
+# because distutils will do it later, and then reset the path and clean
+# out any namespace packages from site-packages that might have been
+# loaded by .pth files.
+clean_path = sys.path[:]
+import site
+sys.path[:] = clean_path
+for k, v in sys.modules.items():
+    if (hasattr(v, '__path__') and
+        len(v.__path__)==1 and
+        not os.path.exists(os.path.join(v.__path__[0],'__init__.py'))):
+        # This is a namespace package.  Remove it.
+        sys.modules.pop(k)
+
 is_jython = sys.platform.startswith('java')
 
+setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py'
+distribute_source = 'http://python-distribute.org/distribute_setup.py'
+
 # parsing arguments
-parser = OptionParser(
-    'This is a custom version of the zc.buildout %prog script.  It is '
-    'intended to meet a temporary need if you encounter problems with '
-    'the zc.buildout 1.5 release.')
-parser.add_option("-v", "--version", dest="version", default='1.4.4',
-                          help='Use a specific zc.buildout version.  *This '
-                          'bootstrap script defaults to '
-                          '1.4.4, unlike usual buildpout bootstrap scripts.*')
+def normalize_to_url(option, opt_str, value, parser):
+    if value:
+        if '://' not in value: # It doesn't smell like a URL.
+            value = 'file://%s' % (
+                urllib.pathname2url(
+                    os.path.abspath(os.path.expanduser(value))),)
+        if opt_str == '--download-base' and not value.endswith('/'):
+            # Download base needs a trailing slash to make the world happy.
+            value += '/'
+    else:
+        value = None
+    name = opt_str[2:].replace('-', '_')
+    setattr(parser.values, name, value)
+
+usage = '''\
+[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
+
+Bootstraps a buildout-based project.
+
+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", 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.")
-
+                   action="store_true", dest="use_distribute", default=False,
+                   help="Use Distribute rather than Setuptools.")
+parser.add_option("--setup-source", action="callback", dest="setup_source",
+                  callback=normalize_to_url, nargs=1, type="string",
+                  help=("Specify a URL or file location for the setup file. "
+                        "If you use Setuptools, this will default to " +
+                        setuptools_source + "; if you use Distribute, this "
+                        "will default to " + distribute_source +"."))
+parser.add_option("--download-base", action="callback", dest="download_base",
+                  callback=normalize_to_url, nargs=1, type="string",
+                  help=("Specify a URL or directory for downloading "
+                        "zc.buildout and either Setuptools or Distribute. "
+                        "Defaults to PyPI."))
+parser.add_option("--eggs",
+                  help=("Specify a directory for storing eggs.  Defaults to "
+                        "a temporary directory that is deleted when the "
+                        "bootstrap script completes."))
+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", None, action="store", dest="config_file",
                    help=("Specify the path to the buildout configuration "
                          "file to be used."))
 
 options, args = parser.parse_args()
 
-# if -c was provided, we push it back into args for buildout' main function
+# if -c was provided, we push it back into args for buildout's main function
 if options.config_file is not None:
     args += ['-c', options.config_file]
 
-if options.version is not None:
-    VERSION = '==%s' % options.version
+if options.eggs:
+    eggs_dir = os.path.abspath(os.path.expanduser(options.eggs))
 else:
-    VERSION = ''
+    eggs_dir = tempfile.mkdtemp()
 
-USE_DISTRIBUTE = options.distribute
-args = args + ['bootstrap']
+if options.setup_source is None:
+    if options.use_distribute:
+        options.setup_source = distribute_source
+    else:
+        options.setup_source = setuptools_source
 
-to_reload = False
+if options.accept_buildout_test_releases:
+    args.append('buildout:accept-buildout-test-releases=true')
+args.append('bootstrap')
+
 try:
     import pkg_resources
+    import setuptools # A flag.  Sometimes pkg_resources is installed alone.
     if not hasattr(pkg_resources, '_distribute'):
-        to_reload = True
         raise ImportError
 except ImportError:
+    ez_code = urllib2.urlopen(
+        options.setup_source).read().replace('\r\n', '\n')
     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)
+    exec ez_code in ez
+    setup_args = dict(to_dir=eggs_dir, download_delay=0)
+    if options.download_base:
+        setup_args['download_base'] = options.download_base
+    if options.use_distribute:
+        setup_args['no_fake'] = True
+    ez['use_setuptools'](**setup_args)
+    reload(sys.modules['pkg_resources'])
+    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)
 
-    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
-
-ws  = pkg_resources.working_set
-
-if USE_DISTRIBUTE:
-    requirement = 'distribute'
-else:
-    requirement = 'setuptools'
-
-env = dict(os.environ,
-           PYTHONPATH=
-           ws.find(pkg_resources.Requirement.parse(requirement)).location
-           )
-
 cmd = [quote(sys.executable),
        '-c',
        quote('from setuptools.command.easy_install import main; main()'),
        '-mqNxd',
-       quote(tmpeggs)]
+       quote(eggs_dir)]
 
-if 'bootstrap-testing-find-links' in os.environ:
-    cmd.extend(['-f', os.environ['bootstrap-testing-find-links']])
+if not has_broken_dash_S:
+    cmd.insert(1, '-S')
 
-cmd.append('zc.buildout' + VERSION)
+find_links = options.download_base
+if not find_links:
+    find_links = os.environ.get('bootstrap-testing-find-links')
+if find_links:
+    cmd.extend(['-f', quote(find_links)])
 
+if options.use_distribute:
+    setup_requirement = 'distribute'
+else:
+    setup_requirement = 'setuptools'
+ws = pkg_resources.working_set
+setup_requirement_path = ws.find(
+    pkg_resources.Requirement.parse(setup_requirement)).location
+env = dict(
+    os.environ,
+    PYTHONPATH=setup_requirement_path)
+
+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=[setup_requirement_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)
+
 if is_jython:
     import subprocess
     exitcode = subprocess.Popen(cmd, env=env).wait()
 else: # Windows prefers this, apparently; otherwise we would prefer subprocess
     exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env]))
-assert exitcode == 0
+if exitcode != 0:
+    sys.stdout.flush()
+    sys.stderr.flush()
+    print ("An error occurred when trying to install zc.buildout. "
+           "Look above this message for any errors that "
+           "were output by easy_install.")
+    sys.exit(exitcode)
 
-ws.add_entry(tmpeggs)
-ws.require('zc.buildout' + VERSION)
+ws.add_entry(eggs_dir)
+ws.require(requirement)
 import zc.buildout.buildout
 zc.buildout.buildout.main(args)
-shutil.rmtree(tmpeggs)
+if not options.eggs: # clean up temporary egg directory
+    shutil.rmtree(eggs_dir)

Modified: z3c.recipe.i18n/trunk/buildout-zope212.cfg
===================================================================
--- z3c.recipe.i18n/trunk/buildout-zope212.cfg	2010-10-05 14:41:03 UTC (rev 117251)
+++ z3c.recipe.i18n/trunk/buildout-zope212.cfg	2010-10-05 15:29:53 UTC (rev 117252)
@@ -10,6 +10,8 @@
 lovely.recipe = 1.0.0
 # XXX: zc.buildout 1.4.4 picks wrong z3c.recipe.i18n version
 zc.buildout = 1.5.1
+z3c.recipe.scripts = 1.0.1
+zc.recipe.egg = 1.3.2
 
 [test]
 recipe = zc.recipe.testrunner

Modified: z3c.recipe.i18n/trunk/buildout-ztk10.cfg
===================================================================
--- z3c.recipe.i18n/trunk/buildout-ztk10.cfg	2010-10-05 14:41:03 UTC (rev 117251)
+++ z3c.recipe.i18n/trunk/buildout-ztk10.cfg	2010-10-05 15:29:53 UTC (rev 117252)
@@ -11,6 +11,8 @@
 lovely.recipe = 1.0.0
 # XXX: zc.buildout 1.4.4 picks wrong z3c.recipe.i18n version
 zc.buildout = 1.5.1
+z3c.recipe.scripts = 1.0.1
+zc.recipe.egg = 1.3.2
 
 [test]
 recipe = zc.recipe.testrunner

Modified: z3c.recipe.i18n/trunk/setup.py
===================================================================
--- z3c.recipe.i18n/trunk/setup.py	2010-10-05 14:41:03 UTC (rev 117251)
+++ z3c.recipe.i18n/trunk/setup.py	2010-10-05 15:29:53 UTC (rev 117252)
@@ -26,7 +26,7 @@
 
 setup(
     name = 'z3c.recipe.i18n',
-    version = '0.7.1dev',
+    version = '0.8.0dev',
     author = 'Roger Ineichen and the Zope Community',
     author_email = 'zope-dev at zope.org',
     description = 'Zope3 egg based i18n locales extration recipes',
@@ -82,7 +82,7 @@
     install_requires = [
         'setuptools',
         'zc.buildout',
-        'zc.recipe.egg',
+        'z3c.recipe.scripts',
         'zope.app.appsetup',
         'zope.app.locales[extract]>=3.5.0',
         'zope.configuration',

Modified: z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/README.txt
===================================================================
--- z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/README.txt	2010-10-05 14:41:03 UTC (rev 117251)
+++ z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/README.txt	2010-10-05 15:29:53 UTC (rev 117252)
@@ -70,7 +70,7 @@
   verify_domain is False otherwise only retrive the messages of the
   specified domain. (False if not used)
 
-exludeDirectoryName (optional, default=[])
+excludeDirectoryName (optional, default=[])
   Allows to specify one or more directory name, relative to the package, to
   exclude. (None if not used)
 
@@ -85,7 +85,63 @@
 extraPaths
    A new line separated list of directories which are added to the PYTHONPATH.
 
+relative-paths
+    Use egg, test, and working-directory paths relative to the test script.
 
+include-site-packages
+    You can choose to have the site-packages of the underlying Python
+    available to your script or interpreter, in addition to the packages
+    from your eggs.  See `the z3c.recipe.scripts documentation`_ for
+    motivations and warnings.  You can just set this in your [buildout]
+    section or override it in the recipe's section.
+
+allowed-eggs-from-site-packages
+    Sometimes you need or want to control what eggs from site-packages are
+    used. The allowed-eggs-from-site-packages option allows you to specify a
+    whitelist of project names that may be included from site-packages.  You
+    can use globs to specify the value.  It defaults to a single value of '*',
+    indicating that any package may come from site-packages.
+
+    Here's a usage example::
+
+        [buildout]
+        ...
+
+        allowed-eggs-from-site-packages =
+            demo
+            bigdemo
+            zope.*
+
+    This option interacts with the ``include-site-packages`` option in the
+    following ways.
+
+    If ``include-site-packages`` is true, then
+    ``allowed-eggs-from-site-packages`` filters what eggs from site-packages
+    may be chosen.  Therefore, if ``allowed-eggs-from-site-packages`` is an
+    empty list, then no eggs from site-packages are chosen, but site-packages
+    will still be included at the end of path lists.
+
+    If ``include-site-packages`` is false, the value of
+    ``allowed-eggs-from-site-packages`` is irrelevant.
+
+    You can just set this in your [buildout] section or override it in
+    the recipe's section.
+
+extends
+    You can extend another section using this value.  It is intended to help
+    you avoid repeating yourself.
+
+exec-sitecustomize
+    Normally the Python's real sitecustomize module is not processed.
+    If you want it to be processed, set this value to 'true'.  This will
+    be honored irrespective of the setting for include-site-packages.
+
+    You can just set this in your [buildout] section or override it in
+    the recipe's section.
+
+.. _`the z3c.recipe.scripts documentation`:
+    http://pypi.python.org/pypi/z3c.recipe.scripts#including-site-packages-and-sitecustomize
+
 Test
 ****
 
@@ -156,18 +212,31 @@
   <BLANKLINE>
   import sys
   sys.path[0:0] = [
-  ...
-    ]
+      '/sample-buildout/parts/i18n',
+      ]
   <BLANKLINE>
+  <BLANKLINE>
   import os
+  path = sys.path[0]
+  if os.environ.get('PYTHONPATH'):
+      os.environ['BUILDOUT_ORIGINAL_PYTHONPATH'] = os.environ['PYTHONPATH']
+      path = os.pathsep.join([path, os.environ['PYTHONPATH']])
+  os.environ['PYTHONPATH'] = path
+  import site # imports custom buildout-generated site.py
+  import os
   sys.argv[0] = os.path.abspath(sys.argv[0])
   os.chdir('...src')
   <BLANKLINE>
-  <BLANKLINE>
   import z3c.recipe.i18n.i18nextract
   <BLANKLINE>
   if __name__ == '__main__':
-      z3c.recipe.i18n.i18nextract.main(['i18nextract', '-d', 'recipe', '-s', '/sample-buildout/parts/i18n/configure.zcml', '-o', '/sample-buildout/outputDir', '-p', 'demo1'])
+      z3c.recipe.i18n.i18nextract.main(
+          [sys.argv[0],
+           '-d', 'recipe',
+           '-s', '/sample-buildout/parts/i18n/configure.zcml',
+           '-o', '/sample-buildout/outputDir',
+           '-p', 'demo1'
+          ])
 
 i18nmergeall
 ------------
@@ -175,17 +244,25 @@
 The i18nmergeall.py contains the following code:
 
   >>> cat('bin', 'i18nmergeall')
-  #!C:\Python24\python.exe
   <BLANKLINE>
   import sys
   sys.path[0:0] = [
-    ...
-    ]
+      '/sample-buildout/parts/i18n',
+      ]
   <BLANKLINE>
+  <BLANKLINE>
+  import os
+  path = sys.path[0]
+  if os.environ.get('PYTHONPATH'):
+      os.environ['BUILDOUT_ORIGINAL_PYTHONPATH'] = os.environ['PYTHONPATH']
+      path = os.pathsep.join([path, os.environ['PYTHONPATH']])
+  os.environ['PYTHONPATH'] = path
+  import site # imports custom buildout-generated site.py
+  <BLANKLINE>
   import z3c.recipe.i18n.i18nmergeall
   <BLANKLINE>
   if __name__ == '__main__':
-      z3c.recipe.i18n.i18nmergeall.main(['i18nmergeall', '-l', '...outputDir'])
+      z3c.recipe.i18n.i18nmergeall.main([sys.argv[0], '-l', '...outputDir'])
 
 i18nstats
 ---------
@@ -193,42 +270,58 @@
 The i18nstats.py contains the following code:
 
   >>> cat('bin', 'i18nstats')
-  #!C:\Python24\python.exe
   <BLANKLINE>
   import sys
   sys.path[0:0] = [
-    ...
-    ]
+      '/sample-buildout/parts/i18n',
+      ]
   <BLANKLINE>
+  <BLANKLINE>
+  import os
+  path = sys.path[0]
+  if os.environ.get('PYTHONPATH'):
+      os.environ['BUILDOUT_ORIGINAL_PYTHONPATH'] = os.environ['PYTHONPATH']
+      path = os.pathsep.join([path, os.environ['PYTHONPATH']])
+  os.environ['PYTHONPATH'] = path
+  import site # imports custom buildout-generated site.py
+  <BLANKLINE>
   import z3c.recipe.i18n.i18nstats
   <BLANKLINE>
   if __name__ == '__main__':
-      z3c.recipe.i18n.i18nstats.main(['i18nstats', '-l', '...outputDir'])
+      z3c.recipe.i18n.i18nstats.main([sys.argv[0], '-l', '...outputDir'])
 
-
 i18ncompile
 -----------
 
 The i18ncompile.py contains the following code:
 
   >>> cat('bin', 'i18ncompile')
-  #!C:\Python24\python.exe
   <BLANKLINE>
   import sys
   sys.path[0:0] = [
-    ...
-    ]
+      '/sample-buildout/parts/i18n',
+      ]
   <BLANKLINE>
+  <BLANKLINE>
+  import os
+  path = sys.path[0]
+  if os.environ.get('PYTHONPATH'):
+      os.environ['BUILDOUT_ORIGINAL_PYTHONPATH'] = os.environ['PYTHONPATH']
+      path = os.pathsep.join([path, os.environ['PYTHONPATH']])
+  os.environ['PYTHONPATH'] = path
+  import site # imports custom buildout-generated site.py
+  <BLANKLINE>
   import z3c.recipe.i18n.i18ncompile
   <BLANKLINE>
   if __name__ == '__main__':
-      z3c.recipe.i18n.i18ncompile.main(['i18ncompile', '-l', '...outputDir'])
+      z3c.recipe.i18n.i18ncompile.main([sys.argv[0], '-l', '...outputDir'])
 
 
 Full Sample
 -----------
 
-Lets create a `buildout.cfg` file using all available arguments:
+Lets create a `buildout.cfg` file using all available arguments that are
+implemented directly in this package:
 
   >>> write('buildout.cfg',
   ... '''
@@ -250,7 +343,7 @@
   ... excludeDefaultDomain = true
   ... pythonOnly = true
   ... verify_domain = true
-  ... exludeDirectoryName = foo
+  ... excludeDirectoryName = foo
   ...                       bar
   ... headerTemplate = pot_header.txt
   ... environment = testenv
@@ -287,41 +380,299 @@
   <BLANKLINE>
   import sys
   sys.path[0:0] = [
-      ...
-      '/sample-buildout/extra/path/1',
-      '/sample-buildout/extra/path/2',
-    ]
+      '/sample-buildout/parts/i18n',
+      ]
   <BLANKLINE>
+  <BLANKLINE>
   import os
+  path = sys.path[0]
+  if os.environ.get('PYTHONPATH'):
+      os.environ['BUILDOUT_ORIGINAL_PYTHONPATH'] = os.environ['PYTHONPATH']
+      path = os.pathsep.join([path, os.environ['PYTHONPATH']])
+  os.environ['PYTHONPATH'] = path
+  import site # imports custom buildout-generated site.py
+  import os
   sys.argv[0] = os.path.abspath(sys.argv[0])
   os.chdir('...src')
   os.environ['fooDir'] = '/sample-buildout/parts/foo'
   <BLANKLINE>
+  import z3c.recipe.i18n.i18nextract
   <BLANKLINE>
+  if __name__ == '__main__':
+      z3c.recipe.i18n.i18nextract.main(
+          [sys.argv[0],
+           '-d', 'recipe',
+           '-s', '/sample-buildout/parts/i18n/configure.zcml',
+           '-o', '/sample-buildout/outputDir',
+           '--exclude-default-domain',
+           '--python-only',
+           '--verify-domain',
+           '-m', 'z3c.csvvocabulary.csvStrings',
+           '-p', 'demo1',
+           '-x', 'foo',
+           '-x', 'bar',
+           '-t', '/sample-buildout/pot_header.txt'
+          ])
+
+The site.py has inserted the extraPaths.
+
+  >>> cat('parts', 'i18n', 'site.py')
+  "...
+  def addsitepackages(known_paths):
+      """Add site packages, as determined by zc.buildout.
+  <BLANKLINE>
+      See original_addsitepackages, below, for the original version."""
+      buildout_paths = [
+          ...
+          '/sample-buildout/extra/path/1',
+          '/sample-buildout/extra/path/2'
+          ]
+      for path in buildout_paths:
+          sitedir, sitedircase = makepath(path)
+          if not sitedircase in known_paths and os.path.exists(sitedir):
+              sys.path.append(sitedir)
+              known_paths.add(sitedircase)
+      return known_paths
+  <BLANKLINE>
+  ...
+
+i18nmergeall
+------------
+
+The i18nmergeall.py contains the following code:
+
+  >>> cat('bin', 'i18nmergeall')
+  <BLANKLINE>
+  import sys
+  sys.path[0:0] = [
+      '/sample-buildout/parts/i18n',
+      ]
+  <BLANKLINE>
+  <BLANKLINE>
+  import os
+  path = sys.path[0]
+  if os.environ.get('PYTHONPATH'):
+      os.environ['BUILDOUT_ORIGINAL_PYTHONPATH'] = os.environ['PYTHONPATH']
+      path = os.pathsep.join([path, os.environ['PYTHONPATH']])
+  os.environ['PYTHONPATH'] = path
+  import site # imports custom buildout-generated site.py
+  <BLANKLINE>
+  import z3c.recipe.i18n.i18nmergeall
+  <BLANKLINE>
+  if __name__ == '__main__':
+      z3c.recipe.i18n.i18nmergeall.main([sys.argv[0], '-l', '...outputDir'])
+
+i18nstats
+---------
+
+The i18nstats.py contains the following code:
+
+  >>> cat('bin', 'i18nstats')
+  <BLANKLINE>
+  import sys
+  sys.path[0:0] = [
+      '/sample-buildout/parts/i18n',
+      ]
+  <BLANKLINE>
+  <BLANKLINE>
+  import os
+  path = sys.path[0]
+  if os.environ.get('PYTHONPATH'):
+      os.environ['BUILDOUT_ORIGINAL_PYTHONPATH'] = os.environ['PYTHONPATH']
+      path = os.pathsep.join([path, os.environ['PYTHONPATH']])
+  os.environ['PYTHONPATH'] = path
+  import site # imports custom buildout-generated site.py
+  <BLANKLINE>
+  import z3c.recipe.i18n.i18nstats
+  <BLANKLINE>
+  if __name__ == '__main__':
+      z3c.recipe.i18n.i18nstats.main([sys.argv[0], '-l', '...outputDir'])
+
+Alternate Full Sample
+---------------------
+
+Now let's do it again using all available arguments plus three delegated
+delegated internally to code in z3c.recipe.filetemplate:
+include-site-packages, extends, and relative-paths.
+
+This example also uses the legacy name "exludeDirectoryName" instead of
+"excludeDirectoryName," to show that it still works.
+
+  >>> write('buildout.cfg',
+  ... '''
+  ... [buildout]
+  ... parts = i18n
+  ... offline = true
+  ... include-site-packages = true
+  ... relative-paths = true
+  ...
+  ... [testenv]
+  ... fooDir = ${buildout:directory}/parts/foo
+  ...
+  ... [shared]
+  ... eggs = z3c.recipe.i18n
+  ... excludeDefaultDomain = true
+  ... pythonOnly = true
+  ... verify_domain = true
+  ... headerTemplate = pot_header.txt
+  ... environment = testenv
+  ...
+  ... [i18n]
+  ... recipe = z3c.recipe.i18n:i18n
+  ... extends = shared
+  ... packages = demo1
+  ... domain = recipe
+  ... output = outputDir
+  ... zcml = <include package="z3c.recipe.tests" file="extract.zcml" />"
+  ... maker = z3c.csvvocabulary.csvStrings
+  ... exludeDirectoryName = foo
+  ...                       bar
+  ... extraPaths = extra/path/1
+  ...              extra/path/2
+  ... ''' % globals())
+
+Now, Let's run the buildout and see what we get:
+
+  >>> print system(join('bin', 'buildout')),
+  Uninstalling i18n.
+  Installing i18n.
+  i18n: setting up i18n tools
+  Generated script '/sample-buildout/bin/i18nextract'.
+  Generated script '/sample-buildout/bin/i18nmergeall'.
+  Generated script '/sample-buildout/bin/i18nstats'.
+  Generated script '/sample-buildout/bin/i18ncompile'.
+
+After running buildout, the bin folder contains the different i18n script:
+
+  >>> ls('bin')
+  -  buildout
+  -  i18ncompile
+  -  i18nextract
+  -  i18nmergeall
+  -  i18nstats
+
+i18nextract
+-----------
+
+The i18nextract.py contains the following code:
+
+  >>> cat('bin', 'i18nextract')
+  <BLANKLINE>
+  import os
+  <BLANKLINE>
+  join = os.path.join
+  base = os.path.dirname(os.path.abspath(os.path.realpath(__file__)))
+  base = os.path.dirname(base)
+  <BLANKLINE>
+  import sys
+  sys.path[0:0] = [
+      join(base, 'parts/i18n'),
+      ]
+  <BLANKLINE>
+  <BLANKLINE>
+  import os
+  path = sys.path[0]
+  if os.environ.get('PYTHONPATH'):
+      os.environ['BUILDOUT_ORIGINAL_PYTHONPATH'] = os.environ['PYTHONPATH']
+      path = os.pathsep.join([path, os.environ['PYTHONPATH']])
+  os.environ['PYTHONPATH'] = path
+  import site # imports custom buildout-generated site.py
+  import os
+  sys.argv[0] = os.path.abspath(sys.argv[0])
+  os.chdir('...src')
+  os.environ['fooDir'] = '/sample-buildout/parts/foo'
+  <BLANKLINE>
   import z3c.recipe.i18n.i18nextract
   <BLANKLINE>
   if __name__ == '__main__':
-      z3c.recipe.i18n.i18nextract.main(['i18nextract', '-d', 'recipe', '-s', '/sample-buildout/parts/i18n/configure.zcml', '-o', '/sample-buildout/outputDir', '--exclude-default-domain', '--python-only', '--verify-domain', '-m', 'z3c.csvvocabulary.csvStrings', '-p', 'demo1', '-x', 'foo', '-x', 'bar', '-t', '/sample-buildout/pot_header.txt'])
+      z3c.recipe.i18n.i18nextract.main(
+          [sys.argv[0],
+           '-d', 'recipe',
+           '-s', join(base, 'parts/i18n/configure.zcml'),
+           '-o', join(base, 'outputDir'),
+           '--exclude-default-domain',
+           '--python-only',
+           '--verify-domain',
+           '-m', 'z3c.csvvocabulary.csvStrings',
+           '-p', 'demo1',
+           '-x', 'foo',
+           '-x', 'bar',
+           '-t', join(base, 'pot_header.txt')
+          ])
 
+Notice that the environ was not relativized, because it was inserted directly
+as a string.  This is a current limitation of the relative-paths support.
+
+The site.py has inserted the extraPaths, all paths are relative, and
+original_paths are included.
+
+  >>> cat('parts', 'i18n', 'site.py')
+  "...
+  def addsitepackages(known_paths):
+      """Add site packages, as determined by zc.buildout.
+  <BLANKLINE>
+      See original_addsitepackages, below, for the original version."""
+      join = os.path.join
+      base = os.path.dirname(os.path.abspath(os.path.realpath(__file__)))
+      base = os.path.dirname(base)
+      base = os.path.dirname(base)
+      setuptools_path = join(base, 'eggs/...-pyN.N.egg')
+      sys.path.append(setuptools_path)
+      known_paths.add(os.path.normcase(setuptools_path))
+      import pkg_resources
+      buildout_paths = [
+          ...
+          join(base, 'extra/path/1'),
+          join(base, 'extra/path/2')
+          ]
+      for path in buildout_paths:
+          sitedir, sitedircase = makepath(path)
+          if not sitedircase in known_paths and os.path.exists(sitedir):
+              sys.path.append(sitedir)
+              known_paths.add(sitedircase)
+              pkg_resources.working_set.add_entry(sitedir)
+      sys.__egginsert = len(buildout_paths) # Support distribute.
+      original_paths = [
+          ...
+          ]
+      for path in original_paths:
+          if path == setuptools_path or path not in known_paths:
+              addsitedir(path, known_paths)
+      return known_paths
+  <BLANKLINE>
+  ...
+
 i18nmergeall
 ------------
 
 The i18nmergeall.py contains the following code:
 
   >>> cat('bin', 'i18nmergeall')
-  #!C:\Python24\python.exe
   <BLANKLINE>
+  import os
+  <BLANKLINE>
+  join = os.path.join
+  base = os.path.dirname(os.path.abspath(os.path.realpath(__file__)))
+  base = os.path.dirname(base)
+  <BLANKLINE>
   import sys
   sys.path[0:0] = [
-      ...
-      '/sample-buildout/extra/path/1',
-      '/sample-buildout/extra/path/2',
-    ]
+      join(base, 'parts/i18n'),
+      ]
   <BLANKLINE>
+  <BLANKLINE>
+  import os
+  path = sys.path[0]
+  if os.environ.get('PYTHONPATH'):
+      os.environ['BUILDOUT_ORIGINAL_PYTHONPATH'] = os.environ['PYTHONPATH']
+      path = os.pathsep.join([path, os.environ['PYTHONPATH']])
+  os.environ['PYTHONPATH'] = path
+  import site # imports custom buildout-generated site.py
+  <BLANKLINE>
   import z3c.recipe.i18n.i18nmergeall
   <BLANKLINE>
   if __name__ == '__main__':
-      z3c.recipe.i18n.i18nmergeall.main(['i18nmergeall', '-l', '...outputDir'])
+      z3c.recipe.i18n.i18nmergeall.main([sys.argv[0], '-l', join(base, 'outputDir')])
 
 i18nstats
 ---------
@@ -329,16 +680,28 @@
 The i18nstats.py contains the following code:
 
   >>> cat('bin', 'i18nstats')
-  #!C:\Python24\python.exe
   <BLANKLINE>
+  import os
+  <BLANKLINE>
+  join = os.path.join
+  base = os.path.dirname(os.path.abspath(os.path.realpath(__file__)))
+  base = os.path.dirname(base)
+  <BLANKLINE>
   import sys
   sys.path[0:0] = [
-      ...
-      '/sample-buildout/extra/path/1',
-      '/sample-buildout/extra/path/2',
-    ]
+      join(base, 'parts/i18n'),
+      ]
   <BLANKLINE>
+  <BLANKLINE>
+  import os
+  path = sys.path[0]
+  if os.environ.get('PYTHONPATH'):
+      os.environ['BUILDOUT_ORIGINAL_PYTHONPATH'] = os.environ['PYTHONPATH']
+      path = os.pathsep.join([path, os.environ['PYTHONPATH']])
+  os.environ['PYTHONPATH'] = path
+  import site # imports custom buildout-generated site.py
+  <BLANKLINE>
   import z3c.recipe.i18n.i18nstats
   <BLANKLINE>
   if __name__ == '__main__':
-      z3c.recipe.i18n.i18nstats.main(['i18nstats', '-l', '...outputDir'])
+      z3c.recipe.i18n.i18nstats.main([sys.argv[0], '-l', join(base, 'outputDir')])

Modified: z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/i18n.py
===================================================================
--- z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/i18n.py	2010-10-05 14:41:03 UTC (rev 117251)
+++ z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/i18n.py	2010-10-05 15:29:53 UTC (rev 117252)
@@ -12,15 +12,16 @@
 #
 ##############################################################################
 """
-$Id$
+A Buildout recipe for i18n scripts.
 """
 __docformat__ = 'restructuredtext'
 
+import logging
 import os
-import logging
+import sys
 
 import zc.buildout
-import zc.recipe.egg
+import z3c.recipe.scripts.scripts
 
 import pkg_resources
 
@@ -39,7 +40,7 @@
 
 initialization_template = """import os
 sys.argv[0] = os.path.abspath(sys.argv[0])
-os.chdir(%r)
+os.chdir(%s)
 """
 
 
@@ -53,147 +54,196 @@
         self.buildout = buildout
         self.name = name
         self.options = options
+        # We do this early so the "extends" functionality works before we get
+        # to the other options below.
+        self._delegated = z3c.recipe.scripts.scripts.Base(
+            buildout, name, options)
         if 'eggs' not in self.options:
             self.options['eggs'] = ''
         self.options['eggs'] = self.options['eggs'] + '\n' \
                              + 'zope.app.locales [extract]'
-        self.egg = zc.recipe.egg.Egg(buildout, name, options)
 
     def install(self):
         logging.getLogger(self.name).info('setting up i18n tools')
-
-        requirements, ws = self.egg.working_set()
-
-        excludeDefaultDomain = self.options.get('excludeDefaultDomain',
+        requirements, ws = self._delegated.working_set()
+        options = self.options
+        excludeDefaultDomain = options.get('excludeDefaultDomain',
             False)
 
-        pythonOnly = self.options.get('pythonOnly', False)
-        verify_domain = self.options.get('verify_domain', False)
+        pythonOnly = options.get('pythonOnly', False)
+        verify_domain = options.get('verify_domain', False)
 
         # setup configuration file
-        zcml = self.options.get('zcml', None)
+        zcml = options.get('zcml', None)
         if zcml is None:
             raise zc.buildout.UserError('No zcml configuration defined.')
         zcml = zcmlTemplate % zcml
 
         # get domain
-        domain = self.options.get('domain', None)
+        domain = options.get('domain', None)
         if domain is None:
             raise zc.buildout.UserError('No domain given.')
 
         # get output path
-        output = self.options.get('output', None)
+        output = options.get('output', None)
         if output is None:
             raise zc.buildout.UserError('No output path given.')
         output = os.path.abspath(output)
 
-        partsDir = os.path.join(
-                self.buildout['buildout']['parts-directory'],
-                self.name,
-                )
+        generated = []
+        partsDir = options['parts-directory']
         if not os.path.exists(partsDir):
             os.mkdir(partsDir)
+            generated.append(partsDir)
         zcmlFilename = os.path.join(partsDir, 'configure.zcml')
         file(zcmlFilename, 'w').write(zcml)
+        generated.append(zcmlFilename)
 
+        if self._delegated._relative_paths:
+            _maybe_relativize = lambda path: _relativize(
+                self._delegated._relative_paths, path)
+        else:
+            _maybe_relativize = lambda path: repr(path)
+
+        zcmlFilename = _maybe_relativize(zcmlFilename)
+        output = _maybe_relativize(output)
+
         # Generate i18nextract
-        arguments = ['%sextract'% self.name,
-                     '-d', domain,
-                     '-s', zcmlFilename,
-                     '-o', output,
-                    ]
+        arguments = ['sys.argv[0]']
+        def add_reprs(*args):
+            args = list(args)
+            arguments.append("\n         " + repr(args.pop(0)))
+            arguments.extend(repr(arg) for arg in args)
+        add_reprs('-d', domain)
+        arguments.extend(["\n         " + repr('-s'), zcmlFilename])
+        arguments.extend(["\n         " + repr('-o'), output])
 
         if excludeDefaultDomain:
-            arguments.extend(['--exclude-default-domain'])
+            add_reprs('--exclude-default-domain')
 
         if pythonOnly:
-            arguments.extend(['--python-only'])
+            add_reprs('--python-only')
 
         if verify_domain:
-            arguments.extend(['--verify-domain'])
+            add_reprs('--verify-domain')
 
-        makers = [m for m in self.options.get('maker', '').split() if m!='']
+        makers = [m for m in options.get('maker', '').split() if m!='']
         for m in makers:
-            arguments.extend(['-m', m])
+            add_reprs('-m', m)
 
         # add package names as -p multi option
-        packages = [p for p in self.options.get('packages', '').split()
+        packages = [p for p in options.get('packages', '').split()
                     if p!='']
         for p in packages:
-            arguments.extend(['-p', p])
+            add_reprs('-p', p)
 
-        exludeDirNames = [x for x
-                          in self.options.get('exludeDirectoryName', '').split()
-                          if x!='']
-        for x in exludeDirNames:
-            arguments.extend(['-x', x])
+        # This code used to have a typo: the option was exludeDirectoryName
+        # instead of excludeDirectoryName.  For backwards compatibility,
+        # allow the old value, though prefer the properly-spelled one.
+        excludeDirNames_raw = options.get(
+            'excludeDirectoryName', options.get('exludeDirectoryName', ''))
+        excludeDirNames = [x for x in excludeDirNames_raw.split() if x!='']
+        for x in excludeDirNames:
+            arguments.extend(
+                ["\n         " + repr('-x'), _maybe_relativize(x)])
 
-        header_template = self.options.get('headerTemplate', None)
+        header_template = options.get('headerTemplate', None)
         if header_template is not None:
             header_template = os.path.normpath(
                 os.path.join(self.buildout['buildout']['directory'],
                              header_template.strip()))
-            arguments.extend(['-t', header_template])
+            arguments.extend(
+                ["\n         " + repr('-t'),
+                 _maybe_relativize(header_template)])
 
-        initialization = initialization_template % this_loc
-        env_section = self.options.get('environment', '').strip()
+        arguments = '\n        [' + ', '.join(arguments) + '\n        ]'
+        initialization = initialization_template % _maybe_relativize(this_loc)
+        env_section = options.get('environment', '').strip()
         if env_section:
             env = self.buildout[env_section]
             for key, value in env.items():
                 initialization += env_template % (key, value)
         extra_paths = (
-            [this_loc] + self.options.get('extraPaths', '').split('\n'))
+            [this_loc] + options.get('extraPaths', '').split('\n'))
         extra_paths = [p for p in extra_paths if p]
 
         # Generate i18nextract
-        generated = zc.buildout.easy_install.scripts(
-            [('%sextract'% self.name, 'z3c.recipe.i18n.i18nextract', 'main')],
-            ws, self.options['executable'],
-            self.buildout['buildout']['bin-directory'],
-            extra_paths = extra_paths,
-            arguments = arguments,
-            initialization = initialization,
-            )
+        generated.extend(zc.buildout.easy_install.sitepackage_safe_scripts(
+            self.buildout['buildout']['bin-directory'], ws,
+            options['executable'], partsDir,
+            reqs=[('%sextract'% self.name,
+                   'z3c.recipe.i18n.i18nextract',
+                   'main')],
+            extra_paths=extra_paths,
+            include_site_packages=self._delegated.include_site_packages,
+            exec_sitecustomize=self._delegated.exec_sitecustomize,
+            relative_paths=self._delegated._relative_paths,
+            script_arguments=arguments,
+            script_initialization=initialization,
+            ))
 
         # Generate i18nmergeall
-        arguments = ['%smergeall'% self.name, '-l', output]
         generated.extend(
-            zc.buildout.easy_install.scripts(
-                [('%smergeall'% self.name,
-                  'z3c.recipe.i18n.i18nmergeall',
-                  'main')],
-                ws, self.options['executable'],
-                self.buildout['buildout']['bin-directory'],
-                extra_paths = extra_paths,
-                arguments = arguments,
-            ))
+            item for item in
+            zc.buildout.easy_install.sitepackage_safe_scripts(
+                self.buildout['buildout']['bin-directory'], ws,
+                options['executable'], partsDir,
+                reqs=[('%smergeall'% self.name,
+                       'z3c.recipe.i18n.i18nmergeall',
+                       'main')],
+                extra_paths=extra_paths,
+                include_site_packages=self._delegated.include_site_packages,
+                exec_sitecustomize=self._delegated.exec_sitecustomize,
+                relative_paths=self._delegated._relative_paths,
+                script_arguments="[sys.argv[0], '-l', %s]" % output,)
+            if item not in generated)
 
         # Generate i18nstats
-        arguments = ['%sstats'% self.name, '-l', output]
         generated.extend(
-            zc.buildout.easy_install.scripts(
-                [('%sstats'% self.name,
-                  'z3c.recipe.i18n.i18nstats',
-                  'main')],
-                ws, self.options['executable'],
-                self.buildout['buildout']['bin-directory'],
-                extra_paths = extra_paths,
-                arguments = arguments,
-            ))
+            item for item in
+            zc.buildout.easy_install.sitepackage_safe_scripts(
+                self.buildout['buildout']['bin-directory'], ws,
+                options['executable'], partsDir,
+                reqs=[('%sstats'% self.name,
+                       'z3c.recipe.i18n.i18nstats',
+                       'main')],
+                extra_paths=extra_paths,
+                include_site_packages=self._delegated.include_site_packages,
+                exec_sitecustomize=self._delegated.exec_sitecustomize,
+                relative_paths=self._delegated._relative_paths,
+                script_arguments="[sys.argv[0], '-l', %s]" % output,)
+            if item not in generated)
 
         # Generate i18ncompile
-        arguments = ['%scompile'% self.name, '-l', output]
         generated.extend(
-            zc.buildout.easy_install.scripts(
-                [('%scompile'% self.name,
-                  'z3c.recipe.i18n.i18ncompile',
-                  'main')],
-                ws, self.options['executable'],
-                self.buildout['buildout']['bin-directory'],
-                extra_paths = extra_paths,
-                arguments = arguments,
-            ))
+            item for item in
+            zc.buildout.easy_install.sitepackage_safe_scripts(
+                self.buildout['buildout']['bin-directory'], ws,
+                options['executable'], partsDir,
+                reqs=[('%scompile'% self.name,
+                       'z3c.recipe.i18n.i18ncompile',
+                       'main')],
+                extra_paths=extra_paths,
+                include_site_packages=self._delegated.include_site_packages,
+                exec_sitecustomize=self._delegated.exec_sitecustomize,
+                relative_paths=self._delegated._relative_paths,
+                script_arguments="[sys.argv[0], '-l', %s]" % output,)
+            if item not in generated)
 
         return generated
 
     update = install
+
+
+def _relativize(base, path):
+    base += os.path.sep
+    if sys.platform == 'win32':
+        #windoze paths are case insensitive, but startswith is not
+        base = base.lower()
+        path = path.lower()
+
+    if path.startswith(base):
+        path = 'join(base, %r)' % path[len(base):]
+    else:
+        path = repr(path)
+    return path

Modified: z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/i18nextract.py
===================================================================
--- z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/i18nextract.py	2010-10-05 14:41:03 UTC (rev 117251)
+++ z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/i18nextract.py	2010-10-05 15:29:53 UTC (rev 117252)
@@ -18,7 +18,7 @@
 This tool will extract all findable message strings from all
 internationalizable files in your defined eggs product. It only extracts
 message ids of the specified domain. It defaults to the 'z3c' domain and the
-z3c package whihc use the shared 'z3c' i18n namespace.
+z3c packages which use the shared 'z3c' i18n namespace.
 
 Note: The Python Code extraction tool does not support domain
       registration, so that all message strings are returned for

Modified: z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/tests.py
===================================================================
--- z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/tests.py	2010-10-05 14:41:03 UTC (rev 117251)
+++ z3c.recipe.i18n/trunk/src/z3c/recipe/i18n/tests.py	2010-10-05 15:29:53 UTC (rev 117252)
@@ -27,6 +27,7 @@
     zc.buildout.testing.install('transaction', test)
     zc.buildout.testing.install('zc.lockfile', test)
     zc.buildout.testing.install('zc.recipe.egg', test)
+    zc.buildout.testing.install('z3c.recipe.scripts', test)
     zc.buildout.testing.install('zdaemon', test)
     zc.buildout.testing.install('zope.annotation', test)
     zc.buildout.testing.install('zope.app.applicationcontrol', test)



More information about the checkins mailing list