#!/usr/bin/env python

import sys
import os
import shutil
import tempfile
import subprocess
from distutils.command.install import INSTALL_SCHEMES
from string import Template

from six.moves import urllib


def _system_call(*args):
    assert subprocess.call(args) == 0


def tempdir(func):
    def _tempdir(*args, **kwargs):
        test_dir = tempfile.mkdtemp()
        old_dir = os.getcwd()
        os.chdir(test_dir)
        try:
            return func(*args, **kwargs)
        finally:
            os.chdir(old_dir)
            shutil.rmtree(test_dir)

    return _tempdir


SIMPLE_BUILDOUT = """\
[buildout]

parts = eggs

[eggs]
recipe = zc.recipe.egg

eggs =
    extensions
"""

BOOTSTRAP = 'http://downloads.buildout.org/1/bootstrap.py'
PYVER = sys.version.split()[0][:3]

_VARS = {'base': '.',
         'py_version_short': PYVER}

scheme = 'nt' if sys.platform == 'win32' else 'unix_prefix'
PURELIB = INSTALL_SCHEMES[scheme]['purelib']


@tempdir
def test_virtualenv():
    """virtualenv with setuptools"""
    purelib = os.path.abspath(Template(PURELIB).substitute(**_VARS))
    _system_call('virtualenv', '--no-site-packages', '.')
    _system_call('bin/easy_install', 'setuptools==dev')
    # linux specific
    site_pkg = os.listdir(purelib)
    site_pkg.sort()
    assert 'setuptools' in site_pkg[0]
    easy_install = os.path.join(purelib, 'easy-install.pth')
    with open(easy_install) as f:
        res = f.read()
    assert 'setuptools' in res


@tempdir
def test_full():
    """virtualenv + pip + buildout"""
    _system_call('virtualenv', '--no-site-packages', '.')
    _system_call('bin/easy_install', '-q', 'setuptools==dev')
    _system_call('bin/easy_install', '-qU', 'setuptools==dev')
    _system_call('bin/easy_install', '-q', 'pip')
    _system_call('bin/pip', 'install', '-q', 'zc.buildout')

    with open('buildout.cfg', 'w') as f:
        f.write(SIMPLE_BUILDOUT)

    with open('bootstrap.py', 'w') as f:
        f.write(urllib.request.urlopen(BOOTSTRAP).read())

    _system_call('bin/python', 'bootstrap.py')
    _system_call('bin/buildout', '-q')
    eggs = os.listdir('eggs')
    eggs.sort()
    assert len(eggs) == 3
    assert eggs[1].startswith('setuptools')
    del eggs[1]
    assert eggs == ['extensions-0.3-py2.6.egg',
        'zc.recipe.egg-1.2.2-py2.6.egg']


if __name__ == '__main__':
    test_virtualenv()
    test_full()
