2008-10-16 00:02:57 +02:00
|
|
|
#!/usr/bin/env python
|
|
|
|
import os, sys
|
|
|
|
|
|
|
|
pyversion = sys.version[:3]
|
|
|
|
lib_py = 'lib/python%s/' % pyversion
|
|
|
|
here = os.path.dirname(os.path.abspath(__file__))
|
|
|
|
base_path = os.path.join(here, 'test-scratch')
|
2009-10-07 23:25:17 +02:00
|
|
|
download_cache = os.path.join(here, 'test-cache')
|
|
|
|
if not os.path.exists(download_cache):
|
|
|
|
os.makedirs(download_cache)
|
2008-10-16 00:02:57 +02:00
|
|
|
|
|
|
|
from scripttest import TestFileEnvironment
|
|
|
|
|
|
|
|
if 'PYTHONPATH' in os.environ:
|
|
|
|
del os.environ['PYTHONPATH']
|
|
|
|
|
2009-10-07 23:25:17 +02:00
|
|
|
try:
|
|
|
|
any
|
|
|
|
except NameError:
|
|
|
|
def any(seq):
|
|
|
|
for item in seq:
|
|
|
|
if item:
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
2009-10-24 15:24:08 +02:00
|
|
|
def clear_environ(environ):
|
|
|
|
return dict(((k, v) for k, v in environ.iteritems()
|
|
|
|
if not k.lower().startswith('pip_')))
|
|
|
|
|
2010-04-13 02:48:37 +02:00
|
|
|
def virtualenv_bin_dir(path):
|
|
|
|
if sys.platform == 'win32':
|
|
|
|
return os.path.join(path, 'Scripts')
|
|
|
|
else:
|
|
|
|
return os.path.join(path, 'bin')
|
|
|
|
|
2010-02-21 23:47:49 +01:00
|
|
|
env = None
|
2009-10-24 15:24:08 +02:00
|
|
|
def reset_env(environ=None):
|
2008-10-16 00:02:57 +02:00
|
|
|
global env
|
2009-10-24 15:24:08 +02:00
|
|
|
if not environ:
|
|
|
|
environ = os.environ.copy()
|
|
|
|
environ = clear_environ(environ)
|
|
|
|
environ['PIP_DOWNLOAD_CACHE'] = download_cache
|
2009-10-07 23:25:17 +02:00
|
|
|
environ['PIP_NO_INPUT'] = '1'
|
2010-04-10 11:57:49 +02:00
|
|
|
environ['PIP_LOG_FILE'] = os.path.join(base_path, 'pip-log.txt')
|
2010-04-13 02:54:57 +02:00
|
|
|
|
2009-10-07 23:25:17 +02:00
|
|
|
env = TestFileEnvironment(base_path, ignore_hidden=False, environ=environ)
|
2008-12-17 19:46:48 +01:00
|
|
|
env.run(sys.executable, '-m', 'virtualenv', '--no-site-packages', env.base_path)
|
2010-04-13 02:48:37 +02:00
|
|
|
|
|
|
|
# put the test-scratch virtualenv's bin dir first on the script path
|
|
|
|
env.script_path.insert(0, virtualenv_bin_dir(env.base_path))
|
|
|
|
|
2009-10-20 17:36:53 +02:00
|
|
|
# make sure we have current setuptools to avoid svn incompatibilities
|
2010-04-13 02:48:37 +02:00
|
|
|
env.run('easy_install', 'setuptools==0.6c11')
|
|
|
|
|
|
|
|
# Uninstall whatever version of pip came with the virtualenv
|
|
|
|
env.run('pip', 'uninstall', '-y', 'pip')
|
|
|
|
|
|
|
|
# Install this version instead
|
|
|
|
env.run('python', 'setup.py', 'install', cwd=os.path.dirname(here))
|
2008-10-16 00:02:57 +02:00
|
|
|
|
2008-10-16 00:24:00 +02:00
|
|
|
def run_pip(*args, **kw):
|
2010-04-13 02:48:37 +02:00
|
|
|
args = ('pip',) + args
|
2008-10-16 00:02:57 +02:00
|
|
|
#print >> sys.__stdout__, 'running', ' '.join(args)
|
|
|
|
result = env.run(*args, **kw)
|
|
|
|
return result
|
|
|
|
|
|
|
|
def write_file(filename, text):
|
|
|
|
f = open(os.path.join(base_path, filename), 'w')
|
|
|
|
f.write(text)
|
|
|
|
f.close()
|
|
|
|
|
2010-04-15 13:01:36 +02:00
|
|
|
def mkdir(dirname):
|
|
|
|
os.mkdir(os.path.join(base_path, dirname))
|
|
|
|
|
2008-10-16 00:02:57 +02:00
|
|
|
def get_env():
|
|
|
|
return env
|
|
|
|
|
2009-04-01 00:17:08 +02:00
|
|
|
# FIXME ScriptTest does something similar, but only within a single
|
|
|
|
# ProcResult; this generalizes it so states can be compared across
|
|
|
|
# multiple commands. Maybe should be rolled into ScriptTest?
|
2009-04-06 19:59:20 +02:00
|
|
|
def diff_states(start, end, ignore=None):
|
2009-04-01 00:17:08 +02:00
|
|
|
"""
|
|
|
|
Differences two "filesystem states" as represented by dictionaries
|
|
|
|
of FoundFile and FoundDir objects.
|
|
|
|
|
|
|
|
Returns a dictionary with following keys:
|
|
|
|
|
|
|
|
``deleted``
|
|
|
|
Dictionary of files/directories found only in the start state.
|
|
|
|
|
|
|
|
``created``
|
|
|
|
Dictionary of files/directories found only in the end state.
|
|
|
|
|
|
|
|
``updated``
|
|
|
|
Dictionary of files whose size has changed (FIXME not entirely
|
|
|
|
reliable, but comparing contents is not possible because
|
|
|
|
FoundFile.bytes is lazy, and comparing mtime doesn't help if
|
|
|
|
we want to know if a file has been returned to its earlier
|
|
|
|
state).
|
|
|
|
|
|
|
|
Ignores mtime and other file attributes; only presence/absence and
|
|
|
|
size are considered.
|
|
|
|
|
|
|
|
"""
|
2009-04-06 19:59:20 +02:00
|
|
|
ignore = ignore or []
|
|
|
|
start_keys = set([k for k in start.keys()
|
2009-09-06 19:16:02 +02:00
|
|
|
if not any([k.startswith(i) for i in ignore])])
|
2009-04-06 19:59:20 +02:00
|
|
|
end_keys = set([k for k in end.keys()
|
2009-09-06 19:16:02 +02:00
|
|
|
if not any([k.startswith(i) for i in ignore])])
|
2009-04-06 19:59:20 +02:00
|
|
|
deleted = dict([(k, start[k]) for k in start_keys.difference(end_keys)])
|
|
|
|
created = dict([(k, end[k]) for k in end_keys.difference(start_keys)])
|
2009-04-01 00:17:08 +02:00
|
|
|
updated = {}
|
2009-04-06 19:59:20 +02:00
|
|
|
for k in start_keys.intersection(end_keys):
|
2009-04-01 00:17:08 +02:00
|
|
|
if (start[k].size != end[k].size):
|
|
|
|
updated[k] = end[k]
|
|
|
|
return dict(deleted=deleted, created=created, updated=updated)
|
|
|
|
|
2008-10-16 00:02:57 +02:00
|
|
|
if __name__ == '__main__':
|
2010-04-13 02:48:37 +02:00
|
|
|
sys.stderr.write("Run pip's tests using nosetests. Requires virtualenv, ScriptTest, and nose.\n")
|
2010-03-08 16:12:47 +01:00
|
|
|
sys.exit(1)
|
|
|
|
|