[Checkins] SVN: grokproject/branches/lra-alternate-release-url/ Fix tests when running on path with spaces on it; Allows use of a different grok-release-url, including 'file:///...' URLs

Leonardo Rochael Almeida leorochael at gmail.com
Mon Sep 21 11:18:11 EDT 2009


Log message for revision 104397:
  Fix tests when running on path with spaces on it; Allows use of a different grok-release-url, including 'file:///...' URLs

Changed:
  _U  grokproject/branches/lra-alternate-release-url/
  U   grokproject/branches/lra-alternate-release-url/buildout.cfg
  U   grokproject/branches/lra-alternate-release-url/grokproject/template_paste/buildout.cfg_tmpl
  U   grokproject/branches/lra-alternate-release-url/grokproject/template_zopectl/buildout.cfg_tmpl
  U   grokproject/branches/lra-alternate-release-url/grokproject/templates.py
  U   grokproject/branches/lra-alternate-release-url/grokproject/utils.py
  U   grokproject/branches/lra-alternate-release-url/setup.py
  U   grokproject/branches/lra-alternate-release-url/tests.py
  A   grokproject/branches/lra-alternate-release-url/tests_alternative_release_url.txt
  U   grokproject/branches/lra-alternate-release-url/tests_paste.txt
  U   grokproject/branches/lra-alternate-release-url/tests_zopectl.txt

-=-

Property changes on: grokproject/branches/lra-alternate-release-url
___________________________________________________________________
Modified: svn:ignore
   - *.egg
build
bin
dist
eggs
develop-eggs
parts
.installed.cfg
grokproject.egg-info
*.pyc
*.pyo
shorttests

   + *.egg
build
bin
dist
eggs
develop-eggs
parts
.*
grokproject.egg-info
*.pyc
*.pyo
shorttests


Modified: grokproject/branches/lra-alternate-release-url/buildout.cfg
===================================================================
--- grokproject/branches/lra-alternate-release-url/buildout.cfg	2009-09-21 15:13:06 UTC (rev 104396)
+++ grokproject/branches/lra-alternate-release-url/buildout.cfg	2009-09-21 15:18:10 UTC (rev 104397)
@@ -10,5 +10,5 @@
 
 [test]
 recipe = zc.recipe.testrunner
-eggs = grokproject
+eggs = grokproject[tests]
 defaults = ['--tests-pattern', '^f?tests$$', '-v']

Modified: grokproject/branches/lra-alternate-release-url/grokproject/template_paste/buildout.cfg_tmpl
===================================================================
--- grokproject/branches/lra-alternate-release-url/grokproject/template_paste/buildout.cfg_tmpl	2009-09-21 15:13:06 UTC (rev 104396)
+++ grokproject/branches/lra-alternate-release-url/grokproject/template_paste/buildout.cfg_tmpl	2009-09-21 15:18:10 UTC (rev 104397)
@@ -106,4 +106,4 @@
 [eggbasket]
 recipe = z3c.recipe.eggbasket
 eggs = grok
-url = http://grok.zope.org/releaseinfo/grok-eggs-${grokversion}.tgz
+url = ${grok_release_url}grok-eggs-${grokversion}.tgz

Modified: grokproject/branches/lra-alternate-release-url/grokproject/template_zopectl/buildout.cfg_tmpl
===================================================================
--- grokproject/branches/lra-alternate-release-url/grokproject/template_zopectl/buildout.cfg_tmpl	2009-09-21 15:13:06 UTC (rev 104396)
+++ grokproject/branches/lra-alternate-release-url/grokproject/template_zopectl/buildout.cfg_tmpl	2009-09-21 15:18:10 UTC (rev 104397)
@@ -80,4 +80,4 @@
 [eggbasket]
 recipe = z3c.recipe.eggbasket
 eggs = grok
-url = http://grok.zope.org/releaseinfo/grok-eggs-${grokversion}.tgz
+url = ${grok_release_url}grok-eggs-${grokversion}.tgz

