diff -r 5ff1fc726848 -r c6bca38c1cbf eggs/zc.recipe.egg-1.3.2-py2.6.egg/EGG-INFO/PKG-INFO --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eggs/zc.recipe.egg-1.3.2-py2.6.egg/EGG-INFO/PKG-INFO Sat Jan 08 11:20:57 2011 +0530 @@ -0,0 +1,1708 @@ +Metadata-Version: 1.0 +Name: zc.recipe.egg +Version: 1.3.2 +Summary: Recipe for installing Python package distributions as eggs +Home-page: http://cheeseshop.python.org/pypi/zc.recipe.egg +Author: Jim Fulton +Author-email: jim@zope.com +License: ZPL 2.1 +Description: ******************************** + Buildout Egg-Installation Recipe + ******************************** + + .. contents:: + + The egg-installation recipe installs eggs into a buildout eggs + directory. It also generates scripts in a buildout bin directory with + egg paths baked into them. + + + Change History + ************** + + 1.3.2 (2010-08-23) + ================== + + - Bugfix for the change introduced in 1.3.1. + + 1.3.1 (2010-08-23) + ================== + + - Support recipes that are using zc.recipe.egg by passing in a dict, rather + than a zc.buildout.buildout.Options object as was expected/tested. + + 1.3.0 (2010-08-23) + ================== + + - Small further refactorings past 1.2.3b1 to be compatible with zc.buildout + 1.5.0. + + 1.2.3b1 (2010-04-29) + ==================== + + - Refactored to be used with z3c.recipe.scripts and zc.buildout 1.5.0. No + new user-visible features. + + 1.2.2 (2009-03-18) + ================== + + - Fixed a dependency information. zc.buildout >1.2.0 is required. + + 1.2.1 (2009-03-18) + ================== + + - Refactored generation of relative egg paths to generate simpler code. + + 1.2.0 (2009-03-17) + ================== + + - Added the `dependent-scripts` option. When set to `true`, scripts will + be generated for all required eggs in addition to the eggs named + specifically. This idea came from two forks of this recipe, + `repoze.recipe.egg` and `pylons_sandbox`, but the option name is + spelled with a dash instead of underscore and it defaults to `false`. + + - Added a relative-paths option. When true, egg paths in scripts are generated + relative to the script names. + + 1.1.0 (2008-07-19) + ================== + + - Refactored to work honor the new buildout-level unzip option. + + + 1.1.0b1 (2008-06-27) + ==================== + + - Added `environment` option to custom extension building options. + + 1.0.0 (2007-11-03) + ================== + + - No code changes from last beta, just some small package meta-data + improvements. + + 1.0.0b5 (2007-02-08) + ==================== + + Feature Changes + --------------- + + - Added support for the buildout newest option. + + 1.0.0b4 (2007-01-17) + ==================== + + Feature Changes + --------------- + + - Added initialization and arguments options to the scripts recipe. + + - Added an eggs recipe that *just* installes eggs. + + - Advertized the scripts recipe for creating scripts. + + 1.0.0b3 (2006-12-04) + ==================== + + Feature Changes + --------------- + + - Added a develop recipe for creating develop eggs. + + This is useful to: + + - Specify custom extension building options, + + - Specify a version of Python to use, and to + + - Cause develop eggs to be created after other parts. + + - The develop and build recipes now return the paths created, so that + created eggs or egg links are removed when a part is removed (or + changed). + + + 1.0.0b2 (2006-10-16) + ==================== + + Updated to work with (not get a warning from) zc.buildout 1.0.0b10. + + 1.0.0b1 + ======= + + Updated to work with zc.buildout 1.0.0b3. + + 1.0.0a3 + ======= + + - Extra path elements to be included in generated scripts can now be + set via the extra-paths option. + + - No longer implicitly generate py\_ scripts fo reach egg. There is + now an interpreter option to generate a script that, when run + without arguments, launches the Python interactive interpreter with + the path set based on a parts eggs and extra paths. If this script + is run with the name of a Python script and arguments, then the + given script is run with the path set. + + - You can now specify explicit entry points. This is useful for use + with packages that don't declare their own entry points. + + - Added Windows support. + + - Now-longer implicitly generate "py\_" scripts for each egg. You can + now generate a script for launching a Python interpreter or for + running scripts based on the eggs defined for an egg part. + + - You can now specify custom entry points for packages that don't + declare their entry points. + + - You can now specify extra-paths to be included in generated scripts. + + + 1.0.0a2 + ======= + + Added a custom recipe for building custom eggs using custom distrutils + build_ext arguments. + + 1.0.0a1 + ======= + + Initial public version + + Detailed Documentation + ********************** + + Installation of distributions as eggs + ===================================== + + The zc.recipe.egg:eggs recipe can be used to install various types if + distutils distributions as eggs. It takes a number of options: + + eggs + A list of eggs to install given as one or more setuptools + requirement strings. Each string must be given on a separate + line. + + find-links + A list of URLs, files, or directories to search for distributions. + + index + The URL of an index server, or almost any other valid URL. :) + + If not specified, the Python Package Index, + http://cheeseshop.python.org/pypi, is used. You can specify an + alternate index with this option. If you use the links option and + if the links point to the needed distributions, then the index can + be anything and will be largely ignored. In the examples, here, + we'll just point to an empty directory on our link server. This + will make our examples run a little bit faster. + + python + The name of a section to get the Python executable from. + If not specified, then the buildout python option is used. The + Python executable is found in the executable option of the named + section. + + We have a link server that has a number of distributions: + + >>> print get(link_server), + + bigdemo-0.1-py2.3.egg
+ demo-0.1-py2.3.egg
+ demo-0.2-py2.3.egg
+ demo-0.3-py2.3.egg
+ demo-0.4c1-py2.3.egg
+ demoneeded-1.0.zip
+ demoneeded-1.1.zip
+ demoneeded-1.2c1.zip
+ extdemo-1.4.zip
+ index/
+ other-1.0-py2.3.egg
+ + + We have a sample buildout. Let's update its configuration file to + install the demo package. + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... + ... [demo] + ... recipe = zc.recipe.egg:eggs + ... eggs = demo<0.3 + ... find-links = %(server)s + ... index = %(server)s/index + ... """ % dict(server=link_server)) + + In this example, we limited ourselves to revisions before 0.3. We also + specified where to find distributions using the find-links option. + + Let's run the buildout: + + >>> import os + >>> print system(buildout), + Installing demo. + Getting distribution for 'demo<0.3'. + Got demo 0.2. + Getting distribution for 'demoneeded'. + Got demoneeded 1.2c1. + + Now, if we look at the buildout eggs directory: + + >>> ls(sample_buildout, 'eggs') + - demo-0.2-py2.3.egg + - demoneeded-1.2c1-py2.3.egg + - setuptools-0.6-py2.3.egg + - zc.buildout-1.0-py2.3.egg + + We see that we got an egg for demo that met the requirement, as well + as the egg for demoneeded, which demo requires. (We also see an egg + link for the recipe in the develop-eggs directory. This egg link was + actually created as part of the sample buildout setup. Normally, when + using the recipe, you'll get a regular egg installation.) + + Script generation + ----------------- + + The demo egg defined a script, but we didn't get one installed: + + >>> ls(sample_buildout, 'bin') + - buildout + + If we want scripts provided by eggs to be installed, we should use the + scripts recipe: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... + ... [demo] + ... recipe = zc.recipe.egg:scripts + ... eggs = demo<0.3 + ... find-links = %(server)s + ... index = %(server)s/index + ... """ % dict(server=link_server)) + + >>> print system(buildout), + Uninstalling demo. + Installing demo. + Generated script '/sample-buildout/bin/demo'. + + Now we also see the script defined by the demo script: + + >>> ls(sample_buildout, 'bin') + - buildout + - demo + + The scripts recipe defines some additional options: + + entry-points + A list of entry-point identifiers of the form: + + name=module:attrs + + where name is a script name, module is a dotted name resolving to a + module name, and attrs is a dotted name resolving to a callable + object within a module. + + This option is useful when working with distributions that don't + declare entry points, such as distributions not written to work + with setuptools. + + Examples can be seen in the section "Specifying entry points" below. + + scripts + Control which scripts are generated. The value should be a list of + zero or more tokens. Each token 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. + + dependent-scripts + If set to the string "true", scripts will be generated for all + required eggs in addition to the eggs specifically named. + + interpreter + The name of a script to generate that allows access to a Python + interpreter that has the path set based on the eggs installed. + (See the ``z3c.recipe.scripts`` recipe for a more full-featured + interpreter.) + + extra-paths + Extra paths to include in a generated script. + + initialization + Specify some Python initialization code. This is very limited. In + particular, be aware that leading whitespace is stripped from the + code given. + + arguments + Specify some arguments to be passed to entry points as Python source. + + relative-paths + If set to true, then egg paths will be generated relative to the + script path. This allows a buildout to be moved without breaking + egg paths. This option can be set in either the script section or + in the buildout section. + + Let's add an interpreter option: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... + ... [demo] + ... recipe = zc.recipe.egg + ... eggs = demo<0.3 + ... find-links = %(server)s + ... index = %(server)s/index + ... interpreter = py-demo + ... """ % dict(server=link_server)) + + Note that we omitted the entry point name from the recipe + specification. We were able to do this because the scripts recipe is + the default entry point for the zc.recipe.egg egg. + + >>> print system(buildout), + Uninstalling demo. + Installing demo. + Generated script '/sample-buildout/bin/demo'. + Generated interpreter '/sample-buildout/bin/py-demo'. + + Now we also get a py-demo script for giving us a Python prompt with + the path for demo and any eggs it depends on included in sys.path. + This is useful for debugging and testing. + + >>> ls(sample_buildout, 'bin') + - buildout + - demo + - py-demo + + If we run the demo script, it prints out some minimal data: + + >>> print system(join(sample_buildout, 'bin', 'demo')), + 2 2 + + The value it prints out happens to be some values defined in the + modules installed. + + We can also run the py-demo script. Here we'll just print out + the bits if the path added to reflect the eggs: + + >>> print system(join(sample_buildout, 'bin', 'py-demo'), + ... """import os, sys + ... for p in sys.path: + ... if 'demo' in p: + ... print os.path.basename(p) + ... + ... """).replace('>>> ', '').replace('... ', ''), + ... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE + demo-0.2-py2.4.egg + demoneeded-1.2c1-py2.4.egg + + Egg updating + ------------ + + The recipe normally gets the most recent distribution that satisfies the + specification. It won't do this is the buildout is either in + non-newest mode or in offline mode. To see how this works, we'll + remove the restriction on demo: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... + ... [demo] + ... recipe = zc.recipe.egg + ... find-links = %(server)s + ... index = %(server)s/index + ... """ % dict(server=link_server)) + + and run the buildout in non-newest mode: + + >>> print system(buildout+' -N'), + Uninstalling demo. + Installing demo. + Generated script '/sample-buildout/bin/demo'. + + Note that we removed the eggs option, and the eggs defaulted to the + part name. Because we removed the eggs option, the demo was + reinstalled. + + We'll also run the buildout in off-line mode: + + >>> print system(buildout+' -o'), + Updating demo. + + We didn't get an update for demo: + + >>> ls(sample_buildout, 'eggs') + - demo-0.2-py2.3.egg + - demoneeded-1.2c1-py2.3.egg + - setuptools-0.6-py2.3.egg + - zc.buildout-1.0-py2.3.egg + + If we run the buildout on the default online and newest modes, + we'll get an update for demo: + + >>> print system(buildout), + Updating demo. + Getting distribution for 'demo'. + Got demo 0.4c1. + Generated script '/sample-buildout/bin/demo'. + + Then we'll get a new demo egg: + + >>> ls(sample_buildout, 'eggs') + - demo-0.2-py2.3.egg + - demo-0.4c1-py2.3.egg + - demoneeded-1.2c1-py2.3.egg + - setuptools-0.6-py2.4.egg + - zc.buildout-1.0-py2.4.egg + + The script is updated too: + + >>> print system(join(sample_buildout, 'bin', 'demo')), + 4 2 + + Controlling script generation + ----------------------------- + + You can control which scripts get generated using the scripts option. + For example, to suppress scripts, use the scripts option without any + arguments: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... + ... [demo] + ... recipe = zc.recipe.egg + ... find-links = %(server)s + ... index = %(server)s/index + ... scripts = + ... """ % dict(server=link_server)) + + + >>> print system(buildout), + Uninstalling demo. + Installing demo. + + >>> ls(sample_buildout, 'bin') + - buildout + + You can also control the name used for scripts: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... + ... [demo] + ... recipe = zc.recipe.egg + ... find-links = %(server)s + ... index = %(server)s/index + ... scripts = demo=foo + ... """ % dict(server=link_server)) + + >>> print system(buildout), + Uninstalling demo. + Installing demo. + Generated script '/sample-buildout/bin/foo'. + + >>> ls(sample_buildout, 'bin') + - buildout + - foo + + Specifying extra script paths + ----------------------------- + + If we need to include extra paths in a script, we can use the + extra-paths option: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... + ... [demo] + ... recipe = zc.recipe.egg + ... find-links = %(server)s + ... index = %(server)s/index + ... scripts = demo=foo + ... extra-paths = + ... /foo/bar + ... ${buildout:directory}/spam + ... """ % dict(server=link_server)) + + >>> print system(buildout), + Uninstalling demo. + Installing demo. + Generated script '/sample-buildout/bin/foo'. + + Let's look at the script that was generated: + + >>> cat(sample_buildout, 'bin', 'foo') # doctest: +NORMALIZE_WHITESPACE + #!/usr/local/bin/python2.4 + + import sys + sys.path[0:0] = [ + '/sample-buildout/eggs/demo-0.4c1-py2.4.egg', + '/sample-buildout/eggs/demoneeded-1.2c1-py2.4.egg', + '/foo/bar', + '/sample-buildout/spam', + ] + + import eggrecipedemo + + if __name__ == '__main__': + eggrecipedemo.main() + + Relative egg paths + ------------------ + + If the relative-paths option is specified with a true value, then + paths will be generated relative to the script. This is useful when + you want to be able to move a buildout directory around without + breaking scripts. + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... + ... [demo] + ... recipe = zc.recipe.egg + ... find-links = %(server)s + ... index = %(server)s/index + ... scripts = demo=foo + ... relative-paths = true + ... extra-paths = + ... /foo/bar + ... ${buildout:directory}/spam + ... """ % dict(server=link_server)) + + >>> print system(buildout), + Uninstalling demo. + Installing demo. + Generated script '/sample-buildout/bin/foo'. + + Let's look at the script that was generated: + + >>> cat(sample_buildout, 'bin', 'foo') # doctest: +NORMALIZE_WHITESPACE + #!/usr/local/bin/python2.4 + + import os + + join = os.path.join + base = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) + base = os.path.dirname(base) + + import sys + sys.path[0:0] = [ + join(base, 'eggs/demo-0.4c1-pyN.N.egg'), + join(base, 'eggs/demoneeded-1.2c1-pyN.N.egg'), + '/foo/bar', + join(base, 'spam'), + ] + + import eggrecipedemo + + if __name__ == '__main__': + eggrecipedemo.main() + + You can specify relative paths in the buildout section, rather than in + each individual script section: + + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... relative-paths = true + ... + ... [demo] + ... recipe = zc.recipe.egg + ... find-links = %(server)s + ... index = %(server)s/index + ... scripts = demo=foo + ... extra-paths = + ... /foo/bar + ... ${buildout:directory}/spam + ... """ % dict(server=link_server)) + + >>> print system(buildout), + Uninstalling demo. + Installing demo. + Generated script '/sample-buildout/bin/foo'. + + >>> cat(sample_buildout, 'bin', 'foo') # doctest: +NORMALIZE_WHITESPACE + #!/usr/local/bin/python2.4 + + import os + + join = os.path.join + base = os.path.dirname(os.path.abspath(os.path.realpath(__file__))) + base = os.path.dirname(base) + + import sys + sys.path[0:0] = [ + join(base, 'eggs/demo-0.4c1-pyN.N.egg'), + join(base, 'eggs/demoneeded-1.2c1-pyN.N.egg'), + '/foo/bar', + join(base, 'spam'), + ] + + import eggrecipedemo + + if __name__ == '__main__': + eggrecipedemo.main() + + Specifying initialialization code and arguments + ----------------------------------------------- + + Sometimes, we need to do more than just calling entry points. We can + use the initialialization and arguments options to specify extra code + to be included in generated scripts: + + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... + ... [demo] + ... recipe = zc.recipe.egg + ... find-links = %(server)s + ... index = %(server)s/index + ... scripts = demo=foo + ... extra-paths = + ... /foo/bar + ... ${buildout:directory}/spam + ... initialization = a = (1, 2 + ... 3, 4) + ... arguments = a, 2 + ... """ % dict(server=link_server)) + + >>> print system(buildout), + Uninstalling demo. + Installing demo. + Generated script '/sample-buildout/bin/foo'. + + >>> cat(sample_buildout, 'bin', 'foo') # doctest: +NORMALIZE_WHITESPACE + #!/usr/local/bin/python2.4 + + import sys + sys.path[0:0] = [ + '/sample-buildout/eggs/demo-0.4c1-py2.4.egg', + '/sample-buildout/eggs/demoneeded-1.2c1-py2.4.egg', + '/foo/bar', + '/sample-buildout/spam', + ] + + a = (1, 2 + 3, 4) + + import eggrecipedemo + + if __name__ == '__main__': + eggrecipedemo.main(a, 2) + + Here we see that the initialization code we specified was added after + setting the path. Note, as mentioned above, that leading whitespace + has been stripped. Similarly, the argument code we specified was + added in the entry point call (to main). + + Specifying entry points + ----------------------- + + Scripts can be generated for entry points declared explicitly. We can + declare entry points using the entry-points option: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... + ... [demo] + ... recipe = zc.recipe.egg + ... find-links = %(server)s + ... index = %(server)s/index + ... extra-paths = + ... /foo/bar + ... ${buildout:directory}/spam + ... entry-points = alt=eggrecipedemo:alt other=foo.bar:a.b.c + ... """ % dict(server=link_server)) + + >>> print system(buildout), + Uninstalling demo. + Installing demo. + Generated script '/sample-buildout/bin/demo'. + Generated script '/sample-buildout/bin/alt'. + Generated script '/sample-buildout/bin/other'. + + >>> ls(sample_buildout, 'bin') + - alt + - buildout + - demo + - other + + >>> cat(sample_buildout, 'bin', 'other') # doctest: +NORMALIZE_WHITESPACE + #!/usr/local/bin/python2.4 + + import sys + sys.path[0:0] = [ + '/sample-buildout/eggs/demo-0.4c1-py2.4.egg', + '/sample-buildout/eggs/demoneeded-1.2c1-py2.4.egg', + '/foo/bar', + '/sample-buildout/spam', + ] + + import foo.bar + + if __name__ == '__main__': + foo.bar.a.b.c() + + Generating all scripts + ---------------------- + + The `bigdemo` package doesn't have any scripts, but it requires the `demo` + package, which does have a script. Specify `dependent-scripts = true` to + generate all scripts in required packages: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = bigdemo + ... + ... [bigdemo] + ... recipe = zc.recipe.egg + ... find-links = %(server)s + ... index = %(server)s/index + ... dependent-scripts = true + ... """ % dict(server=link_server)) + >>> print system(buildout+' -N'), + Uninstalling demo. + Installing bigdemo. + Getting distribution for 'bigdemo'. + Got bigdemo 0.1. + Generated script '/sample-buildout/bin/demo'. + + 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), + Uninstalling bigdemo. + Installing demo. + Generated script '/sample-buildout/bin/foo'. + + + Controlling which Python to use + ------------------------------- + + The following assumes that you have Python 2.4 installed. + + We can specify the python to use by specifying the name of a section + to read the Python executable from. The default is the section + defined by the python buildout option. + + We have a link server: + + >>> print get(link_server), + + bigdemo-0.1-py2.4.egg
+ demo-0.1-py2.4.egg
+ demo-0.2-py2.4.egg
+ demo-0.3-py2.4.egg
+ demo-0.4c1-py2.4.egg
+ demoneeded-1.0.zip
+ demoneeded-1.1.zip
+ demoneeded-1.2c1.zip
+ extdemo-1.4.zip
+ index/
+ other-1.0-py2.4.egg
+ + + We have a sample buildout. Let's update its configuration file to + install the demo package using Python 2.4. + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = demo + ... eggs-directory = eggs + ... index = http://www.python.org/pypi/ + ... + ... [python2.4] + ... executable = %(python24)s + ... + ... [demo] + ... recipe = zc.recipe.egg + ... eggs = demo <0.3 + ... find-links = %(server)s + ... python = python2.4 + ... interpreter = py-demo + ... """ % dict(server=link_server, python24=other_executable)) + + Now, if we run the buildout: + + >>> import os + >>> os.chdir(sample_buildout) + >>> buildout = os.path.join(sample_buildout, 'bin', 'buildout') + >>> print system(buildout), + Installing demo. + Getting distribution for 'demo<0.3'. + Got demo 0.2. + Getting distribution for 'demoneeded'. + Got demoneeded 1.2c1. + Generated script '/sample-buildout/bin/demo'. + Generated interpreter '/sample-buildout/bin/py-demo'. + + we'll get the Python 2.4 eggs for demo and demoneeded: + + >>> ls(sample_buildout, 'eggs') + - demo-0.2-py2.4.egg + - demoneeded-1.2c1-py2.4.egg + d setuptools-0.6-py2.5.egg + - zc.buildout-1.0-py2.5.egg + + And the generated scripts invoke Python 2.4: + + >>> import sys + >>> if sys.platform == 'win32': + ... script_name = 'demo-script.py' + ... else: + ... script_name = 'demo' + >>> f = open(os.path.join(sample_buildout, 'bin', script_name)) + >>> shebang = f.readline().strip() + >>> if shebang[:3] == '#!"' and shebang[-1] == '"': + ... shebang = '#!'+shebang[3:-1] + >>> shebang == '#!' + other_executable + True + >>> print f.read(), # doctest: +NORMALIZE_WHITESPACE + + import sys + sys.path[0:0] = [ + '/sample-buildout/eggs/demo-0.2-py2.4.egg', + '/sample-buildout/eggs/demoneeded-1.2c1-py2.4.egg', + ] + + import eggrecipedemo + + if __name__ == '__main__': + eggrecipedemo.main() + + >>> if sys.platform == 'win32': + ... f = open(os.path.join(sample_buildout, 'bin', 'py-demo-script.py')) + ... else: + ... f = open(os.path.join(sample_buildout, 'bin', 'py-demo')) + + >>> shebang = f.readline().strip() + >>> if shebang[:3] == '#!"' and shebang[-1] == '"': + ... shebang = '#!'+shebang[3:-1] + >>> shebang == '#!' + other_executable + True + >>> print f.read(), # doctest: +NORMALIZE_WHITESPACE + + import sys + + sys.path[0:0] = [ + '/sample-buildout/eggs/demo-0.2-py2.4.egg', + '/sample-buildout/eggs/demoneeded-1.2c1-py2.4.egg', + ] + + _interactive = True + if len(sys.argv) > 1: + _options, _args = __import__("getopt").getopt(sys.argv[1:], 'ic:m:') + _interactive = False + for (_opt, _val) in _options: + if _opt == '-i': + _interactive = True + elif _opt == '-c': + exec _val + elif _opt == '-m': + sys.argv[1:] = _args + _args = [] + __import__("runpy").run_module( + _val, {}, "__main__", alter_sys=True) + + if _args: + sys.argv[:] = _args + __file__ = _args[0] + del _options, _args + execfile(__file__) + + if _interactive: + del _interactive + __import__("code").interact(banner="", local=globals()) + + >>> f.close() + + Creating eggs with extensions needing custom build settings + ============================================================= + + Sometimes, It's necessary to provide extra control over how an egg is + created. This is commonly true for eggs with extension modules that + need to access libraries or include files. + + The zc.recipe.egg:custom recipe can be used to define an egg with + custom build parameters. The currently defined parameters are: + + include-dirs + A new-line separated list of directories to search for include + files. + + library-dirs + A new-line separated list of directories to search for libraries + to link with. + + rpath + A new-line separated list of directories to search for dynamic libraries + at run time. + + define + A comma-separated list of names of C preprocessor variables to + define. + + undef + A comman separated list of names of C preprocessor variables to + undefine. + + libraries + The name of an additional library to link with. Due to limitations + in distutils and desprite the option name, only a single library + can be specified. + + link-objects + The name of an link object to link against. Due to limitations + in distutils and desprite the option name, only a single link object + can be specified. + + debug + Compile/link with debugging information + + force + Forcibly build everything (ignore file timestamps) + + compiler + Specify the compiler type + + swig + The path to the swig executable + + swig-cpp + Make SWIG create C++ files (default is C) + + swig-opts + List of SWIG command line options + + In addition, the following options can be used to specify the egg: + + egg + An specification for the egg to be created, to install given as a + setuptools requirement string. This defaults to the part name. + + find-links + A list of URLs, files, or directories to search for distributions. + + index + The URL of an index server, or almost any other valid URL. :) + + If not specified, the Python Package Index, + http://cheeseshop.python.org/pypi, is used. You can specify an + alternate index with this option. If you use the links option and + if the links point to the needed distributions, then the index can + be anything and will be largely ignored. In the examples, here, + we'll just point to an empty directory on our link server. This + will make our examples run a little bit faster. + + python + The name of a section to get the Python executable from. + If not specified, then the buildout python option is used. The + Python executable is found in the executable option of the named + section. + + environment + The name of a section with additional environment variables. The + environment variables are set before the egg is built. + + To illustrate this, we'll define a buildout that builds an egg for a + package that has a simple extension module:: + + #include + #include + + static PyMethodDef methods[] = {}; + + PyMODINIT_FUNC + initextdemo(void) + { + PyObject *m; + m = Py_InitModule3("extdemo", methods, ""); + #ifdef TWO + PyModule_AddObject(m, "val", PyInt_FromLong(2)); + #else + PyModule_AddObject(m, "val", PyInt_FromLong(EXTDEMO)); + #endif + } + + The extension depends on a system-dependent include file, extdemo.h, + that defines a constant, EXTDEMO, that is exposed by the extension. + + The extension module is available as a source distribution, + extdemo-1.4.tar.gz, on a distribution server. + + We have a sample buildout that we'll add an include directory to with + the necessary include file: + + >>> mkdir('include') + >>> write('include', 'extdemo.h', + ... """ + ... #define EXTDEMO 42 + ... """) + + We'll also update the buildout configuration file to define a part for + the egg: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... parts = extdemo + ... + ... [extdemo] + ... recipe = zc.recipe.egg:custom + ... find-links = %(server)s + ... index = %(server)s/index + ... include-dirs = include + ... + ... """ % dict(server=link_server)) + + >>> print system(buildout), + Installing extdemo. + zip_safe flag not set; analyzing archive contents... + + We got the zip_safe warning because the source distribution we used + wasn't setuptools based and thus didn't set the option. + + The egg is created in the develop-eggs directory *not* the eggs + directory because it depends on buildout-specific parameters and the + eggs directory can be shared across multiple buildouts. + + >>> ls(sample_buildout, 'develop-eggs') + d extdemo-1.4-py2.4-unix-i686.egg + - z3c.recipe.scripts.egg-link + - zc.recipe.egg.egg-link + + Note that no scripts or dependencies are installed. To install + dependencies or scripts for a custom egg, define another part and use + the zc.recipe.egg recipe, listing the custom egg as one of the eggs to + be installed. The zc.recipe.egg recipe will use the installed egg. + + Let's define a script that uses out ext demo: + + >>> mkdir('demo') + >>> write('demo', 'demo.py', + ... """ + ... import extdemo + ... def main(): + ... print extdemo.val + ... """) + + >>> write('demo', 'setup.py', + ... """ + ... from setuptools import setup + ... setup(name='demo') + ... """) + + + >>> write('buildout.cfg', + ... """ + ... [buildout] + ... develop = demo + ... parts = extdemo demo + ... + ... [extdemo] + ... recipe = zc.recipe.egg:custom + ... find-links = %(server)s + ... index = %(server)s/index + ... include-dirs = include + ... + ... [demo] + ... recipe = zc.recipe.egg + ... eggs = demo + ... extdemo + ... entry-points = demo=demo:main + ... """ % dict(server=link_server)) + + >>> print system(buildout), + Develop: '/sample-buildout/demo' + Updating extdemo. + Installing demo. + Generated script '/sample-buildout/bin/demo'. + + When we run the script, we'll 42 printed: + + >>> print system(join('bin', 'demo')), + 42 + + Updating + -------- + + The custom recipe will normally check for new source distributions + that meet the given specification. This can be suppressed using the + buildout non-newest and offline modes. We'll generate a new source + distribution for extdemo: + + >>> update_extdemo() + + If we run the buildout in non-newest or offline modes: + + >>> print system(buildout+' -N'), + Develop: '/sample-buildout/demo' + Updating extdemo. + Updating demo. + + >>> print system(buildout+' -o'), + Develop: '/sample-buildout/demo' + Updating extdemo. + Updating demo. + + We won't get an update. + + >>> ls(sample_buildout, 'develop-eggs') + - demo.egg-link + d extdemo-1.4-py2.4-unix-i686.egg + - z3c.recipe.scripts.egg-link + - zc.recipe.egg.egg-link + + But if we run the buildout in the default on-line and newest modes, we + will. This time we also get the test-variable message again, because the new + version is imported: + + >>> print system(buildout), + Develop: '/sample-buildout/demo' + Updating extdemo. + zip_safe flag not set; analyzing archive contents... + Updating demo. + Generated script '/sample-buildout/bin/demo'. + + >>> ls(sample_buildout, 'develop-eggs') + - demo.egg-link + d extdemo-1.4-py2.4-linux-i686.egg + d extdemo-1.5-py2.4-linux-i686.egg + - z3c.recipe.scripts.egg-link + - zc.recipe.egg.egg-link + + Controlling the version used + ---------------------------- + + We can specify a specific version using the egg option: + + >>> write('buildout.cfg', + ... """ + ... [buildout] + ... develop = demo + ... parts = extdemo demo + ... + ... [extdemo] + ... recipe = zc.recipe.egg:custom + ... egg = extdemo ==1.4 + ... find-links = %(server)s + ... index = %(server)s/index + ... include-dirs = include + ... + ... [demo] + ... recipe = zc.recipe.egg + ... eggs = demo + ... extdemo ==1.4 + ... entry-points = demo=demo:main + ... """ % dict(server=link_server)) + + >>> print system(buildout+' -D'), + Develop: '/sample-buildout/demo' + Uninstalling demo. + Uninstalling extdemo. + Installing extdemo. + zip_safe flag not set; analyzing archive contents... + Installing demo. + Generated script '/sample-buildout/bin/demo'. + + >>> ls(sample_buildout, 'develop-eggs') + - demo.egg-link + d extdemo-1.4-py2.4-linux-i686.egg + - z3c.recipe.scripts.egg-link + - zc.recipe.egg.egg-link + + + Controlling environment variables + +++++++++++++++++++++++++++++++++ + + To set additional environment variables, the `environment` option is used. + + Let's create a recipe which prints out environment variables. We need this to + make sure the set envirionment variables are removed after the egg:custom + recipe was run. + + >>> mkdir(sample_buildout, 'recipes') + >>> write(sample_buildout, 'recipes', 'environ.py', + ... """ + ... import logging, os, zc.buildout + ... + ... class Environ: + ... + ... def __init__(self, buildout, name, options): + ... self.name = name + ... + ... def install(self): + ... logging.getLogger(self.name).info( + ... 'test-variable left over: %s' % ( + ... 'test-variable' in os.environ)) + ... return [] + ... + ... def update(self): + ... self.install() + ... """) + >>> write(sample_buildout, 'recipes', 'setup.py', + ... """ + ... from setuptools import setup + ... + ... setup( + ... name = "recipes", + ... entry_points = {'zc.buildout': ['environ = environ:Environ']}, + ... ) + ... """) + + + Create our buildout: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... develop = recipes + ... parts = extdemo checkenv + ... + ... [extdemo-env] + ... test-variable = foo + ... + ... [extdemo] + ... recipe = zc.recipe.egg:custom + ... find-links = %(server)s + ... index = %(server)s/index + ... include-dirs = include + ... environment = extdemo-env + ... + ... [checkenv] + ... recipe = recipes:environ + ... + ... """ % dict(server=link_server)) + >>> print system(buildout), + Develop: '/sample-buildout/recipes' + Uninstalling demo. + Uninstalling extdemo. + Installing extdemo. + Have environment test-variable: foo + zip_safe flag not set; analyzing archive contents... + Installing checkenv. + checkenv: test-variable left over: False + + + The setup.py also printed out that we have set the environment `test-variable` + to foo. After the buildout the variable is reset to its original value (i.e. + removed). + + When an environment variable has a value before zc.recipe.egg:custom is run, + the original value will be restored: + + >>> import os + >>> os.environ['test-variable'] = 'bar' + >>> print system(buildout), + Develop: '/sample-buildout/recipes' + Updating extdemo. + Updating checkenv. + checkenv: test-variable left over: True + + >>> os.environ['test-variable'] + 'bar' + + + Sometimes it is required to prepend or append to an existing environment + variable, for instance for adding something to the PATH. Therefor all variables + are interpolated with os.environ before the're set: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... develop = recipes + ... parts = extdemo checkenv + ... + ... [extdemo-env] + ... test-variable = foo:%%(test-variable)s + ... + ... [extdemo] + ... recipe = zc.recipe.egg:custom + ... find-links = %(server)s + ... index = %(server)s/index + ... include-dirs = include + ... environment = extdemo-env + ... + ... [checkenv] + ... recipe = recipes:environ + ... + ... """ % dict(server=link_server)) + >>> print system(buildout), + Develop: '/sample-buildout/recipes' + Uninstalling extdemo. + Installing extdemo. + Have environment test-variable: foo:bar + zip_safe flag not set; analyzing archive contents... + Updating checkenv. + checkenv: test-variable left over: True + + >>> os.environ['test-variable'] + 'bar' + >>> del os.environ['test-variable'] + + + Create a clean buildout.cfg w/o the checkenv recipe, and delete the recipe: + + >>> write(sample_buildout, 'buildout.cfg', + ... """ + ... [buildout] + ... develop = recipes + ... parts = extdemo + ... + ... [extdemo] + ... recipe = zc.recipe.egg:custom + ... find-links = %(server)s + ... index = %(server)s/index + ... include-dirs = include + ... + ... """ % dict(server=link_server)) + >>> print system(buildout), + Develop: '/sample-buildout/recipes' + Uninstalling checkenv. + Uninstalling extdemo. + Installing extdemo. + zip_safe flag not set; analyzing archive contents... + + >>> rmdir(sample_buildout, 'recipes') + + + Controlling develop-egg generation + ================================== + + If you want to provide custom build options for a develop egg, you can + use the develop recipe. The recipe has the following options: + + path + The path to a setup script or directory containing a startup + script. This is required. + + include-dirs + A new-line separated list of directories to search for include + files. + + library-dirs + A new-line separated list of directories to search for libraries + to link with. + + rpath + A new-line separated list of directories to search for dynamic libraries + at run time. + + define + A comma-separated list of names of C preprocessor variables to + define. + + undef + A comman separated list of names of C preprocessor variables to + undefine. + + libraries + The name of an additional library to link with. Due to limitations + in distutils and desprite the option name, only a single library + can be specified. + + link-objects + The name of an link object to link against. Due to limitations + in distutils and desprite the option name, only a single link object + can be specified. + + debug + Compile/link with debugging information + + force + Forcibly build everything (ignore file timestamps) + + compiler + Specify the compiler type + + swig + The path to the swig executable + + swig-cpp + Make SWIG create C++ files (default is C) + + swig-opts + List of SWIG command line options + + python + The name of a section to get the Python executable from. + If not specified, then the buildout python option is used. The + Python executable is found in the executable option of the named + section. + + To illustrate this, we'll use a directory containing the extdemo + example from the earlier section: + + >>> ls(extdemo) + - MANIFEST + - MANIFEST.in + - README + - extdemo.c + - setup.py + + >>> write('buildout.cfg', + ... """ + ... [buildout] + ... develop = demo + ... parts = extdemo demo + ... + ... [extdemo] + ... setup = %(extdemo)s + ... recipe = zc.recipe.egg:develop + ... include-dirs = include + ... define = TWO + ... + ... [demo] + ... recipe = zc.recipe.egg + ... eggs = demo + ... extdemo + ... entry-points = demo=demo:main + ... """ % dict(extdemo=extdemo)) + + Note that we added a define option to cause the preprocessor variable + TWO to be defined. This will cause the module-variable, 'val', to be + set with a value of 2. + + >>> print system(buildout), + Develop: '/sample-buildout/demo' + Uninstalling extdemo. + Installing extdemo. + Installing demo. + Generated script '/sample-buildout/bin/demo'. + + Our develop-eggs now includes an egg link for extdemo: + + >>> ls('develop-eggs') + - demo.egg-link + - extdemo.egg-link + - z3c.recipe.scripts.egg-link + - zc.recipe.egg.egg-link + + and the extdemo now has a built extension: + + >>> ls(extdemo) + - MANIFEST + - MANIFEST.in + - README + d build + - extdemo.c + d extdemo.egg-info + - extdemo.so + - setup.py + + Because develop eggs take precedence over non-develop eggs, the demo + script will use the new develop egg: + + >>> print system(join('bin', 'demo')), + 2 + + 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, extra-paths, and python 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 is used + 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.Scripts(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 + ... print 'extra paths:', self.egg.extra_paths + ... return () + ... + ... update = install + ... """) + + 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']}, + ... install_requires = 'zc.recipe.egg', + ... ) + ... """) + + + >>> 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 + ' -q'), + Part: sample-part + Egg requirements: + demo<0.3 + Working set: + demo 0.2 + other 1.0 + demoneeded 1.2c1 + extra paths: [] + + We can see that the options were augmented with additional data + computed by the egg recipe by looking at .installed.cfg: + + >>> cat(sample_buildout, '.installed.cfg') + ... # doctest: +NORMALIZE_WHITESPACE + [buildout] + installed_develop_eggs = /sample-buildout/develop-eggs/sample.egg-link + parts = sample-part + + [sample-part] + __buildout_installed__ = + __buildout_signature__ = sample-6aWMvV2EJ9Ijq+bR8ugArQ== + zc.recipe.egg-cAsnudgkduAa/Fd+WJIM6Q== + setuptools-0.6-py2.4.egg + zc.buildout-+rYeCcmFuD1K/aB77XTj5A== + _b = /sample-buildout/bin + _d = /sample-buildout/develop-eggs + _e = /sample-buildout/eggs + bin-directory = /sample-buildout/bin + develop-eggs-directory = /sample-buildout/develop-eggs + eggs = demo<0.3 + eggs-directory = /sample-buildout/eggs + executable = /usr/local/bin/python2.3 + extras = other + find-links = http://localhost:27071/ + index = http://localhost:27071/index + python = buildout + recipe = sample + + If we use the extra-paths option: + + >>> 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 + ... extra-paths = /foo/bar + ... /spam/eggs + ... """ % dict(server=link_server)) + + Then we'll see that reflected in the extra_paths attribute in the egg + recipe instance: + + >>> print system(buildout + ' -q'), + Part: sample-part + Egg requirements: + demo<0.3 + Working set: + demo 0.2 + other 1.0 + demoneeded 1.2c1 + extra paths: ['/foo/bar', '/spam/eggs'] + + Download + ********* + +Keywords: development build +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Framework :: Buildout +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Zope Public License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Topic :: Software Development :: Libraries :: Python Modules