[Checkins] SVN: zc.buildout/trunk/src/zc/buildout/ Added missing tests.

Jim Fulton jim at zope.com
Fri Jun 9 17:32:25 EDT 2006


Log message for revision 68551:
  Added missing tests.
  

Changed:
  A   zc.buildout/trunk/src/zc/buildout/egglinker.txt
  U   zc.buildout/trunk/src/zc/buildout/tests.py

-=-
Added: zc.buildout/trunk/src/zc/buildout/egglinker.txt
===================================================================
--- zc.buildout/trunk/src/zc/buildout/egglinker.txt	2006-06-09 21:32:23 UTC (rev 68550)
+++ zc.buildout/trunk/src/zc/buildout/egglinker.txt	2006-06-09 21:32:24 UTC (rev 68551)
@@ -0,0 +1,143 @@
+Custom script support
+=====================
+
+The egg-linker module provides support for creating scripts from
+eggs.  It provides a function similar to setup tools except that it
+provides facilities for baking a script's path into the script.  This
+has two advantages:
+
+- The eggs to be used by a script are not chosen at run time, making
+  startup faster and, more importantly, deterministic.
+
+- The script doesn't have to import pkg_resources because the logic
+  that pkg_resources would execute at run time is executed at
+  script-creation time.
+
+We have a directory with some sample eggs in it:
+
+    >>> ls(sample_eggs)
+    -  demo-0.1-py2.3.egg
+    -  demo-0.2-py2.3.egg
+    -  demo-0.3-py2.3.egg
+    -  demoneeded-1.0-py2.3.egg
+
+The demo package depends on the demoneeded package.
+
+The egglinker module can be used to generate scripts. Let's create a
+desitnation directory for it to place them in:
+
+    >>> import tempfile
+    >>> bin = tempfile.mkdtemp()
+
+Now, we'll use the egg linker to generate scripts in this directory
+from the demo egg:
+
+    >>> import zc.buildout.egglinker
+    >>> scripts = zc.buildout.egglinker.scripts(['demo==0.1'], bin,
+    ...                                         [sample_eggs])
+
+the three arguments we passed were:
+
+1. A sequence of distribution requirements.  These are of the same
+   form as setuptools requirements.  Here we passed a single
+   requirement, for the version 0.1 demo distribution.
+
+2. The destination directory.
+
+3, A sequence of egg directories, which are searched for suitable
+   distributions.
+
+The bin directory now contains 2 generated scripts:
+
+    >>> ls(bin)
+    -  demo
+    -  py_demo
+
+The return value is a list of the scripts generated:
+    
+    >>> import os
+    >>> scripts == [os.path.join(bin, 'demo'), os.path.join(bin, 'py_demo')]
+    True
+
+The demo script run the entry point defined in the demo egg:
+
+    >>> cat(bin, 'demo')
+    #!/usr/local/bin/python2.3
+    <BLANKLINE>
+    import sys
+    sys.path[0:0] = [
+      '/tmp/tmpuR5-n7eggtest/dist/demo-0.1-py2.3.egg',
+      '/tmp/tmpuR5-n7eggtest/dist/demoneeded-1.0-py2.3.egg'
+      ]
+    <BLANKLINE>
+    import eggrecipedemo
+    <BLANKLINE>
+    if __name__ == '__main__':
+        eggrecipedemo.main()
+
+Some things to note:
+
+- The demo and demoneeded eggs are added to the beginning of sys.path.
+
+- The module for the script entry point is imported and the entry
+  point, in this case, 'main', is run.
+
+The py_demo script simply run the Python interactive interpreter with
+the path set:
+
+    >>> cat(bin, 'py_demo')
+    #!/usr/local/bin/python2.3 -i
+    <BLANKLINE>
+    import sys
+    sys.path[0:0] = [
+      '/tmp/tmpuR5-n7eggtest/dist/demo-0.1-py2.3.egg',
+      '/tmp/tmpuR5-n7eggtest/dist/demoneeded-1.0-py2.3.egg'
+      ]
+
+An additional argumnet can be passed to define which scripts to install
+and to provie script names. The argument is a dictionary mapping
+original script names to new script names.
+
+    >>> import shutil
+    >>> shutil.rmtree(bin)
+    >>> bin = tempfile.mkdtemp()
+    >>> scripts = zc.buildout.egglinker.scripts(
+    ...    ['demo==0.1'], bin, [sample_eggs],
+    ...    dict(demo='run'))
+    >>> scripts == [os.path.join(bin, 'run')]
+    True
+    >>> ls(bin)
+    -  run
+
+    >>> print system(os.path.join(bin, 'run')),
+    1 1
+
+    >>> shutil.rmtree(bin)
+
+Sometimes we need more control over script generation.  Some
+lower-level APIs are available to help us generate scripts ourselves.
+These apis are a little bit higher level than those provided by
+the pkg_resources from the setuptools distribution.
+
+The path method returns a path to a set of eggs satisftying a sequence
+of requirements from a sequence of egg directories:
+
+    >>> zc.buildout.egglinker.path(['demo==0.1'], [sample_eggs])
+    ... # doctest: +NORMALIZE_WHITESPACE
+    ['/tmp/tmpQeJjpkeggtest/dist/demo-0.1-py2.4.egg', 
+     '/tmp/tmpQeJjpkeggtest/dist/demoneeded-1.0-py2.4.egg']
+
+
+The location method returns the distribution location for an egg that
+satisfies a requirement:
+
+    >>> zc.buildout.egglinker.location('demo==0.1', [sample_eggs])
+    '/tmp/tmpQeJjpkeggtest/dist/demo-0.1-py2.4.egg'
+
+The distributions function can retrieve a list of distributions found
+ineg directories that match a sequence of requirements:
+
+    >>> [(d.project_name, d.version) for d in 
+    ...  zc.buildout.egglinker.distributions(['demo==0.1'], [sample_eggs])]
+    [('demo', '0.1'), ('demoneeded', '1.0')]
+