Modified: grokproject/branches/lra-alternate-release-url/grokproject/templates.py
===================================================================
--- grokproject/branches/lra-alternate-release-url/grokproject/templates.py	2009-09-21 15:13:06 UTC (rev 104396)
+++ grokproject/branches/lra-alternate-release-url/grokproject/templates.py	2009-09-21 15:18:10 UTC (rev 104397)
@@ -14,7 +14,7 @@
 from grokproject.utils import required_grok_version
 from grokproject.utils import extend_versions_cfg
 
-GROK_RELEASE_URL = 'http://grok.zope.org/releaseinfo/'
+GROK_RELEASE_URL_DEFAULT = 'http://grok.zope.org/releaseinfo/'
 
 
 class GrokProject(templates.Template):
@@ -37,6 +37,10 @@
         ask_var('eggs_dir',
                 'Location where zc.buildout will look for and place packages',
                 default='', should_ask=False),
+        ask_var('grok_release_url',
+                "URL where grokproject will look up grok version and "
+                "release information.",
+                should_ask=False),
         ]
 
     def check_vars(self, vars, cmd):
@@ -48,6 +52,10 @@
             sys.exit(1)
 
         explicit_eggs_dir = vars.get('eggs_dir')
+        grok_release_url = vars.get('grok_release_url',
+                                    GROK_RELEASE_URL_DEFAULT)
+        if not grok_release_url.endswith('/'):
+            grok_release_url += '/'
 
         skipped_vars = {}
         for var in list(self.vars):
@@ -59,6 +67,8 @@
         for name in skipped_vars:
             vars[name] = skipped_vars[name]
 
+        vars['grok_release_url'] = grok_release_url
+
         vars['passwd'] = get_sha1_encoded_string(vars['passwd'])            
         for var_name in ['user', 'passwd']:
             # Escape values that go in site.zcml.
@@ -78,10 +88,10 @@
         if version == 'current':
             # if no version was specified, we look up the current
             # version first
-            current_info_url = GROK_RELEASE_URL + 'current'
+            current_info_url = urlparse.urljoin(grok_release_url, 'current')
             cfg_filename = self.download(current_info_url).strip()
 
-        version_info_url = urlparse.urljoin(GROK_RELEASE_URL, cfg_filename)
+        version_info_url = urlparse.urljoin(grok_release_url, cfg_filename)
         vars['version_info_url'] = version_info_url
         vars['version_info_file_contents'] = self.download(version_info_url)
 

Modified: grokproject/branches/lra-alternate-release-url/grokproject/utils.py
===================================================================
--- grokproject/branches/lra-alternate-release-url/grokproject/utils.py	2009-09-21 15:13:06 UTC (rev 104396)
+++ grokproject/branches/lra-alternate-release-url/grokproject/utils.py	2009-09-21 15:18:10 UTC (rev 104397)
@@ -174,7 +174,7 @@
     """Add additional package versions for versions.cfg.
     
     We only add eggs that are not already included in versions.cfg
-    fetched from grok.zope.org/releaseinfo.
+    fetched from the release info URL (usually grok.zope.org/releaseinfo).
     """
     here = os.path.dirname(__file__)
     if for_zopectl:

Modified: grokproject/branches/lra-alternate-release-url/setup.py
===================================================================
--- grokproject/branches/lra-alternate-release-url/setup.py	2009-09-21 15:13:06 UTC (rev 104396)
+++ grokproject/branches/lra-alternate-release-url/setup.py	2009-09-21 15:18:10 UTC (rev 104397)
@@ -21,7 +21,7 @@
     include_package_data=True,
     zip_safe=False,
     install_requires=['PasteScript>=1.6'],
