[Checkins] SVN: zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/
Added an API for use by similar recipes.
Jim Fulton
jim at zope.com
Thu Jun 29 16:37:11 EDT 2006
Log message for revision 68916:
Added an API for use by similar recipes.
Added support for offline mode.
Used new API for test server management
Changed:
U zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/README.txt
A zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/api.txt
U zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/egg.py
U zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/tests.py
-=-
Modified: zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/README.txt
===================================================================
--- zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/README.txt 2006-06-29 20:37:09 UTC (rev 68915)
+++ zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/README.txt 2006-06-29 20:37:11 UTC (rev 68916)
@@ -35,7 +35,15 @@
only effective when an egg is installed. If a zipped egg already
exists in the eggs directory, it will not be unzipped.
+scripts
+ Control which scripts are generated. The value should be a list of
+ zero or more tokens. Each tokem is either a name, or a name,
+ followed by an '=' and a new name. Only the named scripts are
+ generated. If no tokens are given, then script generation is
+ disabled. If the option isn't given at all, then all scripts
+ defined by the named eggs will be generated.
+
We have a link server that has a number of eggs:
>>> print get(link_server),
@@ -199,3 +207,23 @@
- buildout
- foo
+Offline mode
+------------
+
+If the buildout offline option is set to "true", then no attempt will
+be made to contact an index server:
+
+
+ >>> write(sample_buildout, 'buildout.cfg',
+ ... """
+ ... [buildout]
+ ... parts = demo
+ ... offline = true
+ ...
+ ... [demo]
+ ... recipe = zc.recipe.egg
+ ... index = eek!
+ ... scripts = demo=foo
+ ... """ % dict(server=link_server))
+
+ >>> print system(buildout),
Added: zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/api.txt
===================================================================
--- zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/api.txt 2006-06-29 20:37:09 UTC (rev 68915)
+++ zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/api.txt 2006-06-29 20:37:11 UTC (rev 68916)
@@ -0,0 +1,106 @@
+Egg Recipe API for other Recipes
+================================
+
+It is common for recipes to accept a collection of egg specifications
+and generate scripts based on the resulting working sets. The egg
+recipe provides an API that other recipes can use.
+
+A recipe can reuse the egg recipe, supporting the eggs, find-links,
+index, python, and unzip options. This is done by creating an egg
+recipe instance in a recipes's contructor. In the recipe's install
+script, the egg-recipe instance's working_set method to collect the
+requested eggs and working set.
+
+To illustrate, we create a sample recipe that is a very thin layer
+around the egg recipe:
+
+ >>> mkdir(sample_buildout, 'sample')
+ >>> write(sample_buildout, 'sample', 'sample.py',
+ ... """
+ ... import logging, os
+ ... import zc.recipe.egg
+ ...
+ ... class Sample:
+ ...
+ ... def __init__(self, buildout, name, options):
+ ... self.egg = zc.recipe.egg.Egg(buildout, name, options)
+ ... self.name = name
+ ... self.options = options
+ ...
+ ... def install(self):
+ ... extras = self.options['extras'].split()
+ ... requirements, ws = self.egg.working_set(extras)
+ ... print 'Part:', self.name
+ ... print 'Egg requirements:'
+ ... for r in requirements:
+ ... print r
+ ... print 'Working set:'
+ ... for d in ws:
+ ... print d
+ ... """)
+
+Here we instantiated the egg recipe in the constructor, saving it in
+an attribute. This also initialized the options dictionary.
+
+In our install method, we called the working_set method on the
+instance we saved. The working_set method takes an optional sequence
+of extra requirements to be included in the working set.
+
+ >>> write(sample_buildout, 'sample', 'setup.py',
+ ... """
+ ... from setuptools import setup
+ ...
+ ... setup(
+ ... name = "sample",
+ ... entry_points = {'zc.buildout': ['default = sample:Sample']},
+ ... )
+ ... """)
+
+
+ >>> write(sample_buildout, 'sample', 'README.txt', " ")
+
+ >>> write(sample_buildout, 'buildout.cfg',
+ ... """
+ ... [buildout]
+ ... develop = sample
+ ... parts = sample-part
+ ...
+ ... [sample-part]
+ ... recipe = sample
+ ... eggs = demo<0.3
+ ... find-links = %(server)s
+ ... index = %(server)sindex
+ ... extras = other
+ ... """ % dict(server=link_server))
+
+ >>> import os
+ >>> os.chdir(sample_buildout)
+ >>> buildout = os.path.join(sample_buildout, 'bin', 'buildout')
+ >>> print system(buildout),
+ Part: sample-part
+ Egg requirements:
+ demo<0.3
+ Working set:
+ demo 0.2
+ other 1.0
+ demoneeded 1.1
+
+We can see that the options were augmented with additionl data
+computed by the egg recipe by looking at .installed.cfg:
+
+ >>> cat(sample_buildout, '.installed.cfg')
+ [buildout]
+ parts = sample-part
+ <BLANKLINE>
+ [sample-part]
+ __buildout_installed__ =
+ __buildout_signature__ = sample-6aWMvV2EJ9Ijq+bR8ugArQ==
+ _b = /tmp/tmpb7kP9bsample-buildout/bin
+ _d = /tmp/tmpb7kP9bsample-buildout/develop-eggs
+ _e = /tmp/tmpb7kP9bsample-buildout/eggs
+ eggs = demo<0.3
+ executable = /usr/local/bin/python2.3
+ extras = other
+ find-links = http://localhost:27071/
+ index = http://localhost:27071/index
+ recipe = sample
Property changes on: zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/api.txt
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/egg.py
===================================================================
--- zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/egg.py 2006-06-29 20:37:09 UTC (rev 68915)
+++ zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/egg.py 2006-06-29 20:37:11 UTC (rev 68916)
@@ -48,7 +48,7 @@
python = options.get('python', buildout['buildout']['python'])
options['executable'] = buildout[python]['executable']
- def working_set(self):
+ def working_set(self, extra=()):
"""Separate method to just get the working set
This is intended for reuse by similar recipes.
@@ -59,18 +59,26 @@
r.strip()
for r in options.get('eggs', self.name).split('\n')
if r.strip()]
-
- ws = zc.buildout.easy_install.install(
- distributions, options['_e'],
- links = self.links,
- index = self.index,
- executable = options['executable'],
- always_unzip=options.get('unzip') == 'true',
- path=[options['_d']]
- )
+ orig_distributions = distributions[:]
+ distributions.extend(extra)
- return distributions, ws
+ if self.buildout['buildout'].get('offline') == 'true':
+ ws = zc.buildout.easy_install.working_set(
+ distributions, options['executable'],
+ [options['_d'], options['_e']]
+ )
+ else:
+ ws = zc.buildout.easy_install.install(
+ distributions, options['_e'],
+ links = self.links,
+ index = self.index,
+ executable = options['executable'],
+ always_unzip=options.get('unzip') == 'true',
+ path=[options['_d']]
+ )
+ return orig_distributions, ws
+
def install(self):
distributions, ws = self.working_set()
options = self.options
Modified: zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/tests.py
===================================================================
--- zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/tests.py 2006-06-29 20:37:09 UTC (rev 68915)
+++ zc.buildout/trunk/zc.recipe.egg_/src/zc/recipe/egg/tests.py 2006-06-29 20:37:11 UTC (rev 68916)
@@ -29,15 +29,8 @@
'develop-eggs', 'zc.recipe.egg.egg-link'),
'w').write(dirname(__file__, 4))
zc.buildout.testing.create_sample_eggs(test)
- test.globs['link_server'] = (
- 'http://localhost:%s/'
- % zc.buildout.testing.start_server(zc.buildout.testing.make_tree(test))
- )
+ zc.buildout.testing.setUpServer(test, zc.buildout.testing.make_tree(test))
-
-def tearDown(test):
- zc.buildout.testing.buildoutTearDown(test)
- zc.buildout.testing.stop_server(test.globs['link_server'])
def setUpPython(test):
zc.buildout.testing.buildoutSetUp(test, clear_home=False)
@@ -47,17 +40,14 @@
'w').write(dirname(__file__, 4))
zc.buildout.testing.multi_python(test)
- test.globs['link_server'] = (
- 'http://localhost:%s/'
- % zc.buildout.testing.start_server(zc.buildout.testing.make_tree(test))
- )
-
+ zc.buildout.testing.setUpServer(test, zc.buildout.testing.make_tree(test))
+
def test_suite():
return unittest.TestSuite((
#doctest.DocTestSuite(),
doctest.DocFileSuite(
'README.txt',
- setUp=setUp, tearDown=tearDown,
+ setUp=setUp, tearDown=zc.buildout.testing.buildoutTearDown,
checker=renormalizing.RENormalizing([
(re.compile('(\S+[/%(sep)s]| )'
'(\\w+-)[^ \t\n%(sep)s/]+.egg'
@@ -68,8 +58,30 @@
])
),
doctest.DocFileSuite(
+ 'api.txt',
+ setUp=setUp, tearDown=zc.buildout.testing.buildoutTearDown,
+ checker=renormalizing.RENormalizing([
+ (re.compile('_b = \S+sample-buildout.bin'),
+ '_b = sample-buildout/bin'),
+ (re.compile('__buildout_signature__ = \S+'),
+ '__buildout_signature__ = sample-6aWMvV2EJ9Ijq+bR8ugArQ=='),
+ (re.compile('_d = \S+sample-buildout.develop-eggs'),
+ '_d = sample-buildout/develop-eggs'),
+ (re.compile('_e = \S+sample-buildout.eggs'),
+ '_e = sample-buildout/eggs'),
+ (re.compile('executable = \S+python\S+'),
+ 'executable = python'),
+ (re.compile('index = \S+python\S+'),
+ 'executable = python'),
+ (re.compile('find-links = http://localhost:\d+/'),
+ 'find-links = http://localhost:8080/'),
+ (re.compile('index = http://localhost:\d+/index'),
+ 'index = http://localhost:8080/index'),
+ ])
+ ),
+ doctest.DocFileSuite(
'selecting-python.txt',
- setUp=setUpPython, tearDown=tearDown,
+ setUp=setUpPython, tearDown=zc.buildout.testing.buildoutTearDown,
checker=renormalizing.RENormalizing([
(re.compile('\S+sample-(\w+)%s(\S+)' % os.path.sep),
r'/sample-\1/\2'),
More information about the Checkins
mailing list