Property changes on: zc.buildout/trunk/src/zc/buildout/egglinker.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: zc.buildout/trunk/src/zc/buildout/tests.py
===================================================================
--- zc.buildout/trunk/src/zc/buildout/tests.py	2006-06-09 21:32:23 UTC (rev 68550)
+++ zc.buildout/trunk/src/zc/buildout/tests.py	2006-06-09 21:32:24 UTC (rev 68551)
@@ -16,11 +16,11 @@
 $Id$
 """
 
-import re, unittest
+import os, re, shutil, sys, tempfile, unittest
 from zope.testing import doctest, renormalizing
+import pkg_resources
+import zc.buildout.testing
 
-from zc.buildout.testing import buildoutSetUp, buildoutTearDown
-
 def buildout_error_handling():
     r'''Buildout error handling
 
@@ -64,20 +64,90 @@
 
 '''
 
+    
 
+def runsetup(d):
+    here = os.getcwd()
+    try:
+        os.chdir(d)
+        os.spawnle(
+            os.P_WAIT, sys.executable, sys.executable,
+            'setup.py', '-q', 'bdist_egg',
+            {'PYTHONPATH': os.path.dirname(pkg_resources.__file__)},
+            )
+        shutil.rmtree('build')
+    finally:
+        os.chdir(here)
+
+def dirname(d, level=1):
+    if level == 0:
+        return d
+    return dirname(os.path.dirname(d), level-1)
+
+def linkerSetUp(test):
+    zc.buildout.testing.buildoutSetUp(test)
+    sample = tempfile.mkdtemp('eggtest')
+    test.globs['_sample_eggs_container'] = sample
+    test.globs['sample_eggs'] = os.path.join(sample, 'dist')
+    zc.buildout.testing.write(sample, 'README.txt', '')
+    zc.buildout.testing.write(sample, 'eggrecipedemobeeded.py', 'y=1\n')
+    zc.buildout.testing.write(
+        sample, 'setup.py',
+        "from setuptools import setup\n"
+        "setup(name='demoneeded', py_modules=['eggrecipedemobeeded'],"
+        " zip_safe=True, version='1.0')\n"
+        )
+    runsetup(sample)
+    os.remove(os.path.join(sample, 'eggrecipedemobeeded.py'))
+    for i in (1, 2, 3):
+        zc.buildout.testing.write(
+            sample, 'eggrecipedemo.py',
+            'import eggrecipedemobeeded\n'
+            'x=%s\n'
+            'def main(): print x, eggrecipedemobeeded.y\n'
+            % i)
+        zc.buildout.testing.write(
+            sample, 'setup.py',
+            "from setuptools import setup\n"
+            "setup(name='demo', py_modules=['eggrecipedemo'],"
+            " install_requires = 'demoneeded',"
+            " entry_points={'console_scripts': ['demo = eggrecipedemo:main']},"
+            " zip_safe=True, version='0.%s')\n" % i
+            )
+        runsetup(sample)
+        
+def linkerTearDown(test):
+    shutil.rmtree(test.globs['_sample_eggs_container'])
+    zc.buildout.testing.buildoutTearDown(test)
+    
+
 def test_suite():
     return unittest.TestSuite((
         #doctest.DocTestSuite(),
         doctest.DocFileSuite(
             'buildout.txt',
-            setUp=buildoutSetUp, tearDown=buildoutTearDown,
+            setUp=zc.buildout.testing.buildoutSetUp,
+            tearDown=zc.buildout.testing.buildoutTearDown,
             checker=renormalizing.RENormalizing([
                (re.compile('__buildout_signature__ = recipes-\S+'),
                 '__buildout_signature__ = recipes-SSSSSSSSSSS'),
                ])
             ),
+        doctest.DocFileSuite(
+            'egglinker.txt',
+            setUp=linkerSetUp, tearDown=linkerTearDown,
+            checker=renormalizing.RENormalizing([
+               (re.compile('(\S+[/%(sep)s]| )'
+                           '(\\w+-)[^ \t\n%(sep)s/]+.egg'
+                           % dict(sep=os.path.sep)
+                           ),
+                '\\2-VVV-egg'),
+               (re.compile('python2.\d'), 'python2.N')
+               ]),
+            ),
         doctest.DocTestSuite(
-            setUp=buildoutSetUp, tearDown=buildoutTearDown),
+            setUp=zc.buildout.testing.buildoutSetUp,
+            tearDown=zc.buildout.testing.buildoutTearDown),
         ))
 
 if __name__ == '__main__':



More information about the Checkins mailing list