-    tests_require=['zope.testing', 'Cheetah', 'PasteScript'],
+    extras_require=dict(tests=['zope.testing',]),
     test_suite='tests.test_suite',
     entry_points={
     'console_scripts': ['grokproject = grokproject:main'],

Modified: grokproject/branches/lra-alternate-release-url/tests.py
===================================================================
--- grokproject/branches/lra-alternate-release-url/tests.py	2009-09-21 15:13:06 UTC (rev 104396)
+++ grokproject/branches/lra-alternate-release-url/tests.py	2009-09-21 15:18:10 UTC (rev 104397)
@@ -12,8 +12,9 @@
 import sys
 import os
 import shutil
-import popen2
 import StringIO
+import subprocess
+import tempfile
 
 from zope.testing import doctest
 
@@ -24,22 +25,21 @@
     if os.path.isdir(dirname):
         shutil.rmtree(dirname)
 
-def read_sh(cmd):
-    _cmd = cmd
-    old = sys.stdout
-    child_stdout_and_stderr, child_stdin = popen2.popen4(_cmd)
-    child_stdin.close()
-    return child_stdout_and_stderr.read()
+## FIXME - check for other platforms
+MUST_CLOSE_FDS = not sys.platform.startswith('win')
 
+def read_sh(command, input=None):
+    p = subprocess.Popen(command,
+                         stdin=subprocess.PIPE,
+                         stdout=subprocess.PIPE,
+                         stderr=subprocess.STDOUT,
+                         close_fds=MUST_CLOSE_FDS)
+    out, err_ = p.communicate(input)
+    return out
+
 def sh(cmd):
-    _cmd = cmd
     print cmd
-    # launch command 2 times to see what append and be able
-    # to test in doc tests
-    os.system(_cmd)
-    child_stdout_and_stderr, child_stdin = popen2.popen4(_cmd)
-    child_stdin.close()
-    print child_stdout_and_stderr.read()
+    print read_sh(cmd)
 
 def ls(*args):
     dirname = os.path.join(*args)
@@ -123,6 +123,12 @@
 execdir = os.path.abspath(os.path.dirname(sys.executable))
 tempdir = os.getenv('TEMP','/tmp')
 
+DOCTEST_FILES='''
+tests_zopectl.txt
+tests_paste.txt
+tests_alternative_release_url.txt
+'''.strip().split('\n')
+
 def doc_suite(package_dir, setUp=None, tearDown=None, globs=None):
     """Returns a test suite, based on doctests found in /doctest."""
     suite = []
@@ -135,9 +141,8 @@
     if package_dir not in sys.path:
         sys.path.append(package_dir)
 
-    docs = [os.path.join(package_dir, 'tests_zopectl.txt'),
-            os.path.join(package_dir, 'tests_paste.txt'),
-            ]
+    docs = [os.path.join(package_dir, filename)
+            for filename in DOCTEST_FILES]
 
     for test in docs:
         suite.append(doctest.DocFileSuite(test, optionflags=flags,

Added: grokproject/branches/lra-alternate-release-url/tests_alternative_release_url.txt
===================================================================
--- grokproject/branches/lra-alternate-release-url/tests_alternative_release_url.txt	                        (rev 0)
+++ grokproject/branches/lra-alternate-release-url/tests_alternative_release_url.txt	2009-09-21 15:18:10 UTC (rev 104397)
@@ -0,0 +1,146 @@
+Grokproject with alternative release URL
+========================================
+
+Providing an alternative release URL for grokproject is useful if you need to
+have your own local mirror for grok.
+
+In this test we will use an alternative release URL for grokproject. It is a
+"file:///" URL pointing to a directory with a fake set of grok release
+information files:
+
+    >>> testdir = tempfile.mkdtemp() # can be removed when tempdir becomes really temporary
+    >>> fake_release = os.path.join(testdir, 'fake_release')
+    >>> os.mkdir(fake_release)
+    >>> touch(fake_release, 'current', data='grok-0.555.cfg')
+    >>> touch(fake_release, 'grok-0.555.cfg',
+    ...       data='[versions]\ngrok = 0.555\n')
+    >>> ls(fake_release)
+    current
+    grok-0.555.cfg
+    >>> cat(fake_release, 'current')
+    grok-0.555.cfg
+    >>> cat(fake_release, 'grok-0.555.cfg')
+    [versions]
+    grok = 0.555
+    <BLANKLINE>
+    >>> alt_url = 'file://' + os.path.join(fake_release, '')
+
+Let's use paster, with a "file:///" url pointing to the fake grok release. We
+won't run buildout because the version file is not actually valid::
+
+    >>> paster = current_dir + '/bin/paster'
+    >>> paster_params = ('create -t grok --no-interactive -o'.split() +
+    ...                  [testdir])
+    >>> grok_params = ('grokexample user=a passwd=a run_buildout=false '
+    ...                'grok_release_url=' + alt_url).split()
+    >>> sh([paster] + paster_params + grok_params)
+    ['/.../bin/paster', 'create', '-t', 'grok', '--no-interactive',
+     '-o', ... 'grokexample', 'user=a', 'passwd=a', 'run_buildout=false',
+     'grok_release_url=file:///.../fake_release/']
+    ...
+
+Let's check the contents::
+
+    >>> package_dir = os.path.join(testdir, 'grokexample')
+    >>> ls(package_dir)
+    bootstrap.py
+    buildout.cfg
+    etc
+    setup.py
+    src
+    versions.cfg
+
+    >>> software_dir = os.path.join(package_dir, 'src', 'grokexample')
+    >>> ls(software_dir)
+    __init__.py
+    app.py
+    app.txt
+    app_templates
+    configure.zcml
+    ftesting.zcml
+    static
+    tests.py
+
+Let's see if the information in our fake release URL was correctly propagated.
+
+    >>> cat(package_dir, 'versions.cfg')
+    # This file contains a list of versions of the various grok modules that
+    # belong together.
+    # It was downloaded from file://.../fake_release/grok-0.555.cfg
+    # when this project was created.
+    <BLANKLINE>
+    [versions]
+    grok = 0.555
+    <BLANKLINE>
+    ...
+
+    >>> cat(package_dir, 'buildout.cfg')
+    [buildout]
+    ...
+    [eggbasket]
+    recipe = z3c.recipe.eggbasket
+    eggs = grok
+    url = file:///.../grok-eggs-0.555.tgz...
+
+Cleanup:
+
+    >>> rmdir(package_dir)
+
+The "zopectl" version of the template should behave similarly:
+
+    >>> paster = current_dir + '/bin/paster'
+    >>> paster_params = ('create -t grok --no-interactive -o'.split() +
+    ...                  [testdir])
+    >>> grok_params = ('grokexample user=a passwd=a run_buildout=false '
+    ...                'zopectl=True grok_release_url=' + alt_url).split()
+    >>> sh([paster] + paster_params + grok_params)
+    ['/.../bin/paster', 'create', '-t', 'grok', '--no-interactive',
+     '-o', ... 'grokexample', 'user=a', 'passwd=a', 'run_buildout=false',
+     'zopectl=True', 'grok_release_url=.../fake_release/']
+    ...
+
+Let's check the contents::
+
+    >>> package_dir = os.path.join(testdir, 'grokexample')
+    >>> ls(package_dir)
+    bootstrap.py
+    buildout.cfg
+    setup.py
+    src
+    versions.cfg
+
+    >>> software_dir = os.path.join(package_dir, 'src', 'grokexample')
+    >>> ls(software_dir)
+    __init__.py
+    app.py
+    app.txt
+    app_templates
+    configure.zcml
+    ftesting.zcml
+    static
+    tests.py
+
+Let's see if the information in our fake release URL was correctly propagated.
+
+    >>> cat(package_dir, 'versions.cfg')
+    # This file contains a list of versions of the various grok modules that
+    # belong together.
+    # It was downloaded from file://.../fake_release/grok-0.555.cfg
+    # when this project was created.
+    <BLANKLINE>
+    [versions]
+    grok = 0.555
+    <BLANKLINE>
+    ...
+
+    >>> cat(package_dir, 'buildout.cfg')
+    [buildout]
+    ...
+    [eggbasket]
+    recipe = z3c.recipe.eggbasket
+    eggs = grok
+    url = file:///.../grok-eggs-0.555.tgz...
+
+Cleanup (remove this after tempdir is really fixed):
+
+    >>> rmdir(testdir)


Property changes on: grokproject/branches/lra-alternate-release-url/tests_alternative_release_url.txt
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: grokproject/branches/lra-alternate-release-url/tests_paste.txt
===================================================================
--- grokproject/branches/lra-alternate-release-url/tests_paste.txt	2009-09-21 15:13:06 UTC (rev 104396)
+++ grokproject/branches/lra-alternate-release-url/tests_paste.txt	2009-09-21 15:18:10 UTC (rev 104397)
@@ -20,10 +20,12 @@
 
 Then use paster. Eggs are placed in our freshly created eggs directory::
 
-    >>> paster = current_dir + '/bin/paster create -t grok '
-    >>> sh(paster + 'GrokExample user=a passwd=a '
-    ...    'grokversion=0.14.1 eggs_dir=%s --no-interactive' % eggsdir)
-    /.../bin/paster create -t grok GrokExample user=a passwd=a ...
+    >>> paster = current_dir + '/bin/paster'
+    >>> parms = 'create -t grok GrokExample user=a passwd=a grokversion=0.14.1'
+    >>> sh([paster] + parms.split() +
+    ...    ['eggs_dir=%s' % eggsdir, '--no-interactive'])
+    ['/.../bin/paster', 'create', '-t', 'grok', 'GrokExample', 
+     'user=a', 'passwd=a', ...
     ...
 
 Let's check the contents::
@@ -237,21 +239,22 @@
     >>> cd(package_dir)
     >>> cmd = os.path.join(bin_dir, 'buildout')
     >>> output = read_sh(cmd)
-    >>> print output
+    >>> print output # doctest: +REPORT_UDIFF
     Develop: ...
     Updating eggbasket.
     Updating app.
     Updating i18n.
     i18n: setting up i18n tools
     Updating test.
-    Updating data.
-    Updating log.
+    Updating site_zcml.
+    Updating zope_conf.
+    Updating mkdirs.
     Updating zpasswd.
-    Updating zope_conf.
-    Updating site_zcml.
     Updating zdaemon_conf.
     Updating deploy_ini.
     Updating debug_ini.
+    Updating data.
+    Updating log.
     <BLANKLINE>
 
 Using the generated `bootstrap` script
@@ -263,8 +266,7 @@
 
     >>> import sys
     >>> cmd_arg = os.path.join(package_dir, 'bootstrap.py')
-    >>> cmd = "%s %s" % (sys.executable, cmd_arg)
-    >>> output = read_sh(cmd)
+    >>> output = read_sh([sys.executable, cmd_arg])
     >>> print output
     Develop: '...'
     Installing 'z3c.recipe.eggbasket'.

Modified: grokproject/branches/lra-alternate-release-url/tests_zopectl.txt
===================================================================
--- grokproject/branches/lra-alternate-release-url/tests_zopectl.txt	2009-09-21 15:13:06 UTC (rev 104396)
+++ grokproject/branches/lra-alternate-release-url/tests_zopectl.txt	2009-09-21 15:18:10 UTC (rev 104397)
@@ -20,10 +20,13 @@
 
 Then use paster. Eggs are placed in our freshly created eggs directory::
 
-    >>> paster = current_dir + '/bin/paster create -t grok '
-    >>> sh(paster + 'grokexample user=a passwd=a zopectl=True '
-    ...    'eggs_dir=%s --no-interactive' % eggsdir)
-    /.../bin/paster create -t grok grokexample user=a passwd=a zopectl=True ...
+    >>> paster = current_dir + '/bin/paster'
+    >>> pasterparams = ('create -t grok grokexample user=a passwd=a '
+    ...                 'zopectl=True')
+    >>> sh([paster] + pasterparams.split() +
+    ...    ['eggs_dir=%s' % eggsdir, '--no-interactive'])
+    ['/.../bin/paster', 'create', '-t', 'grok', 'grokexample', 
+     'user=a', 'passwd=a', 'zopectl=True', ...
     ...
 
 Let's check the contents::
@@ -218,8 +221,7 @@
 
     >>> import sys
     >>> cmd_arg = os.path.join(package_dir, 'bootstrap.py')
-    >>> cmd = "%s %s" % (sys.executable, cmd_arg)
-    >>> output = read_sh(cmd)
+    >>> output = read_sh([sys.executable, cmd_arg])
     >>> print output
     Develop: '...'
     Installing 'z3c.recipe.eggbasket'.



More information about the checkins mailing list