Installing eggs from index or find links, the classical way to install python packages
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
We need to specify a find-links entry to make the recipe find our 'foo' egg as it is not on pypi
As we want to show the update capability of the recipe, we will first install the oldest foo version.

Let's create a buildout configuration file and a basic egg not published on pypi::

    >>> rmdir(tempdir)
    >>> mkdir(tempdir)
    >>> cd(tempdir)
    >>> a = [mkdir(d) for d in ('eggs', 'develop-eggs', 'bin', 'src')]
    >>> install_develop_eggs(['minitage.recipe.egg'])
    >>> install_eggs_from_pathes(['zc.buildout'], sys.path)
    >>> touch('buildout.cfg')
    >>> sh('buildout -o bootstrap')
    buildout -o bootstrap...
    >>> if not os.path.exists('foo'):
    ...     mkdir('foo')
    ... else:
    ...     rmdir(foo)
    ...     mkdir('foo')
    >>> touch('foo/setup.py', data="""
    ... from setuptools import setup
    ... setup(name='foo', version='1.0')
    ...
    ... """)
    >>> touch('foo/toto.py', data="""
    ... def f():
    ...     print "foo"
    ...
    ... """)
    >>> noecho = [os.remove(d) for d in os.listdir('.') if '.tar.gz' in d]
    >>> os.chdir('foo')
    >>> sh('python setup.py sdist')
    p...
    >>> touch('setup.py', data="""
    ... from setuptools import setup
    ... setup(name='foo', version='2.0')
    ...
    ... """)
    >>> sh('python setup.py sdist')
    p...
    >>> noecho = [shutil.copy(os.path.join('dist', d), os.path.join('..', d)) for d in os.listdir('dist')]
    >>> os.chdir('..')
    >>> index_url = start_server(os.path.sep.join(tempdir))
    >>> data = """
    ... [versions]
    ... foo=1.0
    ... [buildout]
    ... download-cache=${buildout:directory}
    ... parts =
    ...     part
    ... [part]
    ... recipe=minitage.recipe.egg
    ... find-links=%(index)s
    ... eggs=foo
    ... """%{'index': index_url}
    >>> touch('buildout.cfg', data=data)
    >>> noecho = [remove(os.path.join('eggs', egg)) for egg in os.listdir('eggs') if 'foo' in egg]
    >>> sh('bin/buildout -vvvvv install part')
    bin/...
    Installing part.
    minitage.recipe: Installing python egg(s)...
    minitage.recipe: Downloading http://...:.../foo-1.0.tar.gz in /tmp/buildout.test/minitage/eggs/foo-1.0.tar.gz
    minitage.recipe: Unpacking in ...
    Processing foo-1.0.tar.gz...
    minitage.recipe: Installed foo 1.0 (/tmp/buildout.test/eggs/foo-1.0-p....egg)...


