|
import os |
|
import sys |
|
import subprocess |
|
import unicodedata |
|
from subprocess import Popen as _Popen, PIPE as _PIPE |
|
|
|
import jaraco.envs |
|
|
|
|
|
class VirtualEnv(jaraco.envs.VirtualEnv): |
|
name = '.env' |
|
|
|
|
|
|
|
|
|
create_opts = ['--no-setuptools'] |
|
|
|
def run(self, cmd, *args, **kwargs): |
|
cmd = [self.exe(cmd[0])] + cmd[1:] |
|
kwargs = {"cwd": self.root, "encoding": "utf-8", **kwargs} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if "env" not in kwargs: |
|
env = dict(os.environ) |
|
if "PYTHONPATH" in env: |
|
del env["PYTHONPATH"] |
|
kwargs["env"] = env |
|
return subprocess.check_output(cmd, *args, **kwargs) |
|
|
|
|
|
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] |
|
|
|
|
|
if pypath is not None: |
|
env["PYTHONPATH"] = pypath |
|
|
|
|
|
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) |
|
|
|
|
|
shell = sys.platform == 'win32' |
|
|
|
try: |
|
proc = _Popen( |
|
cmd, |
|
stdout=_PIPE, |
|
stderr=_PIPE, |
|
shell=shell, |
|
env=env, |
|
encoding="utf-8", |
|
) |
|
|
|
if isinstance(data_stream, tuple): |
|
data_stream = slice(*data_stream) |
|
data = proc.communicate()[data_stream] |
|
except OSError: |
|
return 1, '' |
|
|
|
|
|
if hasattr(data, "decode"): |
|
|
|
data = data.decode() |
|
data = unicodedata.normalize('NFC', data) |
|
|
|
|
|
return proc.returncode, data |
|
|