summaryrefslogtreecommitdiff
path: root/eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/tests.py
diff options
context:
space:
mode:
authorNishanth Amuluru2011-01-11 22:41:51 +0530
committerNishanth Amuluru2011-01-11 22:41:51 +0530
commitb03203c8cb991c16ac8a3d74c8c4078182d0bb48 (patch)
tree7cf13b2deacbfaaec99edb431b83ddd5ea734a52 /eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/tests.py
parent0c50203cd9eb94b819883c3110922e873f003138 (diff)
downloadpytask-b03203c8cb991c16ac8a3d74c8c4078182d0bb48.tar.gz
pytask-b03203c8cb991c16ac8a3d74c8c4078182d0bb48.tar.bz2
pytask-b03203c8cb991c16ac8a3d74c8c4078182d0bb48.zip
removed all the buildout files
Diffstat (limited to 'eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/tests.py')
-rw-r--r--eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/tests.py4190
1 files changed, 0 insertions, 4190 deletions
diff --git a/eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/tests.py b/eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/tests.py
deleted file mode 100644
index bf8a715..0000000
--- a/eggs/zc.buildout-1.5.2-py2.6.egg/zc/buildout/tests.py
+++ /dev/null
@@ -1,4190 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2004-2009 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-import doctest
-from zope.testing import renormalizing
-import os
-import pkg_resources
-import re
-import shutil
-import sys
-import tempfile
-import unittest
-import zc.buildout.easy_install
-import zc.buildout.testing
-import zc.buildout.testselectingpython
-import zipfile
-
-os_path_sep = os.path.sep
-if os_path_sep == '\\':
- os_path_sep *= 2
-
-
-def develop_w_non_setuptools_setup_scripts():
- """
-We should be able to deal with setup scripts that aren't setuptools based.
-
- >>> mkdir('foo')
- >>> write('foo', 'setup.py',
- ... '''
- ... from distutils.core import setup
- ... setup(name="foo")
- ... ''')
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = foo
- ... parts =
- ... ''')
-
- >>> print system(join('bin', 'buildout')),
- Develop: '/sample-buildout/foo'
-
- >>> ls('develop-eggs')
- - foo.egg-link
- - z3c.recipe.scripts.egg-link
- - zc.recipe.egg.egg-link
-
- """
-
-def develop_verbose():
- """
-We should be able to deal with setup scripts that aren't setuptools based.
-
- >>> mkdir('foo')
- >>> write('foo', 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name="foo")
- ... ''')
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = foo
- ... parts =
- ... ''')
-
- >>> print system(join('bin', 'buildout')+' -vv'), # doctest: +ELLIPSIS
- Installing...
- Develop: '/sample-buildout/foo'
- ...
- Installed /sample-buildout/foo
- ...
-
- >>> ls('develop-eggs')
- - foo.egg-link
- - z3c.recipe.scripts.egg-link
- - zc.recipe.egg.egg-link
-
- >>> print system(join('bin', 'buildout')+' -vvv'), # doctest: +ELLIPSIS
- Installing...
- Develop: '/sample-buildout/foo'
- in: '/sample-buildout/foo'
- ... -q develop -mxN -d /sample-buildout/develop-eggs/...
-
-
- """
-
-def buildout_error_handling():
- r"""Buildout error handling
-
-Asking for a section that doesn't exist, yields a missing section error:
-
- >>> import os
- >>> os.chdir(sample_buildout)
- >>> import zc.buildout.buildout
- >>> buildout = zc.buildout.buildout.Buildout('buildout.cfg', [])
- >>> buildout['eek']
- Traceback (most recent call last):
- ...
- MissingSection: The referenced section, 'eek', was not defined.
-
-Asking for an option that doesn't exist, a MissingOption error is raised:
-
- >>> buildout['buildout']['eek']
- Traceback (most recent call last):
- ...
- MissingOption: Missing option: buildout:eek
-
-It is an error to create a variable-reference cycle:
-
- >>> write(sample_buildout, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... parts =
- ... x = ${buildout:y}
- ... y = ${buildout:z}
- ... z = ${buildout:x}
- ... ''')
-
- >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')),
- ... # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
- While:
- Initializing.
- Getting section buildout.
- Initializing section buildout.
- Getting option buildout:y.
- Getting option buildout:z.
- Getting option buildout:x.
- Getting option buildout:y.
- Error: Circular reference in substitutions.
-
-It is an error to use funny characters in variable refereces:
-
- >>> write(sample_buildout, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = data_dir debug
- ... x = ${bui$ldout:y}
- ... ''')
-
- >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')),
- While:
- Initializing.
- Getting section buildout.
- Initializing section buildout.
- Getting option buildout:x.
- Error: The section name in substitution, ${bui$ldout:y},
- has invalid characters.
-
- >>> write(sample_buildout, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = data_dir debug
- ... x = ${buildout:y{z}
- ... ''')
-
- >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')),
- While:
- Initializing.
- Getting section buildout.
- Initializing section buildout.
- Getting option buildout:x.
- Error: The option name in substitution, ${buildout:y{z},
- has invalid characters.
-
-and too have too many or too few colons:
-
- >>> write(sample_buildout, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = data_dir debug
- ... x = ${parts}
- ... ''')
-
- >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')),
- While:
- Initializing.
- Getting section buildout.
- Initializing section buildout.
- Getting option buildout:x.
- Error: The substitution, ${parts},
- doesn't contain a colon.
-
- >>> write(sample_buildout, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = data_dir debug
- ... x = ${buildout:y:z}
- ... ''')
-
- >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')),
- While:
- Initializing.
- Getting section buildout.
- Initializing section buildout.
- Getting option buildout:x.
- Error: The substitution, ${buildout:y:z},
- has too many colons.
-
-Al parts have to have a section:
-
- >>> write(sample_buildout, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = x
- ... ''')
-
- >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')),
- While:
- Installing.
- Getting section x.
- Error: The referenced section, 'x', was not defined.
-
-and all parts have to have a specified recipe:
-
-
- >>> write(sample_buildout, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = x
- ...
- ... [x]
- ... foo = 1
- ... ''')
-
- >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')),
- While:
- Installing.
- Error: Missing option: x:recipe
-
-"""
-
-make_dist_that_requires_setup_py_template = """
-from setuptools import setup
-setup(name=%r, version=%r,
- install_requires=%r,
- )
-"""
-
-def make_dist_that_requires(dest, name, requires=[], version=1, egg=''):
- os.mkdir(os.path.join(dest, name))
- open(os.path.join(dest, name, 'setup.py'), 'w').write(
- make_dist_that_requires_setup_py_template
- % (name, version, requires)
- )
-
-def show_who_requires_when_there_is_a_conflict():
- """
-It's a pain when we require eggs that have requirements that are
-incompatible. We want the error we get to tell us what is missing.
-
-Let's make a few develop distros, some of which have incompatible
-requirements.
-
- >>> make_dist_that_requires(sample_buildout, 'sampley',
- ... ['demoneeded ==1.0'])
- >>> make_dist_that_requires(sample_buildout, 'samplez',
- ... ['demoneeded ==1.1'])
-
-Now, let's create a buildout that requires y and z:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... develop = sampley samplez
- ... find-links = %(link_server)s
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg
- ... eggs = sampley
- ... samplez
- ... ''' % globals())
-
- >>> print system(buildout),
- Develop: '/sample-buildout/sampley'
- Develop: '/sample-buildout/samplez'
- Installing eggs.
- Getting distribution for 'demoneeded==1.1'.
- Got demoneeded 1.1.
- While:
- Installing eggs.
- Error: There is a version conflict.
- We already have: demoneeded 1.1
- but sampley 1 requires 'demoneeded==1.0'.
-
-Here, we see that sampley required an older version of demoneeded. What
-if we hadn't required sampley ourselves:
-
- >>> make_dist_that_requires(sample_buildout, 'samplea', ['sampleb'])
- >>> make_dist_that_requires(sample_buildout, 'sampleb',
- ... ['sampley', 'samplea'])
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... develop = sampley samplez samplea sampleb
- ... find-links = %(link_server)s
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg
- ... eggs = samplea
- ... samplez
- ... ''' % globals())
-
-If we use the verbose switch, we can see where requirements are coming from:
-
- >>> print system(buildout+' -v'), # doctest: +ELLIPSIS
- Installing 'zc.buildout', 'setuptools'.
- We have a develop egg: zc.buildout 1.0.0
- We have the best distribution that satisfies 'setuptools'.
- Picked: setuptools = 0.6
- Develop: '/sample-buildout/sampley'
- Develop: '/sample-buildout/samplez'
- Develop: '/sample-buildout/samplea'
- Develop: '/sample-buildout/sampleb'
- ...Installing eggs.
- Installing 'samplea', 'samplez'.
- We have a develop egg: samplea 1
- We have a develop egg: samplez 1
- Getting required 'demoneeded==1.1'
- required by samplez 1.
- We have the distribution that satisfies 'demoneeded==1.1'.
- Getting required 'sampleb'
- required by samplea 1.
- We have a develop egg: sampleb 1
- Getting required 'sampley'
- required by sampleb 1.
- We have a develop egg: sampley 1
- While:
- Installing eggs.
- Error: There is a version conflict.
- We already have: demoneeded 1.1
- but sampley 1 requires 'demoneeded==1.0'.
- """
-
-def show_who_requires_missing_distributions():
- """
-
-When working with a lot of eggs, which require eggs recursively, it can
-be hard to tell why we're requiring things we can't find. Fortunately,
-buildout will tell us who's asking for something that we can't find.
-
- >>> make_dist_that_requires(sample_buildout, 'sampley', ['demoneeded'])
- >>> make_dist_that_requires(sample_buildout, 'samplea', ['sampleb'])
- >>> make_dist_that_requires(sample_buildout, 'sampleb',
- ... ['sampley', 'samplea'])
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... develop = sampley samplea sampleb
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg
- ... eggs = samplea
- ... ''')
-
- >>> print system(buildout),
- Develop: '/sample-buildout/sampley'
- Develop: '/sample-buildout/samplea'
- Develop: '/sample-buildout/sampleb'
- Installing eggs.
- Couldn't find index page for 'demoneeded' (maybe misspelled?)
- Getting distribution for 'demoneeded'.
- While:
- Installing eggs.
- Getting distribution for 'demoneeded'.
- Error: Couldn't find a distribution for 'demoneeded'.
- """
-
-def show_eggs_from_site_packages():
- """
-Sometimes you want to know what eggs are coming from site-packages. This
-might be for a diagnostic, or so that you can get a starting value for the
-allowed-eggs-from-site-packages option. The -v flag will also include this
-information.
-
-Our "py_path" has the "demoneeded," "demo"
-packages available. We'll ask for "bigdemo," which will get both of them.
-
-Here's our set up.
-
- >>> py_path, site_packages_path = make_py()
- >>> create_sample_sys_install(site_packages_path)
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... prefer-final = true
- ... find-links = %(link_server)s
- ...
- ... [primed_python]
- ... executable = %(py_path)s
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg:eggs
- ... python = primed_python
- ... eggs = bigdemo
- ... ''' % globals())
-
-Now here is the output. The lines that begin with "Egg from site-packages:"
-indicate the eggs from site-packages that have been selected. You'll see
-we have two: demo 0.3 and demoneeded 1.1.
-
- >>> print system(buildout+" -v"),
- Installing 'zc.buildout', 'setuptools'.
- We have a develop egg: zc.buildout V
- We have the best distribution that satisfies 'setuptools'.
- Picked: setuptools = V
- Installing 'zc.recipe.egg'.
- We have a develop egg: zc.recipe.egg V
- Installing eggs.
- Installing 'bigdemo'.
- We have no distributions for bigdemo that satisfies 'bigdemo'.
- Getting distribution for 'bigdemo'.
- Got bigdemo 0.1.
- Picked: bigdemo = 0.1
- Getting required 'demo'
- required by bigdemo 0.1.
- We have the best distribution that satisfies 'demo'.
- Egg from site-packages: demo 0.3
- Getting required 'demoneeded'
- required by demo 0.3.
- We have the best distribution that satisfies 'demoneeded'.
- Egg from site-packages: demoneeded 1.1
- """
-
-def test_comparing_saved_options_with_funny_characters():
- """
-If an option has newlines, extra/odd spaces or a %, we need to make sure
-the comparison with the saved value works correctly.
-
- >>> mkdir(sample_buildout, 'recipes')
- >>> write(sample_buildout, 'recipes', 'debug.py',
- ... '''
- ... class Debug:
- ... def __init__(self, buildout, name, options):
- ... options['debug'] = \"\"\" <zodb>
- ...
- ... <filestorage>
- ... path foo
- ... </filestorage>
- ...
- ... </zodb>
- ... \"\"\"
- ... options['debug1'] = \"\"\"
- ... <zodb>
- ...
- ... <filestorage>
- ... path foo
- ... </filestorage>
- ...
- ... </zodb>
- ... \"\"\"
- ... options['debug2'] = ' x '
- ... options['debug3'] = '42'
- ... options['format'] = '%3d'
- ...
- ... def install(self):
- ... open('t', 'w').write('t')
- ... return 't'
- ...
- ... update = install
- ... ''')
-
-
- >>> write(sample_buildout, 'recipes', 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(
- ... name = "recipes",
- ... entry_points = {'zc.buildout': ['default = debug:Debug']},
- ... )
- ... ''')
-
- >>> write(sample_buildout, 'recipes', 'README.txt', " ")
-
- >>> write(sample_buildout, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = debug
- ...
- ... [debug]
- ... recipe = recipes
- ... ''')
-
- >>> os.chdir(sample_buildout)
- >>> buildout = os.path.join(sample_buildout, 'bin', 'buildout')
-
- >>> print system(buildout),
- Develop: '/sample-buildout/recipes'
- Installing debug.
-
-If we run the buildout again, we shoudn't get a message about
-uninstalling anything because the configuration hasn't changed.
-
- >>> print system(buildout),
- Develop: '/sample-buildout/recipes'
- Updating debug.
-"""
-
-def finding_eggs_as_local_directories():
- r"""
-It is possible to set up find-links so that we could install from
-a local directory that may contained unzipped eggs.
-
- >>> src = tmpdir('src')
- >>> write(src, 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='demo', py_modules=[''],
- ... zip_safe=False, version='1.0', author='bob', url='bob',
- ... author_email='bob')
- ... ''')
-
- >>> write(src, 't.py', '#\n')
- >>> write(src, 'README.txt', '')
- >>> _ = system(join('bin', 'buildout')+' setup ' + src + ' bdist_egg')
-
-Install it so it gets unzipped:
-
- >>> d1 = tmpdir('d1')
- >>> ws = zc.buildout.easy_install.install(
- ... ['demo'], d1, links=[join(src, 'dist')],
- ... )
-
- >>> ls(d1)
- d demo-1.0-py2.4.egg
-
-Then try to install it again:
-
- >>> d2 = tmpdir('d2')
- >>> ws = zc.buildout.easy_install.install(
- ... ['demo'], d2, links=[d1],
- ... )
-
- >>> ls(d2)
- d demo-1.0-py2.4.egg
-
- """
-
-def make_sure__get_version_works_with_2_digit_python_versions():
- """
-
-This is a test of an internal function used by higher-level machinery.
-
-We'll start by creating a faux 'python' that executable that prints a
-2-digit version. This is a bit of a pain to do portably. :(
-
- >>> mkdir('demo')
- >>> write('demo', 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='demo',
- ... entry_points = {'console_scripts': ['demo = demo:main']},
- ... )
- ... ''')
- >>> write('demo', 'demo.py',
- ... '''
- ... def main():
- ... print 'Python 2.5'
- ... ''')
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = demo
- ... parts =
- ... ''')
-
- >>> print system(join('bin', 'buildout')),
- Develop: '/sample-buildout/demo'
-
- >>> import zc.buildout.easy_install
- >>> ws = zc.buildout.easy_install.working_set(
- ... ['demo'], sys.executable, ['develop-eggs'])
- >>> bool(zc.buildout.easy_install.scripts(
- ... ['demo'], ws, sys.executable, 'bin'))
- True
-
- >>> print system(join('bin', 'demo')),
- Python 2.5
-
-Now, finally, let's test _get_version:
-
- >>> zc.buildout.easy_install._get_version(join('bin', 'demo'))
- '2.5'
-
- """
-
-def create_sections_on_command_line():
- """
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts =
- ... x = ${foo:bar}
- ... ''')
-
- >>> print system(buildout + ' foo:bar=1 -vv'), # doctest: +ELLIPSIS
- Installing 'zc.buildout', 'setuptools'.
- ...
- [foo]
- bar = 1
- ...
-
- """
-
-def test_help():
- """
- >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')+' -h'),
- ... # doctest: +ELLIPSIS
- Usage: buildout [options] [assignments] [command [command arguments]]
- <BLANKLINE>
- Options:
- <BLANKLINE>
- -h, --help
- ...
-
- >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')
- ... +' --help'),
- ... # doctest: +ELLIPSIS
- Usage: buildout [options] [assignments] [command [command arguments]]
- <BLANKLINE>
- Options:
- <BLANKLINE>
- -h, --help
- ...
- """
-
-def test_bootstrap_with_extension():
- """
-We had a problem running a bootstrap with an extension. Let's make
-sure it is fixed. Basically, we don't load extensions when
-bootstrapping.
-
- >>> d = tmpdir('sample-bootstrap')
-
- >>> write(d, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... extensions = some_awsome_extension
- ... parts =
- ... ''')
-
- >>> os.chdir(d)
- >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')
- ... + ' bootstrap'),
- Creating directory '/sample-bootstrap/bin'.
- Creating directory '/sample-bootstrap/parts'.
- Creating directory '/sample-bootstrap/eggs'.
- Creating directory '/sample-bootstrap/develop-eggs'.
- Generated script '/sample-bootstrap/bin/buildout'.
- """
-
-
-def bug_92891_bootstrap_crashes_with_egg_recipe_in_buildout_section():
- """
- >>> d = tmpdir('sample-bootstrap')
-
- >>> write(d, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = buildout
- ... eggs-directory = eggs
- ...
- ... [buildout]
- ... recipe = zc.recipe.egg
- ... eggs = zc.buildout
- ... scripts = buildout=buildout
- ... ''')
-
- >>> os.chdir(d)
- >>> print system(os.path.join(sample_buildout, 'bin', 'buildout')
- ... + ' bootstrap'),
- Creating directory '/sample-bootstrap/bin'.
- Creating directory '/sample-bootstrap/parts'.
- Creating directory '/sample-bootstrap/eggs'.
- Creating directory '/sample-bootstrap/develop-eggs'.
- Generated script '/sample-bootstrap/bin/buildout'.
-
- >>> print system(os.path.join('bin', 'buildout')),
- Unused options for buildout: 'scripts' 'eggs'.
-
- """
-
-def removing_eggs_from_develop_section_causes_egg_link_to_be_removed():
- '''
- >>> cd(sample_buildout)
-
-Create a develop egg:
-
- >>> mkdir('foo')
- >>> write('foo', 'setup.py',
- ... """
- ... from setuptools import setup
- ... setup(name='foox')
- ... """)
- >>> write('buildout.cfg',
- ... """
- ... [buildout]
- ... develop = foo
- ... parts =
- ... """)
-
- >>> print system(join('bin', 'buildout')),
- Develop: '/sample-buildout/foo'
-
- >>> ls('develop-eggs')
- - foox.egg-link
- - z3c.recipe.scripts.egg-link
- - zc.recipe.egg.egg-link
-
-Create another:
-
- >>> mkdir('bar')
- >>> write('bar', 'setup.py',
- ... """
- ... from setuptools import setup
- ... setup(name='fooy')
- ... """)
- >>> write('buildout.cfg',
- ... """
- ... [buildout]
- ... develop = foo bar
- ... parts =
- ... """)
-
- >>> print system(join('bin', 'buildout')),
- Develop: '/sample-buildout/foo'
- Develop: '/sample-buildout/bar'
-
- >>> ls('develop-eggs')
- - foox.egg-link
- - fooy.egg-link
- - z3c.recipe.scripts.egg-link
- - zc.recipe.egg.egg-link
-
-Remove one:
-
- >>> write('buildout.cfg',
- ... """
- ... [buildout]
- ... develop = bar
- ... parts =
- ... """)
- >>> print system(join('bin', 'buildout')),
- Develop: '/sample-buildout/bar'
-
-It is gone
-
- >>> ls('develop-eggs')
- - fooy.egg-link
- - z3c.recipe.scripts.egg-link
- - zc.recipe.egg.egg-link
-
-Remove the other:
-
- >>> write('buildout.cfg',
- ... """
- ... [buildout]
- ... parts =
- ... """)
- >>> print system(join('bin', 'buildout')),
-
-All gone
-
- >>> ls('develop-eggs')
- - z3c.recipe.scripts.egg-link
- - zc.recipe.egg.egg-link
- '''
-
-
-def add_setuptools_to_dependencies_when_namespace_packages():
- '''
-Often, a package depends on setuptools soley by virtue of using
-namespace packages. In this situation, package authors often forget to
-declare setuptools as a dependency. This is a mistake, but,
-unfortunately, a common one that we need to work around. If an egg
-uses namespace packages and does not include setuptools as a depenency,
-we will still include setuptools in the working set. If we see this for
-a devlop egg, we will also generate a warning.
-
- >>> mkdir('foo')
- >>> mkdir('foo', 'src')
- >>> mkdir('foo', 'src', 'stuff')
- >>> write('foo', 'src', 'stuff', '__init__.py',
- ... """__import__('pkg_resources').declare_namespace(__name__)
- ... """)
- >>> mkdir('foo', 'src', 'stuff', 'foox')
- >>> write('foo', 'src', 'stuff', 'foox', '__init__.py', '')
- >>> write('foo', 'setup.py',
- ... """
- ... from setuptools import setup
- ... setup(name='foox',
- ... namespace_packages = ['stuff'],
- ... package_dir = {'': 'src'},
- ... packages = ['stuff', 'stuff.foox'],
- ... )
- ... """)
- >>> write('foo', 'README.txt', '')
-
- >>> write('buildout.cfg',
- ... """
- ... [buildout]
- ... develop = foo
- ... parts =
- ... """)
-
- >>> print system(join('bin', 'buildout')),
- Develop: '/sample-buildout/foo'
-
-Now, if we generate a working set using the egg link, we will get a warning
-and we will get setuptools included in the working set.
-
- >>> import logging, zope.testing.loggingsupport
- >>> handler = zope.testing.loggingsupport.InstalledHandler(
- ... 'zc.buildout.easy_install', level=logging.WARNING)
- >>> logging.getLogger('zc.buildout.easy_install').propagate = False
-
- >>> [dist.project_name
- ... for dist in zc.buildout.easy_install.working_set(
- ... ['foox'], sys.executable,
- ... [join(sample_buildout, 'eggs'),
- ... join(sample_buildout, 'develop-eggs'),
- ... ])]
- ['foox', 'setuptools']
-
- >>> print handler
- zc.buildout.easy_install WARNING
- Develop distribution: foox 0.0.0
- uses namespace packages but the distribution does not require setuptools.
-
- >>> handler.clear()
-
-On the other hand, if we have a regular egg, rather than a develop egg:
-
- >>> os.remove(join('develop-eggs', 'foox.egg-link'))
-
- >>> _ = system(join('bin', 'buildout') + ' setup foo bdist_egg -d'
- ... + join(sample_buildout, 'eggs'))
-
- >>> ls('develop-eggs')
- - z3c.recipe.scripts.egg-link
- - zc.recipe.egg.egg-link
-
- >>> print 'START ->'; ls('eggs') # doctest: +ELLIPSIS
- START...
- - foox-0.0.0-py2.4.egg
- ...
-
-We do not get a warning, but we do get setuptools included in the working set:
-
- >>> [dist.project_name
- ... for dist in zc.buildout.easy_install.working_set(
- ... ['foox'], sys.executable,
- ... [join(sample_buildout, 'eggs'),
- ... join(sample_buildout, 'develop-eggs'),
- ... ])]
- ['foox', 'setuptools']
-
- >>> print handler,
-
-We get the same behavior if the it is a depedency that uses a
-namespace package.
-
-
- >>> mkdir('bar')
- >>> write('bar', 'setup.py',
- ... """
- ... from setuptools import setup
- ... setup(name='bar', install_requires = ['foox'])
- ... """)
- >>> write('bar', 'README.txt', '')
-
- >>> write('buildout.cfg',
- ... """
- ... [buildout]
- ... develop = foo bar
- ... parts =
- ... """)
-
- >>> print system(join('bin', 'buildout')),
- Develop: '/sample-buildout/foo'
- Develop: '/sample-buildout/bar'
-
- >>> [dist.project_name
- ... for dist in zc.buildout.easy_install.working_set(
- ... ['bar'], sys.executable,
- ... [join(sample_buildout, 'eggs'),
- ... join(sample_buildout, 'develop-eggs'),
- ... ])]
- ['bar', 'foox', 'setuptools']
-
- >>> print handler,
- zc.buildout.easy_install WARNING
- Develop distribution: foox 0.0.0
- uses namespace packages but the distribution does not require setuptools.
-
-
- >>> logging.getLogger('zc.buildout.easy_install').propagate = True
- >>> handler.uninstall()
-
- '''
-
-def develop_preserves_existing_setup_cfg():
- """
-
-See "Handling custom build options for extensions in develop eggs" in
-easy_install.txt. This will be very similar except that we'll have an
-existing setup.cfg:
-
- >>> write(extdemo, "setup.cfg",
- ... '''
- ... # sampe cfg file
- ...
- ... [foo]
- ... bar = 1
- ...
- ... [build_ext]
- ... define = X,Y
- ... ''')
-
- >>> mkdir('include')
- >>> write('include', 'extdemo.h',
- ... '''
- ... #define EXTDEMO 42
- ... ''')
-
- >>> dest = tmpdir('dest')
- >>> zc.buildout.easy_install.develop(
- ... extdemo, dest,
- ... {'include-dirs': os.path.join(sample_buildout, 'include')})
- '/dest/extdemo.egg-link'
-
- >>> ls(dest)
- - extdemo.egg-link
-
- >>> cat(extdemo, "setup.cfg")
- <BLANKLINE>
- # sampe cfg file
- <BLANKLINE>
- [foo]
- bar = 1
- <BLANKLINE>
- [build_ext]
- define = X,Y
-
-"""
-
-def uninstall_recipes_used_for_removal():
- """
-Uninstall recipes need to be called when a part is removed too:
-
- >>> mkdir("recipes")
- >>> write("recipes", "setup.py",
- ... '''
- ... from setuptools import setup
- ... setup(name='recipes',
- ... entry_points={
- ... 'zc.buildout': ["demo=demo:Install"],
- ... 'zc.buildout.uninstall': ["demo=demo:uninstall"],
- ... })
- ... ''')
-
- >>> write("recipes", "demo.py",
- ... '''
- ... class Install:
- ... def __init__(*args): pass
- ... def install(self):
- ... print 'installing'
- ... return ()
- ... def uninstall(name, options): print 'uninstalling'
- ... ''')
-
- >>> write('buildout.cfg', '''
- ... [buildout]
- ... develop = recipes
- ... parts = demo
- ... [demo]
- ... recipe = recipes:demo
- ... ''')
-
- >>> print system(join('bin', 'buildout')),
- Develop: '/sample-buildout/recipes'
- Installing demo.
- installing
-
-
- >>> write('buildout.cfg', '''
- ... [buildout]
- ... develop = recipes
- ... parts = demo
- ... [demo]
- ... recipe = recipes:demo
- ... x = 1
- ... ''')
-
- >>> print system(join('bin', 'buildout')),
- Develop: '/sample-buildout/recipes'
- Uninstalling demo.
- Running uninstall recipe.
- uninstalling
- Installing demo.
- installing
-
-
- >>> write('buildout.cfg', '''
- ... [buildout]
- ... develop = recipes
- ... parts =
- ... ''')
-
- >>> print system(join('bin', 'buildout')),
- Develop: '/sample-buildout/recipes'
- Uninstalling demo.
- Running uninstall recipe.
- uninstalling
-
-"""
-
-def extensions_installed_as_eggs_work_in_offline_mode():
- '''
- >>> mkdir('demo')
-
- >>> write('demo', 'demo.py',
- ... """
- ... def ext(buildout):
- ... print 'ext', list(buildout)
- ... """)
-
- >>> write('demo', 'setup.py',
- ... """
- ... from setuptools import setup
- ...
- ... setup(
- ... name = "demo",
- ... py_modules=['demo'],
- ... entry_points = {'zc.buildout.extension': ['ext = demo:ext']},
- ... )
- ... """)
-
- >>> bdist_egg(join(sample_buildout, "demo"), sys.executable,
- ... join(sample_buildout, "eggs"))
-
- >>> write(sample_buildout, 'buildout.cfg',
- ... """
- ... [buildout]
- ... extensions = demo
- ... parts =
- ... offline = true
- ... """)
-
- >>> print system(join(sample_buildout, 'bin', 'buildout')),
- ext ['buildout']
-
-
- '''
-
-def changes_in_svn_or_CVS_dont_affect_sig():
- """
-
-If we have a develop recipe, it's signature shouldn't be affected to
-changes in .svn or CVS directories.
-
- >>> mkdir('recipe')
- >>> write('recipe', 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='recipe',
- ... entry_points={'zc.buildout': ['default=foo:Foo']})
- ... ''')
- >>> write('recipe', 'foo.py',
- ... '''
- ... class Foo:
- ... def __init__(*args): pass
- ... def install(*args): return ()
- ... update = install
- ... ''')
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipe
- ... parts = foo
- ...
- ... [foo]
- ... recipe = recipe
- ... ''')
-
-
- >>> print system(join(sample_buildout, 'bin', 'buildout')),
- Develop: '/sample-buildout/recipe'
- Installing foo.
-
- >>> mkdir('recipe', '.svn')
- >>> mkdir('recipe', 'CVS')
- >>> print system(join(sample_buildout, 'bin', 'buildout')),
- Develop: '/sample-buildout/recipe'
- Updating foo.
-
- >>> write('recipe', '.svn', 'x', '1')
- >>> write('recipe', 'CVS', 'x', '1')
-
- >>> print system(join(sample_buildout, 'bin', 'buildout')),
- Develop: '/sample-buildout/recipe'
- Updating foo.
-
- """
-
-if hasattr(os, 'symlink'):
- def bug_250537_broken_symlink_doesnt_affect_sig():
- """
-If we have a develop recipe, it's signature shouldn't be affected by
-broken symlinks, and better yet, computing the hash should not break
-because of the missing target file.
-
- >>> mkdir('recipe')
- >>> write('recipe', 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='recipe',
- ... entry_points={'zc.buildout': ['default=foo:Foo']})
- ... ''')
- >>> write('recipe', 'foo.py',
- ... '''
- ... class Foo:
- ... def __init__(*args): pass
- ... def install(*args): return ()
- ... update = install
- ... ''')
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipe
- ... parts = foo
- ...
- ... [foo]
- ... recipe = recipe
- ... ''')
-
-
- >>> print system(join(sample_buildout, 'bin', 'buildout')),
- Develop: '/sample-buildout/recipe'
- Installing foo.
-
- >>> write('recipe', 'some-file', '1')
- >>> os.symlink(join('recipe', 'some-file'),
- ... join('recipe', 'another-file'))
- >>> ls('recipe')
- l another-file
- - foo.py
- - foo.pyc
- d recipe.egg-info
- - setup.py
- - some-file
-
- >>> remove('recipe', 'some-file')
-
- >>> print system(join(sample_buildout, 'bin', 'buildout')),
- Develop: '/sample-buildout/recipe'
- Updating foo.
-
- """
-
-def o_option_sets_offline():
- """
- >>> print system(join(sample_buildout, 'bin', 'buildout')+' -vvo'),
- ... # doctest: +ELLIPSIS
- <BLANKLINE>
- ...
- offline = true
- ...
- """
-
-def recipe_upgrade():
- """
-
-The buildout will upgrade recipes in newest (and non-offline) mode.
-
-Let's create a recipe egg
-
- >>> mkdir('recipe')
- >>> write('recipe', 'recipe.py',
- ... '''
- ... class Recipe:
- ... def __init__(*a): pass
- ... def install(self):
- ... print 'recipe v1'
- ... return ()
- ... update = install
- ... ''')
-
- >>> write('recipe', 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='recipe', version='1', py_modules=['recipe'],
- ... entry_points={'zc.buildout': ['default = recipe:Recipe']},
- ... )
- ... ''')
-
- >>> write('recipe', 'README', '')
-
- >>> print system(buildout+' setup recipe bdist_egg'), # doctest: +ELLIPSIS
- Running setup script 'recipe/setup.py'.
- ...
-
- >>> rmdir('recipe', 'build')
-
-And update our buildout to use it.
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = foo
- ... find-links = %s
- ...
- ... [foo]
- ... recipe = recipe
- ... ''' % join('recipe', 'dist'))
-
- >>> print system(buildout),
- Getting distribution for 'recipe'.
- Got recipe 1.
- Installing foo.
- recipe v1
-
-Now, if we update the recipe egg:
-
- >>> write('recipe', 'recipe.py',
- ... '''
- ... class Recipe:
- ... def __init__(*a): pass
- ... def install(self):
- ... print 'recipe v2'
- ... return ()
- ... update = install
- ... ''')
-
- >>> write('recipe', 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='recipe', version='2', py_modules=['recipe'],
- ... entry_points={'zc.buildout': ['default = recipe:Recipe']},
- ... )
- ... ''')
-
-
- >>> print system(buildout+' setup recipe bdist_egg'), # doctest: +ELLIPSIS
- Running setup script 'recipe/setup.py'.
- ...
-
-We won't get the update if we specify -N:
-
- >>> print system(buildout+' -N'),
- Updating foo.
- recipe v1
-
-or if we use -o:
-
- >>> print system(buildout+' -o'),
- Updating foo.
- recipe v1
-
-But we will if we use neither of these:
-
- >>> print system(buildout),
- Getting distribution for 'recipe'.
- Got recipe 2.
- Uninstalling foo.
- Installing foo.
- recipe v2
-
-We can also select a particular recipe version:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = foo
- ... find-links = %s
- ...
- ... [foo]
- ... recipe = recipe ==1
- ... ''' % join('recipe', 'dist'))
-
- >>> print system(buildout),
- Uninstalling foo.
- Installing foo.
- recipe v1
-
- """
-
-def update_adds_to_uninstall_list():
- """
-
-Paths returned by the update method are added to the list of paths to
-uninstall
-
- >>> mkdir('recipe')
- >>> write('recipe', 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='recipe',
- ... entry_points={'zc.buildout': ['default = recipe:Recipe']},
- ... )
- ... ''')
-
- >>> write('recipe', 'recipe.py',
- ... '''
- ... import os
- ... class Recipe:
- ... def __init__(*_): pass
- ... def install(self):
- ... r = ('a', 'b', 'c')
- ... for p in r: os.mkdir(p)
- ... return r
- ... def update(self):
- ... r = ('c', 'd', 'e')
- ... for p in r:
- ... if not os.path.exists(p):
- ... os.mkdir(p)
- ... return r
- ... ''')
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipe
- ... parts = foo
- ...
- ... [foo]
- ... recipe = recipe
- ... ''')
-
- >>> print system(buildout),
- Develop: '/sample-buildout/recipe'
- Installing foo.
-
- >>> print system(buildout),
- Develop: '/sample-buildout/recipe'
- Updating foo.
-
- >>> cat('.installed.cfg') # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
- [buildout]
- ...
- [foo]
- __buildout_installed__ = a
- b
- c
- d
- e
- __buildout_signature__ = ...
-
-"""
-
-def log_when_there_are_not_local_distros():
- """
- >>> from zope.testing.loggingsupport import InstalledHandler
- >>> handler = InstalledHandler('zc.buildout.easy_install')
- >>> import logging
- >>> logger = logging.getLogger('zc.buildout.easy_install')
- >>> old_propogate = logger.propagate
- >>> logger.propagate = False
-
- >>> dest = tmpdir('sample-install')
- >>> import zc.buildout.easy_install
- >>> ws = zc.buildout.easy_install.install(
- ... ['demo==0.2'], dest,
- ... links=[link_server], index=link_server+'index/')
-
- >>> print handler # doctest: +ELLIPSIS
- zc.buildout.easy_install DEBUG
- Installing 'demo==0.2'.
- zc.buildout.easy_install DEBUG
- We have no distributions for demo that satisfies 'demo==0.2'.
- ...
-
- >>> handler.uninstall()
- >>> logger.propagate = old_propogate
-
- """
-
-def internal_errors():
- """Internal errors are clearly marked and don't generate tracebacks:
-
- >>> mkdir(sample_buildout, 'recipes')
-
- >>> write(sample_buildout, 'recipes', 'mkdir.py',
- ... '''
- ... class Mkdir:
- ... def __init__(self, buildout, name, options):
- ... self.name, self.options = name, options
- ... options['path'] = os.path.join(
- ... buildout['buildout']['directory'],
- ... options['path'],
- ... )
- ... ''')
-
- >>> write(sample_buildout, 'recipes', 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name = "recipes",
- ... entry_points = {'zc.buildout': ['mkdir = mkdir:Mkdir']},
- ... )
- ... ''')
-
- >>> write(sample_buildout, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = data-dir
- ...
- ... [data-dir]
- ... recipe = recipes:mkdir
- ... ''')
-
- >>> print system(buildout), # doctest: +ELLIPSIS
- Develop: '/sample-buildout/recipes'
- While:
- Installing.
- Getting section data-dir.
- Initializing part data-dir.
- <BLANKLINE>
- An internal error occurred due to a bug in either zc.buildout or in a
- recipe being used:
- Traceback (most recent call last):
- ...
- NameError: global name 'os' is not defined
- """
-
-def whine_about_unused_options():
- '''
-
- >>> write('foo.py',
- ... """
- ... class Foo:
- ...
- ... def __init__(self, buildout, name, options):
- ... self.name, self.options = name, options
- ... options['x']
- ...
- ... def install(self):
- ... self.options['y']
- ... return ()
- ... """)
-
- >>> write('setup.py',
- ... """
- ... from setuptools import setup
- ... setup(name = "foo",
- ... entry_points = {'zc.buildout': ['default = foo:Foo']},
- ... )
- ... """)
-
- >>> write('buildout.cfg',
- ... """
- ... [buildout]
- ... develop = .
- ... parts = foo
- ... a = 1
- ...
- ... [foo]
- ... recipe = foo
- ... x = 1
- ... y = 1
- ... z = 1
- ... """)
-
- >>> print system(buildout),
- Develop: '/sample-buildout/.'
- Unused options for buildout: 'a'.
- Installing foo.
- Unused options for foo: 'z'.
- '''
-
-def abnormal_exit():
- """
-People sometimes hit control-c while running a builout. We need to make
-sure that the installed database Isn't corrupted. To test this, we'll create
-some evil recipes that exit uncleanly:
-
- >>> mkdir('recipes')
- >>> write('recipes', 'recipes.py',
- ... '''
- ... import os
- ...
- ... class Clean:
- ... def __init__(*_): pass
- ... def install(_): return ()
- ... def update(_): pass
- ...
- ... class EvilInstall(Clean):
- ... def install(_): os._exit(1)
- ...
- ... class EvilUpdate(Clean):
- ... def update(_): os._exit(1)
- ... ''')
-
- >>> write('recipes', 'setup.py',
- ... '''
- ... import setuptools
- ... setuptools.setup(name='recipes',
- ... entry_points = {
- ... 'zc.buildout': [
- ... 'clean = recipes:Clean',
- ... 'evil_install = recipes:EvilInstall',
- ... 'evil_update = recipes:EvilUpdate',
- ... 'evil_uninstall = recipes:Clean',
- ... ],
- ... },
- ... )
- ... ''')
-
-Now let's look at 3 cases:
-
-1. We exit during installation after installing some other parts:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = p1 p2 p3 p4
- ...
- ... [p1]
- ... recipe = recipes:clean
- ...
- ... [p2]
- ... recipe = recipes:clean
- ...
- ... [p3]
- ... recipe = recipes:evil_install
- ...
- ... [p4]
- ... recipe = recipes:clean
- ... ''')
-
- >>> print system(buildout),
- Develop: '/sample-buildout/recipes'
- Installing p1.
- Installing p2.
- Installing p3.
-
- >>> print system(buildout),
- Develop: '/sample-buildout/recipes'
- Updating p1.
- Updating p2.
- Installing p3.
-
- >>> print system(buildout+' buildout:parts='),
- Develop: '/sample-buildout/recipes'
- Uninstalling p2.
- Uninstalling p1.
-
-2. We exit while updating:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = p1 p2 p3 p4
- ...
- ... [p1]
- ... recipe = recipes:clean
- ...
- ... [p2]
- ... recipe = recipes:clean
- ...
- ... [p3]
- ... recipe = recipes:evil_update
- ...
- ... [p4]
- ... recipe = recipes:clean
- ... ''')
-
- >>> print system(buildout),
- Develop: '/sample-buildout/recipes'
- Installing p1.
- Installing p2.
- Installing p3.
- Installing p4.
-
- >>> print system(buildout),
- Develop: '/sample-buildout/recipes'
- Updating p1.
- Updating p2.
- Updating p3.
-
- >>> print system(buildout+' buildout:parts='),
- Develop: '/sample-buildout/recipes'
- Uninstalling p2.
- Uninstalling p1.
- Uninstalling p4.
- Uninstalling p3.
-
-3. We exit while installing or updating after uninstalling:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = p1 p2 p3 p4
- ...
- ... [p1]
- ... recipe = recipes:evil_update
- ...
- ... [p2]
- ... recipe = recipes:clean
- ...
- ... [p3]
- ... recipe = recipes:clean
- ...
- ... [p4]
- ... recipe = recipes:clean
- ... ''')
-
- >>> print system(buildout),
- Develop: '/sample-buildout/recipes'
- Installing p1.
- Installing p2.
- Installing p3.
- Installing p4.
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = p1 p2 p3 p4
- ...
- ... [p1]
- ... recipe = recipes:evil_update
- ...
- ... [p2]
- ... recipe = recipes:clean
- ...
- ... [p3]
- ... recipe = recipes:clean
- ...
- ... [p4]
- ... recipe = recipes:clean
- ... x = 1
- ... ''')
-
- >>> print system(buildout),
- Develop: '/sample-buildout/recipes'
- Uninstalling p4.
- Updating p1.
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = p1 p2 p3 p4
- ...
- ... [p1]
- ... recipe = recipes:clean
- ...
- ... [p2]
- ... recipe = recipes:clean
- ...
- ... [p3]
- ... recipe = recipes:clean
- ...
- ... [p4]
- ... recipe = recipes:clean
- ... ''')
-
- >>> print system(buildout),
- Develop: '/sample-buildout/recipes'
- Uninstalling p1.
- Installing p1.
- Updating p2.
- Updating p3.
- Installing p4.
-
- """
-
-def install_source_dist_with_bad_py():
- """
-
- >>> mkdir('badegg')
- >>> mkdir('badegg', 'badegg')
- >>> write('badegg', 'badegg', '__init__.py', '#\\n')
- >>> mkdir('badegg', 'badegg', 'scripts')
- >>> write('badegg', 'badegg', 'scripts', '__init__.py', '#\\n')
- >>> write('badegg', 'badegg', 'scripts', 'one.py',
- ... '''
- ... return 1
- ... ''')
-
- >>> write('badegg', 'setup.py',
- ... '''
- ... from setuptools import setup, find_packages
- ... setup(
- ... name='badegg',
- ... version='1',
- ... packages = find_packages('.'),
- ... zip_safe=False)
- ... ''')
-
- >>> print system(buildout+' setup badegg sdist'), # doctest: +ELLIPSIS
- Running setup script 'badegg/setup.py'.
- ...
-
- >>> dist = join('badegg', 'dist')
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs bo
- ... find-links = %(dist)s
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg
- ... eggs = badegg
- ...
- ... [bo]
- ... recipe = zc.recipe.egg
- ... eggs = zc.buildout
- ... scripts = buildout=bo
- ... ''' % globals())
-
- >>> print system(buildout);print 'X' # doctest: +ELLIPSIS
- Installing eggs.
- Getting distribution for 'badegg'.
- Got badegg 1.
- Installing bo.
- ...
- SyntaxError: ...'return' outside function...
- ...
- SyntaxError: ...'return' outside function...
- ...
-
- >>> ls('eggs') # doctest: +ELLIPSIS
- d badegg-1-py2.4.egg
- ...
-
- >>> ls('bin')
- - bo
- - buildout
- """
-
-def version_requirements_in_build_honored():
- '''
-
- >>> update_extdemo()
- >>> dest = tmpdir('sample-install')
- >>> mkdir('include')
- >>> write('include', 'extdemo.h',
- ... """
- ... #define EXTDEMO 42
- ... """)
-
- >>> zc.buildout.easy_install.build(
- ... 'extdemo ==1.4', dest,
- ... {'include-dirs': os.path.join(sample_buildout, 'include')},
- ... links=[link_server], index=link_server+'index/',
- ... newest=False)
- ['/sample-install/extdemo-1.4-py2.4-linux-i686.egg']
-
- '''
-
-def bug_105081_Specific_egg_versions_are_ignored_when_newer_eggs_are_around():
- """
- Buildout might ignore a specific egg requirement for a recipe:
-
- - Have a newer version of an egg in your eggs directory
- - Use 'recipe==olderversion' in your buildout.cfg to request an
- older version
-
- Buildout will go and fetch the older version, but it will *use*
- the newer version when installing a part with this recipe.
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = x
- ... find-links = %(sample_eggs)s
- ...
- ... [x]
- ... recipe = zc.recipe.egg
- ... eggs = demo
- ... ''' % globals())
-
- >>> print system(buildout),
- Installing x.
- Getting distribution for 'demo'.
- Got demo 0.4c1.
- Getting distribution for 'demoneeded'.
- Got demoneeded 1.2c1.
- Generated script '/sample-buildout/bin/demo'.
-
- >>> print system(join('bin', 'demo')),
- 4 2
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = x
- ... find-links = %(sample_eggs)s
- ...
- ... [x]
- ... recipe = zc.recipe.egg
- ... eggs = demo ==0.1
- ... ''' % globals())
-
- >>> print system(buildout),
- Uninstalling x.
- Installing x.
- Getting distribution for 'demo==0.1'.
- Got demo 0.1.
- Generated script '/sample-buildout/bin/demo'.
-
- >>> print system(join('bin', 'demo')),
- 1 2
- """
-
-def versions_section_ignored_for_dependency_in_favor_of_site_packages():
- r"""
-This is a test for a bugfix.
-
-The error showed itself when at least two dependencies were in a shared
-location like site-packages, and the first one met the "versions" setting. The
-first dependency would be added, but subsequent dependencies from the same
-location (e.g., site-packages) would use the version of the package found in
-the shared location, ignoring the version setting.
-
-We begin with a Python that has demoneeded version 1.1 installed and a
-demo version 0.3, all in a site-packages-like shared directory. We need
-to create this. ``eggrecipedemo.main()`` shows the number after the dot
-(that is, ``X`` in ``1.X``), for the demo package and the demoneeded
-package, so this demonstrates that our Python does in fact have demo
-version 0.3 and demoneeded version 1.1.
-
- >>> py_path = make_py_with_system_install(make_py, sample_eggs)
- >>> print call_py(
- ... py_path,
- ... "import tellmy.version; print tellmy.version.__version__"),
- 1.1
-
-Now here's a setup that would expose the bug, using the
-zc.buildout.easy_install API.
-
- >>> example_dest = tmpdir('example_dest')
- >>> workingset = zc.buildout.easy_install.install(
- ... ['tellmy.version'], example_dest, links=[sample_eggs],
- ... executable=py_path,
- ... index=None,
- ... versions={'tellmy.version': '1.0'})
- >>> for dist in workingset:
- ... res = str(dist)
- ... if res.startswith('tellmy.version'):
- ... print res
- ... break
- tellmy.version 1.0
-
-Before the bugfix, the desired tellmy.version distribution would have
-been blocked the one in site-packages.
-"""
-
-def handle_namespace_package_in_both_site_packages_and_buildout_eggs():
- r"""
-If you have the same namespace package in both site-packages and in
-buildout, we need to be very careful that faux-Python-executables and
-scripts generated by easy_install.sitepackage_safe_scripts correctly
-combine the two. We show this with the local recipe that uses the
-function, z3c.recipe.scripts.
-
-To demonstrate this, we will create three packages: tellmy.version 1.0,
-tellmy.version 1.1, and tellmy.fortune 1.0. tellmy.version 1.1 is installed.
-
- >>> py_path = make_py_with_system_install(make_py, sample_eggs)
- >>> print call_py(
- ... py_path,
- ... "import tellmy.version; print tellmy.version.__version__")
- 1.1
- <BLANKLINE>
-
-Now we will create a buildout that creates a script and a faux-Python script.
-We want to see that both can successfully import the specified versions of
-tellmy.version and tellmy.fortune.
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... find-links = %(link_server)s
- ...
- ... [primed_python]
- ... executable = %(py_path)s
- ...
- ... [eggs]
- ... recipe = z3c.recipe.scripts
- ... python = primed_python
- ... interpreter = py
- ... include-site-packages = true
- ... eggs = tellmy.version == 1.0
- ... tellmy.fortune == 1.0
- ... demo
- ... script-initialization =
- ... import tellmy.version
- ... print tellmy.version.__version__
- ... import tellmy.fortune
- ... print tellmy.fortune.__version__
- ... ''' % globals())
-
- >>> print system(buildout)
- Installing eggs.
- Getting distribution for 'tellmy.version==1.0'.
- Got tellmy.version 1.0.
- Getting distribution for 'tellmy.fortune==1.0'.
- Got tellmy.fortune 1.0.
- Getting distribution for 'demo'.
- Got demo 0.4c1.
- Getting distribution for 'demoneeded'.
- Got demoneeded 1.2c1.
- Generated script '/sample-buildout/bin/demo'.
- Generated interpreter '/sample-buildout/bin/py'.
- <BLANKLINE>
-
-Finally, we are ready to see if it worked. Prior to the bug fix that
-this tests, the results of both calls below was the following::
-
- 1.1
- Traceback (most recent call last):
- ...
- ImportError: No module named fortune
- <BLANKLINE>
-
-In other words, we got the site-packages version of tellmy.version, and
-we could not import tellmy.fortune at all. The following are the correct
-results for the interpreter and for the script.
-
- >>> print call_py(
- ... join('bin', 'py'),
- ... "import tellmy.version; " +
- ... "print tellmy.version.__version__; " +
- ... "import tellmy.fortune; " +
- ... "print tellmy.fortune.__version__") # doctest: +ELLIPSIS
- 1.0
- 1.0...
-
- >>> print system(join('bin', 'demo'))
- 1.0
- 1.0
- 4 2
- <BLANKLINE>
- """
-
-def handle_sys_path_version_hack():
- r"""
-This is a test for a bugfix.
-
-If you use a Python that has a different version of one of your
-dependencies, and the new package tries to do sys.path tricks in the
-setup.py to get a __version__, and it uses namespace packages, the older
-package will be loaded first, making the setup version the wrong number.
-While very arguably packages simply shouldn't do this, some do, and we
-don't want buildout to fall over when they do.
-
-To demonstrate this, we will need to create a distribution that has one of
-these unpleasant tricks, and a Python that has an older version installed.
-
- >>> py_path, site_packages_path = make_py()
- >>> for version in ('1.0', '1.1'):
- ... tmp = tempfile.mkdtemp()
- ... try:
- ... write(tmp, 'README.txt', '')
- ... mkdir(tmp, 'src')
- ... mkdir(tmp, 'src', 'tellmy')
- ... write(tmp, 'src', 'tellmy', '__init__.py',
- ... "__import__("
- ... "'pkg_resources').declare_namespace(__name__)\n")
- ... mkdir(tmp, 'src', 'tellmy', 'version')
- ... write(tmp, 'src', 'tellmy', 'version',
- ... '__init__.py', '__version__=%r\n' % version)
- ... write(
- ... tmp, 'setup.py',
- ... "from setuptools import setup\n"
- ... "import sys\n"
- ... "sys.path.insert(0, 'src')\n"
- ... "from tellmy.version import __version__\n"
- ... "setup(\n"
- ... " name='tellmy.version',\n"
- ... " package_dir = {'': 'src'},\n"
- ... " packages = ['tellmy', 'tellmy.version'],\n"
- ... " install_requires = ['setuptools'],\n"
- ... " namespace_packages=['tellmy'],\n"
- ... " zip_safe=True, version=__version__,\n"
- ... " author='bob', url='bob', author_email='bob')\n"
- ... )
- ... zc.buildout.testing.sdist(tmp, sample_eggs)
- ... if version == '1.0':
- ... # We install the 1.0 version in site packages the way a
- ... # system packaging system (debs, rpms) would do it.
- ... zc.buildout.testing.sys_install(tmp, site_packages_path)
- ... finally:
- ... shutil.rmtree(tmp)
- >>> print call_py(
- ... py_path,
- ... "import tellmy.version; print tellmy.version.__version__")
- 1.0
- <BLANKLINE>
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... find-links = %(sample_eggs)s
- ...
- ... [primed_python]
- ... executable = %(py_path)s
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg:eggs
- ... python = primed_python
- ... eggs = tellmy.version == 1.1
- ... ''' % globals())
-
-Before the bugfix, running this buildout would generate this error:
-
- Installing eggs.
- Getting distribution for 'tellmy.version==1.1'.
- Installing tellmy.version 1.1
- Caused installation of a distribution:
- tellmy.version 1.0
- with a different version.
- Got None.
- While:
- Installing eggs.
- Error: There is a version conflict.
- We already have: tellmy.version 1.0
- <BLANKLINE>
-
-You can see the copiously commented fix for this in easy_install.py (see
-zc.buildout.easy_install.Installer._call_easy_install and particularly
-the comment leading up to zc.buildout.easy_install._easy_install_cmd).
-Now the install works correctly, as seen here.
-
- >>> print system(buildout)
- Installing eggs.
- Getting distribution for 'tellmy.version==1.1'.
- Got tellmy.version 1.1.
- <BLANKLINE>
-
- """
-
-def isolated_include_site_packages():
- """
-
-This is an isolated test of the include_site_packages functionality, passing
-the argument directly to install, overriding a default.
-
-Our "py_path" has the "demoneeded" and "demo" packages available. We'll
-simply be asking for "demoneeded" here.
-
- >>> py_path, site_packages_path = make_py()
- >>> create_sample_sys_install(site_packages_path)
- >>> zc.buildout.easy_install.include_site_packages(False)
- True
-
- >>> example_dest = tmpdir('site-packages-example-install')
- >>> workingset = zc.buildout.easy_install.install(
- ... ['demoneeded'], example_dest, links=[], executable=py_path,
- ... index=None, include_site_packages=True)
- >>> [dist.project_name for dist in workingset]
- ['demoneeded']
-
-That worked fine. Let's try again with site packages not allowed (and
-reversing the default).
-
- >>> zc.buildout.easy_install.include_site_packages(True)
- False
-
- >>> zc.buildout.easy_install.clear_index_cache()
- >>> rmdir(example_dest)
- >>> example_dest = tmpdir('site-packages-example-install')
- >>> workingset = zc.buildout.easy_install.install(
- ... ['demoneeded'], example_dest, links=[], executable=py_path,
- ... index=None, include_site_packages=False)
- Traceback (most recent call last):
- ...
- MissingDistribution: Couldn't find a distribution for 'demoneeded'.
-
-That's a failure, as expected.
-
-Now we explore an important edge case.
-
-Some system Pythons include setuptools (and other Python packages) in their
-site-packages (or equivalent) using a .egg-info directory. The pkg_resources
-module (from setuptools) considers a package installed using .egg-info to be a
-develop egg.
-
-zc.buildout.buildout.Buildout.bootstrap will make setuptools and zc.buildout
-available to the buildout via the eggs directory, for normal eggs; or the
-develop-eggs directory, for develop-eggs.
-
-If setuptools or zc.buildout is found in site-packages and considered by
-pkg_resources to be a develop egg, then the bootstrap code will use a .egg-link
-in the local develop-eggs, pointing to site-packages, in its entirety. Because
-develop-eggs must always be available for searching for distributions, this
-indirectly brings site-packages back into the search path for distributions.
-
-Because of this, we have to take special care that we still exclude
-site-packages even in this case. See the comments about site packages in the
-Installer._satisfied and Installer._obtain methods for the implementation
-(as of this writing).
-
-In this demonstration, we insert a link to the "demoneeded" distribution
-in our develop-eggs, which would bring the package back in, except for
-the special care we have taken to exclude it.
-
- >>> zc.buildout.easy_install.clear_index_cache()
- >>> rmdir(example_dest)
- >>> example_dest = tmpdir('site-packages-example-install')
- >>> mkdir(example_dest, 'develop-eggs')
- >>> write(example_dest, 'develop-eggs', 'demoneeded.egg-link',
- ... site_packages_path)
- >>> workingset = zc.buildout.easy_install.install(
- ... ['demoneeded'], example_dest, links=[],
- ... path=[join(example_dest, 'develop-eggs')],
- ... executable=py_path,
- ... index=None, include_site_packages=False)
- Traceback (most recent call last):
- ...
- MissingDistribution: Couldn't find a distribution for 'demoneeded'.
-
-The MissingDistribution error shows that buildout correctly excluded the
-"site-packages" source even though it was indirectly included in the path
-via a .egg-link file.
-
- """
-
-def include_site_packages_bug_623590():
- """
-As mentioned in isolated_include_site_packages, some system Pythons
-include various Python packages in their site-packages (or equivalent)
-using a .egg-info directory. The pkg_resources module (from setuptools)
-considers a package installed using .egg-info to be a develop egg
-
-We generally prefer develop eggs when we are selecting dependencies, because
-we expect them to be eggs that buildout has been told to develop. However,
-we should not consider these site-packages eggs as develop eggs--they should
-not have automatic precedence over eggs available elsewhere.
-
-We have specific code to handle this case, as identified in bug 623590.
-See zc.buildout.easy_install.Installer._satisfied, as of this writing,
-for the pertinent code. Here's the test for the bugfix.
-
- >>> py_path, site_packages_path = make_py()
- >>> create_sample_sys_install(site_packages_path)
- >>> zc.buildout.easy_install.include_site_packages(False)
- True
-
- >>> example_dest = tmpdir('site-packages-example-install')
- >>> workingset = zc.buildout.easy_install.install(
- ... ['demo'], example_dest, links=[sample_eggs], executable=py_path,
- ... index=None, include_site_packages=True, prefer_final=False)
- >>> [(dist.project_name, dist.version) for dist in workingset]
- [('demo', '0.4c1'), ('demoneeded', '1.2c1')]
-"""
-
-def allowed_eggs_from_site_packages():
- """
-Sometimes you need or want to control what eggs from site-packages are used.
-The allowed-eggs-from-site-packages option allows you to specify a whitelist of
-project names that may be included from site-packages. You can use globs to
-specify the value. It defaults to a single value of '*', indicating that any
-package may come from site-packages.
-
-This option interacts with include-site-packages in the following ways.
-
-If include-site-packages is true, then allowed-eggs-from-site-packages filters
-what eggs from site-packages may be chosen. If allowed-eggs-from-site-packages
-is an empty list, then no eggs from site-packages are chosen, but site-packages
-will still be included at the end of path lists.
-
-If include-site-packages is false, allowed-eggs-from-site-packages is
-irrelevant.
-
-This test shows the interaction with the zc.buildout.easy_install API. Another
-test below (allow_site_package_eggs_option) shows using it with a buildout.cfg.
-
-Our "py_path" has the "demoneeded" and "demo" packages available. We'll
-simply be asking for "demoneeded" here.
-
- >>> py_path, site_packages_path = make_py()
- >>> create_sample_sys_install(site_packages_path)
-
- >>> example_dest = tmpdir('site-packages-example-install')
- >>> workingset = zc.buildout.easy_install.install(
- ... ['demoneeded'], example_dest, links=[], executable=py_path,
- ... index=None,
- ... allowed_eggs_from_site_packages=['demoneeded', 'other'])
- >>> [dist.project_name for dist in workingset]
- ['demoneeded']
-
-That worked fine. It would work fine for a glob too.
-
- >>> zc.buildout.easy_install.clear_index_cache()
- >>> rmdir(example_dest)
- >>> example_dest = tmpdir('site-packages-example-install')
- >>> workingset = zc.buildout.easy_install.install(
- ... ['demoneeded'], example_dest, links=[], executable=py_path,
- ... index=None,
- ... allowed_eggs_from_site_packages=['?emon*', 'other'])
- >>> [dist.project_name for dist in workingset]
- ['demoneeded']
-
-But now let's try again with 'demoneeded' not allowed.
-
- >>> zc.buildout.easy_install.clear_index_cache()
- >>> rmdir(example_dest)
- >>> example_dest = tmpdir('site-packages-example-install')
- >>> workingset = zc.buildout.easy_install.install(
- ... ['demoneeded'], example_dest, links=[], executable=py_path,
- ... index=None,
- ... allowed_eggs_from_site_packages=['demo'])
- Traceback (most recent call last):
- ...
- MissingDistribution: Couldn't find a distribution for 'demoneeded'.
-
-Here's the same, but with an empty list.
-
- >>> zc.buildout.easy_install.clear_index_cache()
- >>> rmdir(example_dest)
- >>> example_dest = tmpdir('site-packages-example-install')
- >>> workingset = zc.buildout.easy_install.install(
- ... ['demoneeded'], example_dest, links=[], executable=py_path,
- ... index=None,
- ... allowed_eggs_from_site_packages=[])
- Traceback (most recent call last):
- ...
- MissingDistribution: Couldn't find a distribution for 'demoneeded'.
-
-Of course, this doesn't stop us from getting a package from elsewhere. Here,
-we add a link server.
-
- >>> zc.buildout.easy_install.clear_index_cache()
- >>> rmdir(example_dest)
- >>> example_dest = tmpdir('site-packages-example-install')
- >>> workingset = zc.buildout.easy_install.install(
- ... ['demoneeded'], example_dest, executable=py_path,
- ... links=[link_server], index=link_server+'index/',
- ... allowed_eggs_from_site_packages=['other'])
- >>> [dist.project_name for dist in workingset]
- ['demoneeded']
- >>> [dist.location for dist in workingset]
- ['/site-packages-example-install/demoneeded-1.1-py2.6.egg']
-
-Finally, here's an example of an interaction: we say that it is OK to
-allow the "demoneeded" egg to come from site-packages, but we don't
-include-site-packages.
-
- >>> zc.buildout.easy_install.clear_index_cache()
- >>> rmdir(example_dest)
- >>> example_dest = tmpdir('site-packages-example-install')
- >>> workingset = zc.buildout.easy_install.install(
- ... ['demoneeded'], example_dest, links=[], executable=py_path,
- ... index=None, include_site_packages=False,
- ... allowed_eggs_from_site_packages=['demoneeded'])
- Traceback (most recent call last):
- ...
- MissingDistribution: Couldn't find a distribution for 'demoneeded'.
-
- """
-
-def allowed_eggs_from_site_packages_dependencies_bugfix():
- """
-If you specify that a package with a dependency may come from site-packages,
-that doesn't mean that the dependency may come from site-packages. This
-is a test for a bug fix to verify that this is true.
-
- >>> py_path, site_packages_path = make_py()
- >>> create_sample_sys_install(site_packages_path)
- >>> interpreter_dir = tmpdir('interpreter')
- >>> interpreter_parts_dir = os.path.join(
- ... interpreter_dir, 'parts', 'interpreter')
- >>> interpreter_bin_dir = os.path.join(interpreter_dir, 'bin')
- >>> mkdir(interpreter_bin_dir)
- >>> mkdir(interpreter_dir, 'eggs')
- >>> mkdir(interpreter_dir, 'parts')
- >>> mkdir(interpreter_parts_dir)
- >>> ws = zc.buildout.easy_install.install(
- ... ['demo'], join(interpreter_dir, 'eggs'), executable=py_path,
- ... links=[link_server], index=link_server+'index/',
- ... allowed_eggs_from_site_packages=['demo'])
- >>> [dist.project_name for dist in ws]
- ['demo', 'demoneeded']
- >>> from pprint import pprint
- >>> pprint([dist.location for dist in ws])
- ['/executable_buildout/site-packages',
- '/interpreter/eggs/demoneeded-1.1-pyN.N.egg']
-
- """
-
-def allowed_eggs_from_site_packages_bug_592524():
- """
-When we use allowed_eggs_from_site_packages, we need to make sure that the
-site-packages paths are not inserted with the normal egg paths. They already
-included at the end, and including them along with the normal egg paths will
-possibly mask subsequent egg paths. This affects interpreters and scripts
-generated by sitepackage_safe_scripts.
-
-Our "py_path" has the "demoneeded" and "demo" packages available.
-
- >>> py_path, site_packages_path = make_py()
- >>> create_sample_sys_install(site_packages_path)
- >>> interpreter_dir = tmpdir('interpreter')
- >>> interpreter_parts_dir = os.path.join(
- ... interpreter_dir, 'parts', 'interpreter')
- >>> interpreter_bin_dir = os.path.join(interpreter_dir, 'bin')
- >>> mkdir(interpreter_bin_dir)
- >>> mkdir(interpreter_dir, 'eggs')
- >>> mkdir(interpreter_dir, 'parts')
- >>> mkdir(interpreter_parts_dir)
- >>> ws = zc.buildout.easy_install.install(
- ... ['demo', 'other'], join(interpreter_dir, 'eggs'), executable=py_path,
- ... links=[link_server], index=link_server+'index/',
- ... allowed_eggs_from_site_packages=['demo'])
- >>> generated = zc.buildout.easy_install.sitepackage_safe_scripts(
- ... interpreter_bin_dir, ws, py_path, interpreter_parts_dir,
- ... interpreter='py', include_site_packages=True)
-
-Now we will look at the paths in the site.py we generated. Notice that the
-site-packages are at the end. They were not before this bugfix.
-
- >>> test = 'import pprint, sys; pprint.pprint(sys.path[-4:])'
- >>> print call_py(join(interpreter_bin_dir, 'py'), test)
- ['/interpreter/eggs/other-1.0-pyN.N.egg',
- '/interpreter/eggs/demoneeded-1.1-pyN.N.egg',
- '/executable_buildout/eggs/setuptools-0.0-pyN.N.egg',
- '/executable_buildout/site-packages']
- <BLANKLINE>
- """
-
-def subprocesses_have_same_environment_by_default():
- """
-The scripts generated by sitepackage_safe_scripts set the PYTHONPATH so that,
-if the environment is maintained (the default behavior), subprocesses get
-the same Python packages.
-
-First, we set up a script and an interpreter.
-
- >>> interpreter_dir = tmpdir('interpreter')
- >>> interpreter_parts_dir = os.path.join(
- ... interpreter_dir, 'parts', 'interpreter')
- >>> interpreter_bin_dir = os.path.join(interpreter_dir, 'bin')
- >>> mkdir(interpreter_bin_dir)
- >>> mkdir(interpreter_dir, 'eggs')
- >>> mkdir(interpreter_dir, 'parts')
- >>> mkdir(interpreter_parts_dir)
- >>> ws = zc.buildout.easy_install.install(
- ... ['demo'], join(interpreter_dir, 'eggs'), links=[link_server],
- ... index=link_server+'index/')
- >>> test = (
- ... "import subprocess, sys; subprocess.call("
- ... "[sys.executable, '-c', "
- ... "'import eggrecipedemo; print eggrecipedemo.x'])")
- >>> generated = zc.buildout.easy_install.sitepackage_safe_scripts(
- ... interpreter_bin_dir, ws, sys.executable, interpreter_parts_dir,
- ... reqs=['demo'], interpreter='py',
- ... script_initialization=test + '; sys.exit(0)')
-
-This works for the script.
-
- >>> print system(join(interpreter_bin_dir, 'demo'))
- 3
- <BLANKLINE>
-
-This also works for the generated interpreter.
-
- >>> print call_py(join(interpreter_bin_dir, 'py'), test)
- 3
- <BLANKLINE>
-
-If you have a PYTHONPATH in your environment, it will be honored, after
-the buildout-generated path.
-
- >>> original_pythonpath = os.environ.get('PYTHONPATH')
- >>> os.environ['PYTHONPATH'] = 'foo'
- >>> test = (
- ... "import subprocess, sys; subprocess.call("
- ... "[sys.executable, '-c', "
- ... "'import sys, pprint; pprint.pprint(sys.path)'])")
- >>> generated = zc.buildout.easy_install.sitepackage_safe_scripts(
- ... interpreter_bin_dir, ws, sys.executable, interpreter_parts_dir,
- ... reqs=['demo'], interpreter='py',
- ... script_initialization=test + '; sys.exit(0)')
-
-This works for the script. As you can see, /sample_buildout/foo is included
-right after the "parts" directory that contains site.py and sitecustomize.py.
-You can also see, actually more easily than in the other example, that we
-have the desired eggs available.
-
- >>> print system(join(interpreter_bin_dir, 'demo')), # doctest: +ELLIPSIS
- ['',
- '/interpreter/parts/interpreter',
- '/sample-buildout/foo',
- ...
- '/interpreter/eggs/demo-0.3-pyN.N.egg',
- '/interpreter/eggs/demoneeded-1.1-pyN.N.egg']
-
-This also works for the generated interpreter, with identical results.
-
- >>> print call_py(join(interpreter_bin_dir, 'py'), test),
- ... # doctest: +ELLIPSIS
- ['',
- '/interpreter/parts/interpreter',
- '/sample-buildout/foo',
- ...
- '/interpreter/eggs/demo-0.3-pyN.N.egg',
- '/interpreter/eggs/demoneeded-1.1-pyN.N.egg']
-
- >>> # Cleanup
- >>> if original_pythonpath:
- ... os.environ['PYTHONPATH'] = original_pythonpath
- ... else:
- ... del os.environ['PYTHONPATH']
- ...
-
- """
-
-def bootstrap_makes_buildout_that_works_with_system_python():
- r"""
-In order to work smoothly with a system Python, bootstrapping creates
-the buildout script with
-zc.buildout.easy_install.sitepackage_safe_scripts. If it did not, a
-variety of problems might happen. For instance, if another version of
-buildout or setuptools is installed in the site-packages than is
-desired, it may cause a problem.
-
-A problem actually experienced in the field is when
-a recipe wants a different version of a dependency that is installed in
-site-packages. We will create a similar situation, and show that it is now
-handled.
-
-First let's write a dummy recipe.
-
- >>> mkdir(sample_buildout, 'recipes')
- >>> write(sample_buildout, 'recipes', 'dummy.py',
- ... '''
- ... import logging, os, zc.buildout
- ... class Dummy:
- ... def __init__(self, buildout, name, options):
- ... pass
- ... def install(self):
- ... return ()
- ... def update(self):
- ... pass
- ... ''')
- >>> write(sample_buildout, 'recipes', 'setup.py',
- ... '''
- ... from setuptools import setup
- ...
- ... setup(
- ... name = "recipes",
- ... entry_points = {'zc.buildout': ['dummy = dummy:Dummy']},
- ... install_requires = 'demoneeded==1.2c1',
- ... )
- ... ''')
- >>> write(sample_buildout, 'recipes', 'README.txt', " ")
-
-Now we'll try to use it with a Python that has a different version of
-demoneeded installed.
-
- >>> py_path, site_packages_path = make_py()
- >>> create_sample_sys_install(site_packages_path)
- >>> rmdir('develop-eggs')
- >>> from zc.buildout.testing import make_buildout
- >>> make_buildout(executable=py_path)
- >>> write(sample_buildout, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = recipes
- ... parts = dummy
- ... find-links = %(link_server)s
- ... executable = %(py_path)s
- ...
- ... [dummy]
- ... recipe = recipes:dummy
- ... ''' % globals())
-
-Now we actually run the buildout. Before the change, we got the following
-error:
-
- Develop: '/sample-buildout/recipes'
- While:
- Installing.
- Getting section dummy.
- Initializing section dummy.
- Installing recipe recipes.
- Error: There is a version conflict.
- We already have: demoneeded 1.1
- but recipes 0.0.0 requires 'demoneeded==1.2c1'.
-
-Now, it is handled smoothly.
-
- >>> print system(buildout)
- Develop: '/sample-buildout/recipes'
- Getting distribution for 'demoneeded==1.2c1'.
- Got demoneeded 1.2c1.
- Installing dummy.
- <BLANKLINE>
-
-Here's the same story with a namespace package, which has some additional
-complications behind the scenes. First, a recipe, in the "tellmy" namespace.
-
- >>> mkdir(sample_buildout, 'ns')
- >>> mkdir(sample_buildout, 'ns', 'tellmy')
- >>> write(sample_buildout, 'ns', 'tellmy', '__init__.py',
- ... "__import__('pkg_resources').declare_namespace(__name__)\n")
- >>> mkdir(sample_buildout, 'ns', 'tellmy', 'recipes')
- >>> write(sample_buildout, 'ns', 'tellmy', 'recipes', '__init__.py', ' ')
- >>> write(sample_buildout, 'ns', 'tellmy', 'recipes', 'dummy.py',
- ... '''
- ... import logging, os, zc.buildout
- ... class Dummy:
- ... def __init__(self, buildout, name, options):
- ... pass
- ... def install(self):
- ... return ()
- ... def update(self):
- ... pass
- ... ''')
- >>> write(sample_buildout, 'ns', 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(
- ... name="tellmy.recipes",
- ... packages=['tellmy', 'tellmy.recipes'],
- ... install_requires=['setuptools'],
- ... namespace_packages=['tellmy'],
- ... entry_points = {'zc.buildout':
- ... ['dummy = tellmy.recipes.dummy:Dummy']},
- ... )
- ... ''')
-
-Now, a buildout that uses it.
-
- >>> create_sample_namespace_eggs(sample_eggs, site_packages_path)
- >>> rmdir('develop-eggs')
- >>> from zc.buildout.testing import make_buildout
- >>> make_buildout(executable=py_path)
- >>> write(sample_buildout, 'buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = ns
- ... recipes
- ... parts = dummy
- ... find-links = %(link_server)s
- ... executable = %(py_path)s
- ...
- ... [dummy]
- ... recipe = tellmy.recipes:dummy
- ... ''' % globals())
-
-Now we actually run the buildout.
-
- >>> print system(buildout)
- Develop: '/sample-buildout/ns'
- Develop: '/sample-buildout/recipes'
- Uninstalling dummy.
- Installing dummy.
- <BLANKLINE>
-
- """
-
-if sys.version_info > (2, 4):
- def test_exit_codes():
- """
- >>> import subprocess
- >>> def call(s):
- ... p = subprocess.Popen(s, stdin=subprocess.PIPE,
- ... stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- ... p.stdin.close()
- ... print p.stdout.read()
- ... print 'Exit:', bool(p.wait())
-
- >>> call(buildout)
- <BLANKLINE>
- Exit: False
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = x
- ... ''')
-
- >>> call(buildout) # doctest: +NORMALIZE_WHITESPACE
- While:
- Installing.
- Getting section x.
- Error: The referenced section, 'x', was not defined.
- <BLANKLINE>
- Exit: True
-
- >>> write('setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='zc.buildout.testexit', entry_points={
- ... 'zc.buildout': ['default = testexitrecipe:x']})
- ... ''')
-
- >>> write('testexitrecipe.py',
- ... '''
- ... x y
- ... ''')
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = x
- ... develop = .
- ...
- ... [x]
- ... recipe = zc.buildout.testexit
- ... ''')
-
- >>> call(buildout) # doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
- Develop: '/sample-buildout/.'
- While:
- Installing.
- Getting section x.
- Initializing section x.
- Loading zc.buildout recipe entry zc.buildout.testexit:default.
- <BLANKLINE>
- An internal error occurred due to a bug in either zc.buildout or in a
- recipe being used:
- Traceback (most recent call last):
- ...
- x y
- ^
- SyntaxError: invalid syntax
- <BLANKLINE>
- Exit: True
- """
-
-def bug_59270_recipes_always_start_in_buildout_dir():
- """
- Recipes can rely on running from buildout directory
-
- >>> mkdir('bad_start')
- >>> write('bad_recipe.py',
- ... '''
- ... import os
- ... class Bad:
- ... def __init__(self, *_):
- ... print os.getcwd()
- ... def install(self):
- ... print os.getcwd()
- ... os.chdir('bad_start')
- ... print os.getcwd()
- ... return ()
- ... ''')
-
- >>> write('setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='bad.test',
- ... entry_points={'zc.buildout': ['default=bad_recipe:Bad']},)
- ... ''')
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = .
- ... parts = b1 b2
- ... [b1]
- ... recipe = bad.test
- ... [b2]
- ... recipe = bad.test
- ... ''')
-
- >>> os.chdir('bad_start')
- >>> print system(join(sample_buildout, 'bin', 'buildout')
- ... +' -c '+join(sample_buildout, 'buildout.cfg')),
- Develop: '/sample-buildout/.'
- /sample-buildout
- /sample-buildout
- Installing b1.
- /sample-buildout
- /sample-buildout/bad_start
- Installing b2.
- /sample-buildout
- /sample-buildout/bad_start
-
- """
-
-def bug_61890_file_urls_dont_seem_to_work_in_find_dash_links():
- """
-
- This bug arises from the fact that setuptools is overly restrictive
- about file urls, requiring that file urls pointing at directories
- must end in a slash.
-
- >>> dest = tmpdir('sample-install')
- >>> import zc.buildout.easy_install
- >>> sample_eggs = sample_eggs.replace(os.path.sep, '/')
- >>> ws = zc.buildout.easy_install.install(
- ... ['demo==0.2'], dest,
- ... links=['file://'+sample_eggs], index=link_server+'index/')
-
-
- >>> for dist in ws:
- ... print dist
- demo 0.2
- demoneeded 1.1
-
- >>> ls(dest)
- - demo-0.2-py2.4.egg
- - demoneeded-1.1-py2.4.egg
-
- """
-
-def bug_75607_buildout_should_not_run_if_it_creates_an_empty_buildout_cfg():
- """
- >>> remove('buildout.cfg')
- >>> print system(buildout),
- While:
- Initializing.
- Error: Couldn't open /sample-buildout/buildout.cfg
-
-
-
- """
-
-def dealing_with_extremely_insane_dependencies():
- r"""
-
- There was a problem with analysis of dependencies taking a long
- time, in part because the analysis would get repeated every time a
- package was encountered in a dependency list. Now, we don't do
- the analysis any more:
-
- >>> import os
- >>> for i in range(5):
- ... p = 'pack%s' % i
- ... deps = [('pack%s' % j) for j in range(5) if j is not i]
- ... if i == 4:
- ... deps.append('pack5')
- ... mkdir(p)
- ... write(p, 'setup.py',
- ... 'from setuptools import setup\n'
- ... 'setup(name=%r, install_requires=%r,\n'
- ... ' url="u", author="a", author_email="e")\n'
- ... % (p, deps))
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = pack0 pack1 pack2 pack3 pack4
- ... parts = pack1
- ...
- ... [pack1]
- ... recipe = zc.recipe.egg:eggs
- ... eggs = pack0
- ... ''')
-
- >>> print system(buildout),
- Develop: '/sample-buildout/pack0'
- Develop: '/sample-buildout/pack1'
- Develop: '/sample-buildout/pack2'
- Develop: '/sample-buildout/pack3'
- Develop: '/sample-buildout/pack4'
- Installing pack1.
- Couldn't find index page for 'pack5' (maybe misspelled?)
- Getting distribution for 'pack5'.
- While:
- Installing pack1.
- Getting distribution for 'pack5'.
- Error: Couldn't find a distribution for 'pack5'.
-
- However, if we run in verbose mode, we can see why packages were included:
-
- >>> print system(buildout+' -v'), # doctest: +ELLIPSIS
- Installing 'zc.buildout', 'setuptools'.
- We have a develop egg: zc.buildout 1.0.0
- We have the best distribution that satisfies 'setuptools'.
- Picked: setuptools = 0.6
- Develop: '/sample-buildout/pack0'
- Develop: '/sample-buildout/pack1'
- Develop: '/sample-buildout/pack2'
- Develop: '/sample-buildout/pack3'
- Develop: '/sample-buildout/pack4'
- ...Installing pack1.
- Installing 'pack0'.
- We have a develop egg: pack0 0.0.0
- Getting required 'pack4'
- required by pack0 0.0.0.
- We have a develop egg: pack4 0.0.0
- Getting required 'pack3'
- required by pack0 0.0.0.
- required by pack4 0.0.0.
- We have a develop egg: pack3 0.0.0
- Getting required 'pack2'
- required by pack0 0.0.0.
- required by pack3 0.0.0.
- required by pack4 0.0.0.
- We have a develop egg: pack2 0.0.0
- Getting required 'pack1'
- required by pack0 0.0.0.
- required by pack2 0.0.0.
- required by pack3 0.0.0.
- required by pack4 0.0.0.
- We have a develop egg: pack1 0.0.0
- Getting required 'pack5'
- required by pack4 0.0.0.
- We have no distributions for pack5 that satisfies 'pack5'.
- Couldn't find index page for 'pack5' (maybe misspelled?)
- Getting distribution for 'pack5'.
- While:
- Installing pack1.
- Getting distribution for 'pack5'.
- Error: Couldn't find a distribution for 'pack5'.
- """
-
-def read_find_links_to_load_extensions():
- """
-We'll create a wacky buildout extension that is just another name for http:
-
- >>> src = tmpdir('src')
- >>> write(src, 'wacky_handler.py',
- ... '''
- ... import urllib2
- ... class Wacky(urllib2.HTTPHandler):
- ... wacky_open = urllib2.HTTPHandler.http_open
- ... def install(buildout=None):
- ... urllib2.install_opener(urllib2.build_opener(Wacky))
- ... ''')
- >>> write(src, 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='wackyextension', version='1',
- ... py_modules=['wacky_handler'],
- ... entry_points = {'zc.buildout.extension':
- ... ['default = wacky_handler:install']
- ... },
- ... )
- ... ''')
- >>> print system(buildout+' setup '+src+' bdist_egg'),
- ... # doctest: +ELLIPSIS
- Running setup ...
- creating 'dist/wackyextension-1-...
-
-Now we'll create a buildout that uses this extension to load other packages:
-
- >>> wacky_server = link_server.replace('http', 'wacky')
- >>> dist = 'file://' + join(src, 'dist').replace(os.path.sep, '/')
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = demo
- ... extensions = wackyextension
- ... find-links = %(wacky_server)s/demoneeded-1.0.zip
- ... %(dist)s
- ... [demo]
- ... recipe = zc.recipe.egg
- ... eggs = demoneeded
- ... ''' % globals())
-
-When we run the buildout. it will load the extension from the dist
-directory and then use the wacky extension to load the demo package
-
- >>> print system(buildout),
- Getting distribution for 'wackyextension'.
- Got wackyextension 1.
- Installing demo.
- Getting distribution for 'demoneeded'.
- Got demoneeded 1.0.
-
- """
-
-def distributions_from_local_find_links_make_it_to_download_cache():
- """
-
-If we specify a local directory in find links, distors found there
-need to make it to the download cache.
-
- >>> mkdir('test')
- >>> write('test', 'setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='foo')
- ... ''')
-
- >>> print system(buildout+' setup test bdist_egg'), # doctest: +ELLIPSIS
- Running setup script 'test/setup.py'.
- ...
-
-
- >>> mkdir('cache')
- >>> old_cache = zc.buildout.easy_install.download_cache('cache')
- >>> list(zc.buildout.easy_install.install(['foo'], 'eggs',
- ... links=[join('test', 'dist')])) # doctest: +ELLIPSIS
- [foo 0.0.0 ...
-
- >>> ls('cache')
- - foo-0.0.0-py2.4.egg
-
- >>> _ = zc.buildout.easy_install.download_cache(old_cache)
-
- """
-
-def create_egg(name, version, dest, install_requires=None,
- dependency_links=None):
- d = tempfile.mkdtemp()
- if dest=='available':
- extras = dict(x=['x'])
- else:
- extras = {}
- if dependency_links:
- links = 'dependency_links = %s, ' % dependency_links
- else:
- links = ''
- if install_requires:
- requires = 'install_requires = %s, ' % install_requires
- else:
- requires = ''
- try:
- open(os.path.join(d, 'setup.py'), 'w').write(
- 'from setuptools import setup\n'
- 'setup(name=%r, version=%r, extras_require=%r, zip_safe=True,\n'
- ' %s %s py_modules=["setup"]\n)'
- % (name, str(version), extras, requires, links)
- )
- zc.buildout.testing.bdist_egg(d, sys.executable, os.path.abspath(dest))
- finally:
- shutil.rmtree(d)
-
-def prefer_final_permutation(existing, available):
- for d in ('existing', 'available'):
- if os.path.exists(d):
- shutil.rmtree(d)
- os.mkdir(d)
- for version in existing:
- create_egg('spam', version, 'existing')
- for version in available:
- create_egg('spam', version, 'available')
-
- zc.buildout.easy_install.clear_index_cache()
- [dist] = list(
- zc.buildout.easy_install.install(['spam'], 'existing', ['available'],
- always_unzip=True)
- )
-
- if dist.extras:
- print 'downloaded', dist.version
- else:
- print 'had', dist.version
- sys.path_importer_cache.clear()
-
-def prefer_final():
- """
-This test tests several permutations:
-
-Using different version numbers to work around zip importer cache problems. :(
-
-- With prefer final:
-
- - no existing and newer dev available
- >>> prefer_final_permutation((), [1, '2a1'])
- downloaded 1
-
- - no existing and only dev available
- >>> prefer_final_permutation((), ['3a1'])
- downloaded 3a1
-
- - final existing and only dev acailable
- >>> prefer_final_permutation([4], ['5a1'])
- had 4
-
- - final existing and newer final available
- >>> prefer_final_permutation([6], [7])
- downloaded 7
-
- - final existing and same final available
- >>> prefer_final_permutation([8], [8])
- had 8
-
- - final existing and older final available
- >>> prefer_final_permutation([10], [9])
- had 10
-
- - only dev existing and final available
- >>> prefer_final_permutation(['12a1'], [11])
- downloaded 11
-
- - only dev existing and no final available newer dev available
- >>> prefer_final_permutation(['13a1'], ['13a2'])
- downloaded 13a2
-
- - only dev existing and no final available older dev available
- >>> prefer_final_permutation(['15a1'], ['14a1'])
- had 15a1
-
- - only dev existing and no final available same dev available
- >>> prefer_final_permutation(['16a1'], ['16a1'])
- had 16a1
-
-- Without prefer final:
-
- >>> _ = zc.buildout.easy_install.prefer_final(False)
-
- - no existing and newer dev available
- >>> prefer_final_permutation((), [18, '19a1'])
- downloaded 19a1
-
- - no existing and only dev available
- >>> prefer_final_permutation((), ['20a1'])
- downloaded 20a1
-
- - final existing and only dev acailable
- >>> prefer_final_permutation([21], ['22a1'])
- downloaded 22a1
-
- - final existing and newer final available
- >>> prefer_final_permutation([23], [24])
- downloaded 24
-
- - final existing and same final available
- >>> prefer_final_permutation([25], [25])
- had 25
-
- - final existing and older final available
- >>> prefer_final_permutation([27], [26])
- had 27
-
- - only dev existing and final available
- >>> prefer_final_permutation(['29a1'], [28])
- had 29a1
-
- - only dev existing and no final available newer dev available
- >>> prefer_final_permutation(['30a1'], ['30a2'])
- downloaded 30a2
-
- - only dev existing and no final available older dev available
- >>> prefer_final_permutation(['32a1'], ['31a1'])
- had 32a1
-
- - only dev existing and no final available same dev available
- >>> prefer_final_permutation(['33a1'], ['33a1'])
- had 33a1
-
- >>> _ = zc.buildout.easy_install.prefer_final(True)
-
- """
-
-def buildout_prefer_final_option():
- """
-The prefer-final buildout option can be used for override the default
-preference for newer distributions.
-
-The default is prefer-final = false:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... find-links = %(link_server)s
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg:eggs
- ... eggs = demo
- ... ''' % globals())
-
- >>> print system(buildout+' -v'), # doctest: +ELLIPSIS
- Installing 'zc.buildout', 'setuptools'.
- ...
- Picked: demo = 0.4c1
- ...
- Picked: demoneeded = 1.2c1
-
-Here we see that the final versions of demo and demoneeded are used.
-We get the same behavior if we add prefer-final = false
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... find-links = %(link_server)s
- ... prefer-final = false
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg:eggs
- ... eggs = demo
- ... ''' % globals())
-
- >>> print system(buildout+' -v'), # doctest: +ELLIPSIS
- Installing 'zc.buildout', 'setuptools'.
- ...
- Picked: demo = 0.4c1
- ...
- Picked: demoneeded = 1.2c1
-
-If we specify prefer-final = true, we'll get the newest
-distributions:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... find-links = %(link_server)s
- ... prefer-final = true
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg:eggs
- ... eggs = demo
- ... ''' % globals())
-
- >>> print system(buildout+' -v'), # doctest: +ELLIPSIS
- Installing 'zc.buildout', 'setuptools'.
- ...
- Picked: demo = 0.3
- ...
- Picked: demoneeded = 1.1
-
-We get an error if we specify anything but true or false:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... find-links = %(link_server)s
- ... prefer-final = no
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg:eggs
- ... eggs = demo
- ... ''' % globals())
-
- >>> print system(buildout+' -v'), # doctest: +ELLIPSIS
- While:
- Initializing.
- Error: Invalid value for prefer-final option: no
-
- """
-
-def buildout_prefer_final_build_system_option():
- """
-The accept-buildout-test-releases buildout option can be used for overriding
-the default preference for final distributions for recipes, buildout
-extensions, and buildout itself. It is usually controlled via the bootstrap
-script rather than in the configuration file, but we will test the machinery
-using the file.
-
-Set up. This creates sdists for demorecipe 1.0 and 1.1b1, and for
-demoextension 1.0 and 1.1b1.
-
- >>> create_sample_recipe_sdists(sample_eggs)
- >>> create_sample_extension_sdists(sample_eggs)
-
-The default is accept-buildout-test-releases = false:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = demo
- ... find-links = %(link_server)s
- ... extensions = demoextension
- ...
- ... [demo]
- ... recipe = demorecipe
- ... ''' % globals())
-
- >>> print system(buildout+' -v'), # doctest: +ELLIPSIS
- Installing ...
- Picked: demoextension = 1.0
- ...
- Picked: demorecipe = 1.0
- ...
-
-Here we see that the final versions of demorecipe and demoextension were used.
-
-We get the same behavior if we explicitly state that
-accept-buildout-test-releases = false.
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = demo
- ... find-links = %(link_server)s
- ... extensions = demoextension
- ... accept-buildout-test-releases = false
- ...
- ... [demo]
- ... recipe = demorecipe
- ... ''' % globals())
-
- >>> print system(buildout+' -v'), # doctest: +ELLIPSIS
- Installing ...
- Picked: demoextension = 1.0
- ...
- Picked: demorecipe = 1.0
- ...
-
-If we specify accept-buildout-test-releases = true, we'll get the newest
-distributions in the build system:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = demo
- ... find-links = %(link_server)s
- ... extensions = demoextension
- ... accept-buildout-test-releases = true
- ...
- ... [demo]
- ... recipe = demorecipe
- ... ''' % globals())
-
- >>> print system(buildout+' -v'), # doctest: +ELLIPSIS
- Installing ...
- Picked: demoextension = 1.1b1
- ...
- Picked: demorecipe = 1.1b1
- ...
-
-We get an error if we specify anything but true or false:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = demo
- ... find-links = %(link_server)s
- ... extensions = demoextension
- ... accept-buildout-test-releases = no
- ...
- ... [demo]
- ... recipe = demorecipe
- ... ''' % globals())
-
- >>> print system(buildout+' -v'), # doctest: +ELLIPSIS
- While:
- Initializing.
- Error: Invalid value for accept-buildout-test-releases option: no
-
- """
-
-def develop_with_modules():
- """
-Distribution setup scripts can import modules in the distribution directory:
-
- >>> mkdir('foo')
- >>> write('foo', 'bar.py',
- ... '''# empty
- ... ''')
-
- >>> write('foo', 'setup.py',
- ... '''
- ... import bar
- ... from setuptools import setup
- ... setup(name="foo")
- ... ''')
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... develop = foo
- ... parts =
- ... ''')
-
- >>> print system(join('bin', 'buildout')),
- Develop: '/sample-buildout/foo'
-
- >>> ls('develop-eggs')
- - foo.egg-link
- - z3c.recipe.scripts.egg-link
- - zc.recipe.egg.egg-link
-
- """
-
-def dont_pick_setuptools_if_version_is_specified_when_required_by_src_dist():
- """
-When installing a source distribution, we got setuptools without
-honoring our version specification.
-
- >>> mkdir('dist')
- >>> write('setup.py',
- ... '''
- ... from setuptools import setup
- ... setup(name='foo', version='1', py_modules=['foo'], zip_safe=True)
- ... ''')
- >>> write('foo.py', '')
- >>> _ = system(buildout+' setup . sdist')
-
- >>> if zc.buildout.easy_install.is_distribute:
- ... distribute_version = 'distribute = %s' % (
- ... pkg_resources.working_set.find(
- ... pkg_resources.Requirement.parse('distribute')).version,)
- ... else:
- ... distribute_version = ''
- ...
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = foo
- ... find-links = dist
- ... versions = versions
- ... allow-picked-versions = false
- ...
- ... [versions]
- ... setuptools = %s
- ... foo = 1
- ... %s
- ...
- ... [foo]
- ... recipe = zc.recipe.egg
- ... eggs = foo
- ... ''' % (pkg_resources.working_set.find(
- ... pkg_resources.Requirement.parse('setuptools')).version,
- ... distribute_version))
-
- >>> print system(buildout),
- Installing foo.
- Getting distribution for 'foo==1'.
- Got foo 1.
-
- """
-
-def pyc_and_pyo_files_have_correct_paths():
- r"""
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... find-links = %(link_server)s
- ... unzip = true
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg
- ... eggs = demo
- ... interpreter = py
- ... ''' % globals())
-
- >>> _ = system(buildout)
-
- >>> write('t.py',
- ... '''
- ... import eggrecipedemo, eggrecipedemoneeded
- ... print eggrecipedemo.main.func_code.co_filename
- ... print eggrecipedemoneeded.f.func_code.co_filename
- ... ''')
-
- >>> print system(join('bin', 'py')+ ' t.py'),
- /sample-buildout/eggs/demo-0.4c1-py2.4.egg/eggrecipedemo.py
- /sample-buildout/eggs/demoneeded-1.2c1-py2.4.egg/eggrecipedemoneeded.py
-
- >>> import os
- >>> for name in os.listdir('eggs'):
- ... if name.startswith('demoneeded'):
- ... ls('eggs', name)
- d EGG-INFO
- - eggrecipedemoneeded.py
- - eggrecipedemoneeded.pyc
- - eggrecipedemoneeded.pyo
-
- """
-
-def dont_mess_with_standard_dirs_with_variable_refs():
- """
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... eggs-directory = ${buildout:directory}/develop-eggs
- ... parts =
- ... ''' % globals())
- >>> print system(buildout),
-
- """
-
-def expand_shell_patterns_in_develop_paths():
- """
- Sometimes we want to include a number of eggs in some directory as
- develop eggs, without explicitly listing all of them in our
- buildout.cfg
-
- >>> make_dist_that_requires(sample_buildout, 'sampley')
- >>> make_dist_that_requires(sample_buildout, 'samplez')
-
- Now, let's create a buildout that has a shell pattern that matches
- both:
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... develop = sample*
- ... find-links = %(link_server)s
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg
- ... eggs = sampley
- ... samplez
- ... ''' % globals())
-
- We can see that both eggs were found:
-
- >>> print system(buildout),
- Develop: '/sample-buildout/sampley'
- Develop: '/sample-buildout/samplez'
- Installing eggs.
-
- """
-
-def warn_users_when_expanding_shell_patterns_yields_no_results():
- """
- Sometimes shell patterns do not match anything, so we want to warn
- our users about it...
-
- >>> make_dist_that_requires(sample_buildout, 'samplea')
-
- So if we have 2 patterns, one that has a matching directory, and
- another one that does not
-
- >>> write('buildout.cfg',
- ... '''
- ... [buildout]
- ... parts = eggs
- ... develop = samplea grumble*
- ... find-links = %(link_server)s
- ...
- ... [eggs]
- ... recipe = zc.recipe.egg
- ... eggs = samplea
- ... ''' % globals())
-
- We should get one of the eggs, and a warning for the pattern that
- did not match anything.
-
- >>> print system(buildout),
- Develop: '/sample-buildout/samplea'
- Couldn't develop '/sample-buildout/grumble*' (not found)
- Installing eggs.
-
- """
-
-def make_sure_versions_dont_cancel_extras():
- """
- There was a bug that caused extras in requirements to be lost.
-
- >>> open('setup.py', 'w').write('''
- ... from setuptools import setup
- ... setup(name='extraversiondemo', version='1.0',
- ... url='x', author='x', author_email='x',
- ... extras_require=dict(foo=['demo']), py_modules=['t'])
- ... ''')
- >>> open('README', 'w').close()
- >>> open('t.py', 'w').close()
-
- >>> sdist('.', sample_eggs)
- >>> mkdir('dest')
- >>> ws = zc.buildout.easy_install.install(
- ... ['extraversiondemo[foo]'], 'dest', links=[sample_eggs],
- ... versions = dict(extraversiondemo='1.0')
- ... )
- >>> sorted(dist.key for dist in ws)
- ['demo', 'demoneeded', 'extraversiondemo']
- """
-
-def increment_buildout_options():
- r"""
- >>> write('b1.cfg', '''
- ... [buildout]
- ... parts = p1
- ... x = 1
- ... y = a
- ... b
- ...
- ... [p1]
- ... recipe = zc.buildout:debug
- ... foo = ${buildout:x} ${buildout:y}
- ... ''')
-
- >>> write('buildout.cfg', '''
- ... [buildout]
- ... extends = b1.cfg
- ... parts += p2
- ... x += 2
- ... y -= a
- ...
- ... [p2]
- ... <= p1
- ... ''')
-
- >>> print system(buildout),
- Installing p1.
- foo='1\n2 b'
- recipe='zc.buildout:debug'
- Installing p2.
- foo='1\n2 b'
- recipe='zc.buildout:debug'
- """
-
-def increment_buildout_with_multiple_extended_files_421022():
- r"""
- >>> write('foo.cfg', '''
- ... [buildout]
- ... foo-option = foo
- ... [other]
- ... foo-option = foo
- ... ''')
- >>> write('bar.cfg', '''
- ... [buildout]
- ... bar-option = bar
- ... [other]
- ... bar-option = bar
- ... ''')
- >>> write('buildout.cfg', '''
- ... [buildout]
- ... parts = p other
- ... extends = bar.cfg foo.cfg
- ... bar-option += baz
- ... foo-option += ham
- ...
- ... [other]
- ... recipe = zc.buildout:debug
- ... bar-option += baz
- ... foo-option += ham
- ...
- ... [p]
- ... recipe = zc.buildout:debug
- ... x = ${buildout:bar-option} ${buildout:foo-option}
- ... ''')
-
- >>> print system(buildout),
- Installing p.
- recipe='zc.buildout:debug'
- x='bar\nbaz foo\nham'
- Installing other.
- bar-option='bar\nbaz'
- foo-option='foo\nham'
- recipe='zc.buildout:debug'
- """
-
-def increment_on_command_line():
- r"""
- >>> write('buildout.cfg', '''
- ... [buildout]
- ... parts = p1
- ... x = 1
- ... y = a
- ... b
- ...
- ... [p1]
- ... recipe = zc.buildout:debug
- ... foo = ${buildout:x} ${buildout:y}
- ...
- ... [p2]
- ... <= p1
- ... ''')
-
- >>> print system(buildout+' buildout:parts+=p2 p1:foo+=bar'),
- Installing p1.
- foo='1 a\nb\nbar'
- recipe='zc.buildout:debug'
- Installing p2.
- foo='1 a\nb\nbar'
- recipe='zc.buildout:debug'
- """
-
-######################################################################
-
-def make_py_with_system_install(make_py, sample_eggs):
- py_path, site_packages_path = make_py()
- create_sample_namespace_eggs(sample_eggs, site_packages_path)
- return py_path
-
-def create_sample_namespace_eggs(dest, site_packages_path=None):
- from zc.buildout.testing import write, mkdir
- for pkg, version in (('version', '1.0'), ('version', '1.1'),
- ('fortune', '1.0')):
- tmp = tempfile.mkdtemp()
- try:
- write(tmp, 'README.txt', '')
- mkdir(tmp, 'src')
- mkdir(tmp, 'src', 'tellmy')
- write(tmp, 'src', 'tellmy', '__init__.py',
- "__import__("
- "'pkg_resources').declare_namespace(__name__)\n")
- mkdir(tmp, 'src', 'tellmy', pkg)
- write(tmp, 'src', 'tellmy', pkg,
- '__init__.py', '__version__=%r\n' % version)
- write(
- tmp, 'setup.py',
- "from setuptools import setup\n"
- "setup(\n"
- " name='tellmy.%(pkg)s',\n"
- " package_dir = {'': 'src'},\n"
- " packages = ['tellmy', 'tellmy.%(pkg)s'],\n"
- " install_requires = ['setuptools'],\n"
- " namespace_packages=['tellmy'],\n"
- " zip_safe=True, version=%(version)r,\n"
- " author='bob', url='bob', author_email='bob')\n"
- % locals()
- )
- zc.buildout.testing.sdist(tmp, dest)
- if (site_packages_path and pkg == 'version' and version == '1.1'):
- # We install the 1.1 version in site packages the way a
- # system packaging system (debs, rpms) would do it.
- zc.buildout.testing.sys_install(tmp, site_packages_path)
- finally:
- shutil.rmtree(tmp)
-
-def create_sample_extension_sdists(dest):
- from zc.buildout.testing import write, mkdir
- name = 'demoextension'
- for version in ('1.0', '1.1b1'):
- tmp = tempfile.mkdtemp()
- try:
- write(tmp, 'README.txt', '')
- write(tmp, name + '.py',
- "def ext(buildout):\n"
- " pass\n"
- "def unload(buildout):\n"
- " pass\n"
- % locals())
- write(tmp, 'setup.py',
- "from setuptools import setup\n"
- "setup(\n"
- " name = %(name)r,\n"
- " py_modules = [%(name)r],\n"
- " entry_points = {\n"
- " 'zc.buildout.extension': "
- "['ext = %(name)s:ext'],\n"
- " 'zc.buildout.unloadextension': "
- "['ext = %(name)s:unload'],\n"
- " },\n"
- " zip_safe=True, version=%(version)r,\n"
- " author='bob', url='bob', author_email='bob')\n"
- % locals())
- zc.buildout.testing.sdist(tmp, dest)
- finally:
- shutil.rmtree(tmp)
-
-def create_sample_recipe_sdists(dest):
- from zc.buildout.testing import write, mkdir
- name = 'demorecipe'
- for version in ('1.0', '1.1b1'):
- tmp = tempfile.mkdtemp()
- try:
- write(tmp, 'README.txt', '')
- write(tmp, name + '.py',
- "import logging, os, zc.buildout\n"
- "class Demorecipe:\n"
- " def __init__(self, buildout, name, options):\n"
- " self.name, self.options = name, options\n"
- " def install(self):\n"
- " return ()\n"
- " def update(self):\n"
- " pass\n"
- % locals())
- write(tmp, 'setup.py',
- "from setuptools import setup\n"
- "setup(\n"
- " name = %(name)r,\n"
- " py_modules = [%(name)r],\n"
- " entry_points = {'zc.buildout': "
- "['default = %(name)s:Demorecipe']},\n"
- " zip_safe=True, version=%(version)r,\n"
- " author='bob', url='bob', author_email='bob')\n"
- % locals())
- zc.buildout.testing.sdist(tmp, dest)
- finally:
- shutil.rmtree(tmp)
-
-def _write_eggrecipedemoneeded(tmp, minor_version, suffix=''):
- from zc.buildout.testing import write
- write(tmp, 'README.txt', '')
- write(tmp, 'eggrecipedemoneeded.py',
- 'y=%s\ndef f():\n pass' % minor_version)
- write(
- tmp, 'setup.py',
- "from setuptools import setup\n"
- "setup(name='demoneeded', py_modules=['eggrecipedemoneeded'],"
- " zip_safe=True, version='1.%s%s', author='bob', url='bob', "
- "author_email='bob')\n"
- % (minor_version, suffix)
- )
-
-def _write_eggrecipedemo(tmp, minor_version, suffix=''):
- from zc.buildout.testing import write
- write(tmp, 'README.txt', '')
- write(
- tmp, 'eggrecipedemo.py',
- 'import eggrecipedemoneeded\n'
- 'x=%s\n'
- 'def main(): print x, eggrecipedemoneeded.y\n'
- % minor_version)
- write(
- tmp, '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%s')\n" % (minor_version, suffix)
- )
-
-def create_sample_sys_install(site_packages_path):
- for creator, minor_version in (
- (_write_eggrecipedemoneeded, 1),
- (_write_eggrecipedemo, 3)):
- # Write the files and install in site_packages_path.
- tmp = tempfile.mkdtemp()
- try:
- creator(tmp, minor_version)
- zc.buildout.testing.sys_install(tmp, site_packages_path)
- finally:
- shutil.rmtree(tmp)
-
-def create_sample_eggs(test, executable=sys.executable):
- from zc.buildout.testing import write
- dest = test.globs['sample_eggs']
- tmp = tempfile.mkdtemp()
- try:
- for i in (0, 1, 2):
- suffix = i==2 and 'c1' or ''
- _write_eggrecipedemoneeded(tmp, i, suffix)
- zc.buildout.testing.sdist(tmp, dest)
-
- write(
- tmp, 'setup.py',
- "from setuptools import setup\n"
- "setup(name='other', zip_safe=False, version='1.0', "
- "py_modules=['eggrecipedemoneeded'])\n"
- )
- zc.buildout.testing.bdist_egg(tmp, executable, dest)
-
- os.remove(os.path.join(tmp, 'eggrecipedemoneeded.py'))
-
- for i in (1, 2, 3, 4):
- suffix = i==4 and 'c1' or ''
- _write_eggrecipedemo(tmp, i, suffix)
- zc.buildout.testing.bdist_egg(tmp, executable, dest)
-
- write(tmp, 'eggrecipebigdemo.py', 'import eggrecipedemo')
- write(
- tmp, 'setup.py',
- "from setuptools import setup\n"
- "setup(name='bigdemo', "
- " install_requires = 'demo',"
- " py_modules=['eggrecipebigdemo'], "
- " zip_safe=True, version='0.1')\n"
- )
- zc.buildout.testing.bdist_egg(tmp, executable, dest)
-
- finally:
- shutil.rmtree(tmp)
-
-extdemo_c = """
-#include <Python.h>
-#include <extdemo.h>
-
-static PyMethodDef methods[] = {{NULL}};
-
-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
-}
-"""
-
-extdemo_setup_py = """
-import os
-from distutils.core import setup, Extension
-
-if os.environ.get('test-variable'):
- print "Have environment test-variable:", os.environ['test-variable']
-
-setup(name = "extdemo", version = "%s", url="http://www.zope.org",
- author="Demo", author_email="demo@demo.com",
- ext_modules = [Extension('extdemo', ['extdemo.c'])],
- )
-"""
-
-def add_source_dist(test, version=1.4):
-
- if 'extdemo' not in test.globs:
- test.globs['extdemo'] = test.globs['tmpdir']('extdemo')
-
- tmp = test.globs['extdemo']
- write = test.globs['write']
- try:
- write(tmp, 'extdemo.c', extdemo_c);
- write(tmp, 'setup.py', extdemo_setup_py % version);
- write(tmp, 'README', "");
- write(tmp, 'MANIFEST.in', "include *.c\n");
- test.globs['sdist'](tmp, test.globs['sample_eggs'])
- except:
- shutil.rmtree(tmp)
-
-def easy_install_SetUp(test):
- zc.buildout.testing.buildoutSetUp(test)
- sample_eggs = test.globs['tmpdir']('sample_eggs')
- test.globs['sample_eggs'] = sample_eggs
- os.mkdir(os.path.join(sample_eggs, 'index'))
- create_sample_eggs(test)
- add_source_dist(test)
- test.globs['link_server'] = test.globs['start_server'](
- test.globs['sample_eggs'])
- test.globs['update_extdemo'] = lambda : add_source_dist(test, 1.5)
- zc.buildout.testing.install_develop('zc.recipe.egg', test)
- zc.buildout.testing.install_develop('z3c.recipe.scripts', test)
-
-egg_parse = re.compile('([0-9a-zA-Z_.]+)-([0-9a-zA-Z_.]+)-py(\d[.]\d).egg$'
- ).match
-def makeNewRelease(project, ws, dest, version='99.99'):
- dist = ws.find(pkg_resources.Requirement.parse(project))
- eggname, oldver, pyver = egg_parse(
- os.path.basename(dist.location)
- ).groups()
- dest = os.path.join(dest, "%s-%s-py%s.egg" % (eggname, version, pyver))
- if os.path.isfile(dist.location):
- shutil.copy(dist.location, dest)
- zip = zipfile.ZipFile(dest, 'a')
- zip.writestr(
- 'EGG-INFO/PKG-INFO',
- zip.read('EGG-INFO/PKG-INFO').replace("Version: %s" % oldver,
- "Version: %s" % version)
- )
- zip.close()
- else:
- shutil.copytree(dist.location, dest)
- info_path = os.path.join(dest, 'EGG-INFO', 'PKG-INFO')
- info = open(info_path).read().replace("Version: %s" % oldver,
- "Version: %s" % version)
- open(info_path, 'w').write(info)
-
-def getWorkingSetWithBuildoutEgg(test):
- sample_buildout = test.globs['sample_buildout']
- eggs = os.path.join(sample_buildout, 'eggs')
-
- # If the zc.buildout dist is a develop dist, convert it to a
- # regular egg in the sample buildout
- req = pkg_resources.Requirement.parse('zc.buildout')
- dist = pkg_resources.working_set.find(req)
- if dist.precedence == pkg_resources.DEVELOP_DIST:
- # We have a develop egg, create a real egg for it:
- here = os.getcwd()
- os.chdir(os.path.dirname(dist.location))
- assert os.spawnle(
- os.P_WAIT, sys.executable,
- zc.buildout.easy_install._safe_arg(sys.executable),
- os.path.join(os.path.dirname(dist.location), 'setup.py'),
- '-q', 'bdist_egg', '-d', eggs,
- dict(os.environ,
- PYTHONPATH=pkg_resources.working_set.find(
- pkg_resources.Requirement.parse('setuptools')
- ).location,
- ),
- ) == 0
- os.chdir(here)
- os.remove(os.path.join(eggs, 'zc.buildout.egg-link'))
-
- # Rebuild the buildout script
- ws = pkg_resources.WorkingSet([eggs])
- ws.require('zc.buildout')
- zc.buildout.easy_install.scripts(
- ['zc.buildout'], ws, sys.executable,
- os.path.join(sample_buildout, 'bin'))
- else:
- ws = pkg_resources.working_set
- return ws
-
-def updateSetup(test):
- zc.buildout.testing.buildoutSetUp(test)
- new_releases = test.globs['tmpdir']('new_releases')
- test.globs['new_releases'] = new_releases
- ws = getWorkingSetWithBuildoutEgg(test)
- # now let's make the new releases
- makeNewRelease('zc.buildout', ws, new_releases)
- makeNewRelease('zc.buildout', ws, new_releases, '100.0b1')
- os.mkdir(os.path.join(new_releases, 'zc.buildout'))
- if zc.buildout.easy_install.is_distribute:
- makeNewRelease('distribute', ws, new_releases)
- os.mkdir(os.path.join(new_releases, 'distribute'))
- else:
- makeNewRelease('setuptools', ws, new_releases)
- os.mkdir(os.path.join(new_releases, 'setuptools'))
-
-def bootstrapSetup(test):
- easy_install_SetUp(test)
- sample_eggs = test.globs['sample_eggs']
- ws = getWorkingSetWithBuildoutEgg(test)
- makeNewRelease('zc.buildout', ws, sample_eggs)
- makeNewRelease('zc.buildout', ws, sample_eggs, '100.0b1')
- os.environ['bootstrap-testing-find-links'] = test.globs['link_server']
-
-normalize_bang = (
- re.compile(re.escape('#!'+
- zc.buildout.easy_install._safe_arg(sys.executable))),
- '#!/usr/local/bin/python2.4',
- )
-
-hide_distribute_additions = (re.compile('install_dir .+\n'), '')
-hide_zip_safe_message = (
- # This comes in a different place in the output in Python 2.7. It's not
- # important to our tests. Hide it.
- re.compile(
- '((?<=\n)\n)?zip_safe flag not set; analyzing archive contents...\n'),
- '')
-hide_first_index_page_message = (
- # This comes in a different place in the output in Python 2.7. It's not
- # important to our tests. Hide it.
- re.compile(
- "Couldn't find index page for '[^']+' \(maybe misspelled\?\)\n"),
- '')
-def test_suite():
- test_suite = [
- doctest.DocFileSuite(
- 'buildout.txt', 'runsetup.txt', 'repeatable.txt', 'setup.txt',
- setUp=zc.buildout.testing.buildoutSetUp,
- tearDown=zc.buildout.testing.buildoutTearDown,
- checker=renormalizing.RENormalizing([
- zc.buildout.testing.normalize_path,
- zc.buildout.testing.normalize_endings,
- zc.buildout.testing.normalize_script,
- zc.buildout.testing.normalize_egg_py,
- zc.buildout.tests.hide_distribute_additions,
- hide_zip_safe_message,
- (re.compile('__buildout_signature__ = recipes-\S+'),
- '__buildout_signature__ = recipes-SSSSSSSSSSS'),
- (re.compile('executable = [\S ]+python\S*', re.I),
- 'executable = python'),
- (re.compile('[-d] (setuptools|distribute)-\S+[.]egg'),
- 'setuptools.egg'),
- (re.compile('zc.buildout(-\S+)?[.]egg(-link)?'),
- 'zc.buildout.egg'),
- (re.compile('creating \S*setup.cfg'), 'creating setup.cfg'),
- (re.compile('hello\%ssetup' % os.path.sep), 'hello/setup'),
- (re.compile('Picked: (\S+) = \S+'),
- 'Picked: \\1 = V.V'),
- (re.compile(r'We have a develop egg: zc.buildout (\S+)'),
- 'We have a develop egg: zc.buildout X.X.'),
- (re.compile(r'\\[\\]?'), '/'),
- (re.compile('WindowsError'), 'OSError'),
- (re.compile(r'\[Error \d+\] Cannot create a file '
- r'when that file already exists: '),
- '[Errno 17] File exists: '
- ),
- (re.compile('distribute'), 'setuptools'),
- ])
- ),
- doctest.DocFileSuite(
- 'debugging.txt',
- setUp=zc.buildout.testing.buildoutSetUp,
- tearDown=zc.buildout.testing.buildoutTearDown,
- checker=renormalizing.RENormalizing([
- zc.buildout.testing.normalize_path,
- zc.buildout.testing.normalize_endings,
- zc.buildout.tests.hide_distribute_additions,
- (re.compile(r'\S+buildout.py'), 'buildout.py'),
- (re.compile(r'line \d+'), 'line NNN'),
- (re.compile(r'py\(\d+\)'), 'py(NNN)'),
- ])
- ),
-
- doctest.DocFileSuite(
- 'update.txt',
- setUp=updateSetup,
- tearDown=zc.buildout.testing.buildoutTearDown,
- checker=renormalizing.RENormalizing([
- zc.buildout.testing.normalize_path,
- zc.buildout.testing.normalize_endings,
- zc.buildout.testing.normalize_script,
- zc.buildout.testing.normalize_egg_py,
- normalize_bang,
- zc.buildout.tests.hide_distribute_additions,
- (re.compile('99[.]99'), 'NINETYNINE.NINETYNINE'),
- (re.compile('(zc.buildout|setuptools)-\d+[.]\d+\S*'
- '-py\d.\d.egg'),
- '\\1.egg'),
- (re.compile('distribute-\d+[.]\d+\S*'
- '-py\d.\d.egg'),
- 'setuptools.egg'),
- (re.compile('(zc.buildout|setuptools)( version)? \d+[.]\d+\S*'),
- '\\1 V.V'),
- (re.compile('distribute( version)? \d+[.]\d+\S*'),
- 'setuptools V.V'),
- (re.compile('[-d] (setuptools|distribute)'), '- setuptools'),
- (re.compile('distribute'), 'setuptools'),
- (re.compile("\nUnused options for buildout: "
- "'(distribute|setuptools)\-version'\."),
- '')
- ])
- ),
-
- doctest.DocFileSuite(
- 'easy_install.txt', 'downloadcache.txt', 'dependencylinks.txt',
- 'allowhosts.txt', 'unzip.txt', 'upgrading_distribute.txt',
- setUp=easy_install_SetUp,
- tearDown=zc.buildout.testing.buildoutTearDown,
- checker=renormalizing.RENormalizing([
- zc.buildout.testing.normalize_path,
- zc.buildout.testing.normalize_endings,
- zc.buildout.testing.normalize_script,
- zc.buildout.testing.normalize_egg_py,
- normalize_bang,
- hide_first_index_page_message,
- zc.buildout.tests.hide_distribute_additions,
- (re.compile('extdemo[.]pyd'), 'extdemo.so'),
- (re.compile('[-d] (setuptools|distribute)-\S+[.]egg'),
- 'setuptools.egg'),
- (re.compile(r'\\[\\]?'), '/'),
- (re.compile(r'\#!\S+\bpython\S*'), '#!/usr/bin/python'),
- # Normalize generate_script's Windows interpreter to UNIX:
- (re.compile(r'\nimport subprocess\n'), '\n'),
- (re.compile('subprocess\\.call\\(argv, env=environ\\)'),
- 'os.execve(sys.executable, argv, environ)'),
- (re.compile('distribute'), 'setuptools'),
- # Distribute unzips eggs by default.
- (re.compile('\- demoneeded'), 'd demoneeded'),
- ]+(sys.version_info < (2, 5) and [
- (re.compile('.*No module named runpy.*', re.S), ''),
- (re.compile('.*usage: pdb.py scriptfile .*', re.S), ''),
- (re.compile('.*Error: what does not exist.*', re.S), ''),
- ] or [])),
- ),
-
- doctest.DocFileSuite(
- 'download.txt', 'extends-cache.txt',
- setUp=easy_install_SetUp,
- tearDown=zc.buildout.testing.buildoutTearDown,
- optionflags=doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS,
- checker=renormalizing.RENormalizing([
- (re.compile(' at -?0x[^>]+'), '<MEM ADDRESS>'),
- (re.compile('http://localhost:[0-9]{4,5}/'),
- 'http://localhost/'),
- (re.compile('[0-9a-f]{32}'), '<MD5 CHECKSUM>'),
- zc.buildout.testing.normalize_path,
- ]),
- ),
-
- doctest.DocTestSuite(
- setUp=easy_install_SetUp,
- tearDown=zc.buildout.testing.buildoutTearDown,
- checker=renormalizing.RENormalizing([
- zc.buildout.testing.normalize_path,
- zc.buildout.testing.normalize_endings,
- zc.buildout.testing.normalize_script,
- zc.buildout.testing.normalize_egg_py,
- zc.buildout.tests.hide_distribute_additions,
- hide_first_index_page_message,
- (re.compile("buildout: Running \S*setup.py"),
- 'buildout: Running setup.py'),
- (re.compile('(setuptools|distribute)-\S+-'),
- 'setuptools.egg'),
- (re.compile('zc.buildout-\S+-'),
- 'zc.buildout.egg'),
- (re.compile('File "\S+one.py"'),
- 'File "one.py"'),
- (re.compile(r'We have a develop egg: (\S+) (\S+)'),
- r'We have a develop egg: \1 V'),
- (re.compile('Picked: (setuptools|distribute) = \S+'),
- 'Picked: setuptools = V'),
- (re.compile(r'\\[\\]?'), '/'),
- (re.compile(
- '-q develop -mxN -d "/sample-buildout/develop-eggs'),
- '-q develop -mxN -d /sample-buildout/develop-eggs'
- ),
- (re.compile(r'^[*]...'), '...'),
- # for bug_92891_bootstrap_crashes_with_egg_recipe_in_buildout_section
- (re.compile(r"Unused options for buildout: 'eggs' 'scripts'\."),
- "Unused options for buildout: 'scripts' 'eggs'."),
- (re.compile('distribute'), 'setuptools'),
- # Distribute unzips eggs by default.
- (re.compile('\- demoneeded'), 'd demoneeded'),
- ]),
- ),
- zc.buildout.testselectingpython.test_suite(),
- zc.buildout.rmtree.test_suite(),
- doctest.DocFileSuite(
- 'windows.txt',
- setUp=zc.buildout.testing.buildoutSetUp,
- tearDown=zc.buildout.testing.buildoutTearDown,
- checker=renormalizing.RENormalizing([
- zc.buildout.testing.normalize_path,
- zc.buildout.testing.normalize_endings,
- zc.buildout.testing.normalize_script,
- zc.buildout.testing.normalize_egg_py,
- zc.buildout.tests.hide_distribute_additions,
- (re.compile('__buildout_signature__ = recipes-\S+'),
- '__buildout_signature__ = recipes-SSSSSSSSSSS'),
- (re.compile('[-d] setuptools-\S+[.]egg'), 'setuptools.egg'),
- (re.compile('zc.buildout(-\S+)?[.]egg(-link)?'),
- 'zc.buildout.egg'),
- (re.compile('creating \S*setup.cfg'), 'creating setup.cfg'),
- (re.compile('hello\%ssetup' % os.path.sep), 'hello/setup'),
- (re.compile('Picked: (\S+) = \S+'),
- 'Picked: \\1 = V.V'),
- (re.compile(r'We have a develop egg: zc.buildout (\S+)'),
- 'We have a develop egg: zc.buildout X.X.'),
- (re.compile(r'\\[\\]?'), '/'),
- (re.compile('WindowsError'), 'OSError'),
- (re.compile(r'\[Error 17\] Cannot create a file '
- r'when that file already exists: '),
- '[Errno 17] File exists: '
- ),
- ])
- ),
- doctest.DocFileSuite(
- 'testing_bugfix.txt',
- checker=renormalizing.RENormalizing([
- # Python 2.7
- (re.compile(
- re.escape(
- 'testrunner.logsupport.NullHandler instance at')),
- 'testrunner.logsupport.NullHandler object at'),
- (re.compile(re.escape('logging.StreamHandler instance at')),
- 'logging.StreamHandler object at'),
- ])
- ),
- ]
-
- # adding bootstrap.txt doctest to the suite
- # only if bootstrap.py is present
- bootstrap_py = os.path.join(
- os.path.dirname(
- os.path.dirname(
- os.path.dirname(
- os.path.dirname(zc.buildout.__file__)
- )
- )
- ),
- 'bootstrap', 'bootstrap.py')
-
- if os.path.exists(bootstrap_py):
- test_suite.append(doctest.DocFileSuite(
- 'bootstrap.txt',
- setUp=bootstrapSetup,
- tearDown=zc.buildout.testing.buildoutTearDown,
- checker=renormalizing.RENormalizing([
- zc.buildout.testing.normalize_path,
- zc.buildout.testing.normalize_endings,
- zc.buildout.testing.normalize_script,
- zc.buildout.testing.normalize_egg_py,
- normalize_bang,
- (re.compile('Downloading.*setuptools.*egg\n'), ''),
- (re.compile('options:'), 'Options:'),
- (re.compile('usage:'), 'Usage:'),
- ]),
- ))
- test_suite.append(doctest.DocFileSuite(
- 'virtualenv.txt',
- setUp=easy_install_SetUp,
- tearDown=zc.buildout.testing.buildoutTearDown,
- checker=renormalizing.RENormalizing([
- zc.buildout.testing.normalize_path,
- zc.buildout.testing.normalize_endings,
- zc.buildout.testing.normalize_script,
- zc.buildout.testing.normalize_egg_py,
- zc.buildout.tests.hide_distribute_additions,
- (re.compile('(setuptools|distribute)-\S+-'),
- 'setuptools.egg'),
- (re.compile('zc.buildout-\S+-'),
- 'zc.buildout.egg'),
- (re.compile(re.escape('#!"/executable_buildout/bin/py"')),
- '#!/executable_buildout/bin/py'), # Windows.
- (re.compile(re.escape('/broken_s/')),
- '/broken_S/'), # Windows.
- ]),
- ))
-
- return unittest.TestSuite(test_suite)