Static distribution dev+static urls
++++++++++++++++++++++++++++++++++++++++++++++++++
You can also install directly from urls.
We ll use it to check the already present distribution files in the cache.

    >>> data = """
    ... [versions]
    ... mr.developer=0.15
    ... [buildout]
    ... versions = versions
    ... download-cache=${buildout:directory}
    ... parts =
    ...     part
    ... [part]
    ... recipe = minitage.recipe.egg
    ... eggs=mr.developer
    ... [a]
    ... recipe=minitage.recipe.egg
    ... urls=
    ...     http://pypi.python.org/packages/source/m/minitage.core/minitage.core-1.0.4.tar.gz#md5=1e30ceabd1b012e33b1d2f327f6609b5
    ...     http://pypi.python.org/packages/source/m/minitage.paste/minitage.paste-1.1.tar.gz#md5=b9076b78a17f2247f68d232368fcc8f0
    ... """
    >>> touch('buildout.cfg', data=data)
    >>> sh('bin/buildout -vvvvvv install a') #doctest +REPORT_NDIFF
    b...
    Installing a...
    minitage.recipe: Downloading http://pypi.python.org/packages/source/m/minitage.core/minitage.core-1.0.4.tar.gz#md5=1e30ceabd1b012e33b1d2f327f6609b5 in /tmp/buildout.test/minitage/eggs/minitage.core-1.0.4.tar.gz_c3e78ea4294cdd0a243fbea6e2aa9757/minitage.core-1.0.4.tar.gz...
    minitage.recipe: Installed minitage.core 1.0.4 (/tmp/buildout.test/eggs/minitage.core-1.0.4-py...egg).
    minitage.recipe: Pinning custom egg version in buildout, trying to write the configuration
    minitage.recipe: CREATING buildout backup in /tmp/buildout.test/buildout.cfg.before.fixed_version.bak...
    minitage.recipe: Downloading http://pypi.python.org/packages/source/m/minitage.paste/minitage.paste-1.1.tar.gz#md5=b9076b78a17f2247f68d232368fcc8f0 in /tmp/buildout.test/minitage/eggs/minitage.paste-1.1.tar.gz_d3403e6128eddb2b99063674ff8105a1/minitage.paste-1.1.tar.gz...
    minitage.recipe: Installed minitage.paste 1.1 (/tmp/buildout.test/eggs/minitage.paste-1.1-py...egg).
    minitage.recipe: Pinning custom egg version in buildout, trying to write the configuration
    minitage.recipe: CREATING buildout backup in /tmp/buildout.test/buildout.cfg.before.fixed_version.bak...

As we are installing from an url, we must pin the version to be sure to use this egg,
even if we have some other similar egg on index or find-links.
See the versions pinned to use your downloaded stuff

    >>> cat('buildout.cfg')
    <BLANKLINE>
    [versions]
    mr.developer=0.15
    minitage.core = 1.0.4
    minitage.paste = 1.1
    [buildout]
    versions = versions
    download-cache=${buildout:directory}
    parts =
        part
    [part]
    recipe = minitage.recipe.egg
    eggs=mr.developer
    [a]
    recipe=minitage.recipe.egg
    urls=
        http://pypi.python.org/packages/source/m/minitage.core/minitage.core-1.0.4.tar.gz#md5=1e30ceabd1b012e33b1d2f327f6609b5
        http://pypi.python.org/packages/source/m/minitage.paste/minitage.paste-1.1.tar.gz#md5=b9076b78a17f2247f68d232368fcc8f0

If we try to install a newer version, via an url, it will work, even if the version is pinned.

    >>> data = """
    ... [versions]
    ... mr.developer=0.15
    ... [buildout]
    ... versions = versions
    ... download-cache=${buildout:directory}
    ... parts =
    ...     part
    ... [part]
    ... recipe = minitage.recipe.egg
    ... eggs=mr.developer
    ... [a]
    ... recipe=minitage.recipe.egg
    ... urls=
    ...     http://pypi.python.org/packages/source/m/minitage.core/minitage.core-1.0.33.zip#md5=9d778f890a35e06113425c303a612259
    ...     http://pypi.python.org/packages/source/m/minitage.paste/minitage.paste-1.1.tar.gz#md5=b9076b78a17f2247f68d232368fcc8f0
    ... """
    >>> touch('buildout.cfg', data=data)
    >>> sh('bin/buildout -vvvvv install a')
    b...
    >>> cat('buildout.cfg')
    <BLANKLINE>
    [versions]...
    minitage.core = 1.0.33...

If we try to rebuild the egg, we cannot, as the same egg is already built.
This is to prevent rebuilding triggered by buildout each time we launch it,
and also to delete already good versions present in the cache.

    >>> sh('bin/buildout -ovvvvv install a')
    b...
    minitage.recipe: If you want to rebuild, please do 'rm -rf /tmp/buildout.test/eggs/minitage.core-1.0.33-py...egg'...


