[Checkins] SVN: grokproject/trunk/ Provide optional 'grok_release_url' parameter to grokproject to allow for better testing and offline deployment among other things. Also fix tests so they work under directories with spaces on their names.

Leonardo Rochael Almeida leorochael at gmail.com
Tue Sep 29 07:44:24 EDT 2009


Log message for revision 104602:
  Provide optional 'grok_release_url' parameter to grokproject to allow for better testing and offline deployment among other things. Also fix tests so they work under directories with spaces on their names.

Changed:
  _U  grokproject/trunk/
  U   grokproject/trunk/buildout.cfg
  U   grokproject/trunk/grokproject/template_paste/buildout.cfg_tmpl
  U   grokproject/trunk/grokproject/template_zopectl/buildout.cfg_tmpl
  U   grokproject/trunk/grokproject/templates.py
  U   grokproject/trunk/grokproject/utils.py
  U   grokproject/trunk/setup.py
  U   grokproject/trunk/tests.py
  A   grokproject/trunk/tests_alternative_release_url.txt
  U   grokproject/trunk/tests_paste.txt
  U   grokproject/trunk/tests_zopectl.txt

-=-

Property changes on: grokproject/trunk
___________________________________________________________________
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/trunk/buildout.cfg
===================================================================
--- grokproject/trunk/buildout.cfg	2009-09-29 07:07:57 UTC (rev 104601)
+++ grokproject/trunk/buildout.cfg	2009-09-29 11:44:24 UTC (rev 104602)
@@ -10,5 +10,5 @@
 
 [test]
 recipe = zc.recipe.testrunner
-eggs = grokproject
+eggs = grokproject[tests]
 defaults = ['--tests-pattern', '^f?tests$$', '-v']

Modified: grokproject/trunk/grokproject/template_paste/buildout.cfg_tmpl
===================================================================
--- grokproject/trunk/grokproject/template_paste/buildout.cfg_tmpl	2009-09-29 07:07:57 UTC (rev 104601)
+++ grokproject/trunk/grokproject/template_paste/buildout.cfg_tmpl	2009-09-29 11:44:24 UTC (rev 104602)
@@ -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/trunk/grokproject/template_zopectl/buildout.cfg_tmpl
===================================================================
--- grokproject/trunk/grokproject/template_zopectl/buildout.cfg_tmpl	2009-09-29 07:07:57 UTC (rev 104601)
+++ grokproject/trunk/grokproject/template_zopectl/buildout.cfg_tmpl	2009-09-29 11:44:24 UTC (rev 104602)
@@ -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/trunk/grokproject/templates.py
===================================================================
--- grokproject/trunk/grokproject/templates.py	2009-09-29 07:07:57 UTC (rev 104601)
+++ grokproject/trunk/grokproject/templates.py	2009-09-29 11:44:24 UTC (rev 104602)
@@ -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/trunk/grokproject/utils.py
===================================================================
--- grokproject/trunk/grokproject/utils.py	2009-09-29 07:07:57 UTC (rev 104601)
+++ grokproject/trunk/grokproject/utils.py	2009-09-29 11:44:24 UTC (rev 104602)
@@ -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/trunk/setup.py
===================================================================
--- grokproject/trunk/setup.py	2009-09-29 07:07:57 UTC (rev 104601)
+++ grokproject/trunk/setup.py	2009-09-29 11:44:24 UTC (rev 104602)
@@ -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/trunk/tests.py
===================================================================
--- grokproject/trunk/tests.py	2009-09-29 07:07:57 UTC (rev 104601)
+++ grokproject/trunk/tests.py	2009-09-29 11:44:24 UTC (rev 104602)
@@ -2,8 +2,8 @@
 """
 Grabs the tests in doctest
 
-Taken virtually verbatim from zopeskel with permission (for zpl) from Tarek
-Ziade. (c) Tarek Ziade
+Previously Taken virtually verbatim from zopeskel with permission (for zpl)
+from Tarek Ziade. (c) Tarek Ziade
 """
 __docformat__ = 'restructuredtext'
 
@@ -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,

Copied: grokproject/trunk/tests_alternative_release_url.txt (from rev 104601, grokproject/branches/lra-alternate-release-url/tests_alternative_release_url.txt)
===================================================================
--- grokproject/trunk/tests_alternative_release_url.txt	                        (rev 0)
+++ grokproject/trunk/tests_alternative_release_url.txt	2009-09-29 11:44:24 UTC (rev 104602)
@@ -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)

Modified: grokproject/trunk/tests_paste.txt
===================================================================
--- grokproject/trunk/tests_paste.txt	2009-09-29 07:07:57 UTC (rev 104601)
+++ grokproject/trunk/tests_paste.txt	2009-09-29 11:44:24 UTC (rev 104602)
@@ -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/trunk/tests_zopectl.txt
===================================================================
--- grokproject/trunk/tests_zopectl.txt	2009-09-29 07:07:57 UTC (rev 104601)
+++ grokproject/trunk/tests_zopectl.txt	2009-09-29 11:44:24 UTC (rev 104602)
@@ -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