Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/virtualenv/create/creator.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
| author | shellac |
|---|---|
| date | Mon, 01 Jun 2020 08:59:25 -0400 |
| parents | 79f47841a781 |
| children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/virtualenv/create/creator.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,202 +0,0 @@ -from __future__ import absolute_import, print_function, unicode_literals - -import json -import logging -import os -import sys -from abc import ABCMeta, abstractmethod -from argparse import ArgumentTypeError -from ast import literal_eval -from collections import OrderedDict - -from six import add_metaclass - -from virtualenv.discovery.cached_py_info import LogCmd -from virtualenv.info import WIN_CPYTHON_2 -from virtualenv.pyenv_cfg import PyEnvCfg -from virtualenv.util.path import Path, safe_delete -from virtualenv.util.six import ensure_str, ensure_text -from virtualenv.util.subprocess import run_cmd -from virtualenv.util.zipapp import ensure_file_on_disk -from virtualenv.version import __version__ - -HERE = Path(os.path.abspath(__file__)).parent -DEBUG_SCRIPT = HERE / "debug.py" - - -class CreatorMeta(object): - def __init__(self): - self.error = None - - -@add_metaclass(ABCMeta) -class Creator(object): - """A class that given a python Interpreter creates a virtual environment""" - - def __init__(self, options, interpreter): - """Construct a new virtual environment creator. - - :param options: the CLI option as parsed from :meth:`add_parser_arguments` - :param interpreter: the interpreter to create virtual environment from - """ - self.interpreter = interpreter - self._debug = None - self.dest = Path(options.dest) - self.clear = options.clear - self.pyenv_cfg = PyEnvCfg.from_folder(self.dest) - self.app_data = options.app_data.folder - - def __repr__(self): - return ensure_str(self.__unicode__()) - - def __unicode__(self): - return "{}({})".format(self.__class__.__name__, ", ".join("{}={}".format(k, v) for k, v in self._args())) - - def _args(self): - return [ - ("dest", ensure_text(str(self.dest))), - ("clear", self.clear), - ] - - @classmethod - def can_create(cls, interpreter): - """Determine if we can create a virtual environment. - - :param interpreter: the interpreter in question - :return: ``None`` if we can't create, any other object otherwise that will be forwarded to \ - :meth:`add_parser_arguments` - """ - return True - - @classmethod - def add_parser_arguments(cls, parser, interpreter, meta, app_data): - """Add CLI arguments for the creator. - - :param parser: the CLI parser - :param interpreter: the interpreter we're asked to create virtual environment for - :param meta: value as returned by :meth:`can_create` - """ - parser.add_argument( - "dest", help="directory to create virtualenv at", type=cls.validate_dest, - ) - parser.add_argument( - "--clear", - dest="clear", - action="store_true", - help="remove the destination directory if exist before starting (will overwrite files otherwise)", - default=False, - ) - - @abstractmethod - def create(self): - """Perform the virtual environment creation.""" - raise NotImplementedError - - @classmethod - def validate_dest(cls, raw_value): - """No path separator in the path, valid chars and must be write-able""" - - def non_write_able(dest, value): - common = Path(*os.path.commonprefix([value.parts, dest.parts])) - raise ArgumentTypeError( - "the destination {} is not write-able at {}".format(dest.relative_to(common), common) - ) - - # the file system must be able to encode - # note in newer CPython this is always utf-8 https://www.python.org/dev/peps/pep-0529/ - encoding = sys.getfilesystemencoding() - refused = OrderedDict() - kwargs = {"errors": "ignore"} if encoding != "mbcs" else {} - for char in ensure_text(raw_value): - try: - trip = char.encode(encoding, **kwargs).decode(encoding) - if trip == char: - continue - raise ValueError(trip) - except ValueError: - refused[char] = None - if refused: - raise ArgumentTypeError( - "the file system codec ({}) cannot handle characters {!r} within {!r}".format( - encoding, "".join(refused.keys()), raw_value - ) - ) - if os.pathsep in raw_value: - raise ArgumentTypeError( - "destination {!r} must not contain the path separator ({}) as this would break " - "the activation scripts".format(raw_value, os.pathsep) - ) - - value = Path(raw_value) - if value.exists() and value.is_file(): - raise ArgumentTypeError("the destination {} already exists and is a file".format(value)) - if (3, 3) <= sys.version_info <= (3, 6): - # pre 3.6 resolve is always strict, aka must exists, sidestep by using os.path operation - dest = Path(os.path.realpath(raw_value)) - else: - dest = Path(os.path.abspath(str(value))).resolve() # on Windows absolute does not imply resolve so use both - value = dest - while dest: - if dest.exists(): - if os.access(ensure_text(str(dest)), os.W_OK): - break - else: - non_write_able(dest, value) - base, _ = dest.parent, dest.name - if base == dest: - non_write_able(dest, value) # pragma: no cover - dest = base - return str(value) - - def run(self): - if self.dest.exists() and self.clear: - logging.debug("delete %s", self.dest) - safe_delete(self.dest) - self.create() - self.set_pyenv_cfg() - - def set_pyenv_cfg(self): - self.pyenv_cfg.content = OrderedDict() - self.pyenv_cfg["home"] = self.interpreter.system_exec_prefix - self.pyenv_cfg["implementation"] = self.interpreter.implementation - self.pyenv_cfg["version_info"] = ".".join(str(i) for i in self.interpreter.version_info) - self.pyenv_cfg["virtualenv"] = __version__ - - @property - def debug(self): - """ - :return: debug information about the virtual environment (only valid after :meth:`create` has run) - """ - if self._debug is None and self.exe is not None: - self._debug = get_env_debug_info(self.exe, self.debug_script(), self.app_data) - return self._debug - - # noinspection PyMethodMayBeStatic - def debug_script(self): - return DEBUG_SCRIPT - - -def get_env_debug_info(env_exe, debug_script, app_data): - env = os.environ.copy() - env.pop(str("PYTHONPATH"), None) - - with ensure_file_on_disk(debug_script, app_data) as debug_script: - cmd = [str(env_exe), str(debug_script)] - if WIN_CPYTHON_2: - cmd = [ensure_text(i) for i in cmd] - logging.debug(str("debug via %r"), LogCmd(cmd)) - code, out, err = run_cmd(cmd) - - # noinspection PyBroadException - try: - if code != 0: - result = literal_eval(out) - else: - result = json.loads(out) - if err: - result["err"] = err - except Exception as exception: - return {"out": out, "err": err, "returncode": code, "exception": repr(exception)} - if "sys" in result and "path" in result["sys"]: - del result["sys"]["path"][0] - return result
