| Index: recipe_engine/third_party/setuptools/tests/environment.py
|
| diff --git a/recipe_engine/third_party/setuptools/tests/environment.py b/recipe_engine/third_party/setuptools/tests/environment.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c8d0e66921733119fd07fd81c540e0369b3f4ca7
|
| --- /dev/null
|
| +++ b/recipe_engine/third_party/setuptools/tests/environment.py
|
| @@ -0,0 +1,118 @@
|
| +import os
|
| +import zipfile
|
| +import sys
|
| +import tempfile
|
| +import unittest
|
| +import shutil
|
| +import stat
|
| +import unicodedata
|
| +
|
| +from subprocess import Popen as _Popen, PIPE as _PIPE
|
| +
|
| +
|
| +def _remove_dir(target):
|
| +
|
| + #on windows this seems to a problem
|
| + for dir_path, dirs, files in os.walk(target):
|
| + os.chmod(dir_path, stat.S_IWRITE)
|
| + for filename in files:
|
| + os.chmod(os.path.join(dir_path, filename), stat.S_IWRITE)
|
| + shutil.rmtree(target)
|
| +
|
| +
|
| +class ZippedEnvironment(unittest.TestCase):
|
| +
|
| + datafile = None
|
| + dataname = None
|
| + old_cwd = None
|
| +
|
| + def setUp(self):
|
| + if self.datafile is None or self.dataname is None:
|
| + return
|
| +
|
| + if not os.path.isfile(self.datafile):
|
| + self.old_cwd = None
|
| + return
|
| +
|
| + self.old_cwd = os.getcwd()
|
| +
|
| + self.temp_dir = tempfile.mkdtemp()
|
| + zip_file, source, target = [None, None, None]
|
| + try:
|
| + zip_file = zipfile.ZipFile(self.datafile)
|
| + for files in zip_file.namelist():
|
| + zip_file.extract(files, self.temp_dir)
|
| + finally:
|
| + if zip_file:
|
| + zip_file.close()
|
| + del zip_file
|
| +
|
| + os.chdir(os.path.join(self.temp_dir, self.dataname))
|
| +
|
| + def tearDown(self):
|
| + #Assume setUp was never completed
|
| + if self.dataname is None or self.datafile is None:
|
| + return
|
| +
|
| + try:
|
| + if self.old_cwd:
|
| + os.chdir(self.old_cwd)
|
| + _remove_dir(self.temp_dir)
|
| + except OSError:
|
| + #sigh?
|
| + pass
|
| +
|
| +
|
| +def _which_dirs(cmd):
|
| + result = set()
|
| + for path in os.environ.get('PATH', '').split(os.pathsep):
|
| + filename = os.path.join(path, cmd)
|
| + if os.access(filename, os.X_OK):
|
| + result.add(path)
|
| + return result
|
| +
|
| +
|
| +def run_setup_py(cmd, pypath=None, path=None,
|
| + data_stream=0, env=None):
|
| + """
|
| + Execution command for tests, separate from those used by the
|
| + code directly to prevent accidental behavior issues
|
| + """
|
| + if env is None:
|
| + env = dict()
|
| + for envname in os.environ:
|
| + env[envname] = os.environ[envname]
|
| +
|
| + #override the python path if needed
|
| + if pypath is not None:
|
| + env["PYTHONPATH"] = pypath
|
| +
|
| + #overide the execution path if needed
|
| + if path is not None:
|
| + env["PATH"] = path
|
| + if not env.get("PATH", ""):
|
| + env["PATH"] = _which_dirs("tar").union(_which_dirs("gzip"))
|
| + env["PATH"] = os.pathsep.join(env["PATH"])
|
| +
|
| + cmd = [sys.executable, "setup.py"] + list(cmd)
|
| +
|
| + # http://bugs.python.org/issue8557
|
| + shell = sys.platform == 'win32'
|
| +
|
| + try:
|
| + proc = _Popen(
|
| + cmd, stdout=_PIPE, stderr=_PIPE, shell=shell, env=env,
|
| + )
|
| +
|
| + data = proc.communicate()[data_stream]
|
| + except OSError:
|
| + return 1, ''
|
| +
|
| + #decode the console string if needed
|
| + if hasattr(data, "decode"):
|
| + # use the default encoding
|
| + data = data.decode()
|
| + data = unicodedata.normalize('NFC', data)
|
| +
|
| + #communciate calls wait()
|
| + return proc.returncode, data
|
|
|