summaryrefslogtreecommitdiff
path: root/src/virtualenv
diff options
context:
space:
mode:
authorSorin Sbarnea <ssbarnea@users.noreply.github.com>2020-02-13 16:58:29 +0000
committerGitHub <noreply@github.com>2020-02-13 16:58:29 +0000
commit52e4213096eba07ce71c14f36135172ea4c4a192 (patch)
tree56d53352267104929284264cfa0080602d91208b /src/virtualenv
parent5fcbab226f71611765f113cde639a932c712073a (diff)
downloadvirtualenv-52e4213096eba07ce71c14f36135172ea4c4a192.tar.gz
Lower min version of six to 1.9 (#1606)
This change should allow installation of virtualenv on systems with older six where their LTS support may prevent them from upgrading it.
Diffstat (limited to 'src/virtualenv')
-rw-r--r--src/virtualenv/__main__.py6
-rw-r--r--src/virtualenv/activation/activator.py4
-rw-r--r--src/virtualenv/activation/python/__init__.py7
-rw-r--r--src/virtualenv/activation/via_template.py12
-rw-r--r--src/virtualenv/config/env_var.py6
-rw-r--r--src/virtualenv/config/ini.py5
-rw-r--r--src/virtualenv/create/creator.py12
-rw-r--r--src/virtualenv/create/describe.py3
-rw-r--r--src/virtualenv/create/via_global_ref/builtin/cpython/cpython2.py4
-rw-r--r--src/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py4
-rw-r--r--src/virtualenv/create/via_global_ref/builtin/pypy/common.py4
-rw-r--r--src/virtualenv/create/via_global_ref/builtin/pypy/pypy2.py4
-rw-r--r--src/virtualenv/create/via_global_ref/builtin/pypy/pypy3.py4
-rw-r--r--src/virtualenv/create/via_global_ref/builtin/python2/python2.py9
-rw-r--r--src/virtualenv/create/via_global_ref/builtin/ref.py3
-rw-r--r--src/virtualenv/discovery/builtin.py9
-rw-r--r--src/virtualenv/discovery/cached_py_info.py3
-rw-r--r--src/virtualenv/discovery/discover.py4
-rw-r--r--src/virtualenv/discovery/py_spec.py5
-rw-r--r--src/virtualenv/pyenv_cfg.py4
-rw-r--r--src/virtualenv/report.py4
-rw-r--r--src/virtualenv/seed/embed/base_embed.py11
-rw-r--r--src/virtualenv/seed/embed/wheels/acquire.py7
-rw-r--r--src/virtualenv/seed/seeder.py4
-rw-r--r--src/virtualenv/seed/via_app_data/pip_install/base.py17
-rw-r--r--src/virtualenv/seed/via_app_data/pip_install/copy.py7
-rw-r--r--src/virtualenv/seed/via_app_data/pip_install/symlink.py15
-rw-r--r--src/virtualenv/seed/via_app_data/via_app_data.py5
-rw-r--r--src/virtualenv/session.py6
-rw-r--r--src/virtualenv/util/path/_pathlib/via_os_path.py12
-rw-r--r--src/virtualenv/util/path/_sync.py3
-rw-r--r--src/virtualenv/util/six.py50
-rw-r--r--src/virtualenv/util/zipapp.py5
33 files changed, 149 insertions, 109 deletions
diff --git a/src/virtualenv/__main__.py b/src/virtualenv/__main__.py
index 38fee15..d1c02ee 100644
--- a/src/virtualenv/__main__.py
+++ b/src/virtualenv/__main__.py
@@ -5,7 +5,7 @@ import logging
import sys
from datetime import datetime
-import six
+from virtualenv.util.six import ensure_text
def run(args=None, options=None):
@@ -20,8 +20,8 @@ def run(args=None, options=None):
logging.warning(
"created virtual environment in %.0fms %s with seeder %s",
(datetime.now() - start).total_seconds() * 1000,
- six.ensure_text(str(session.creator)),
- six.ensure_text(str(session.seeder)),
+ ensure_text(str(session.creator)),
+ ensure_text(str(session.seeder)),
)
except ProcessCallFailed as exception:
print("subprocess call failed for {}".format(exception.cmd))
diff --git a/src/virtualenv/activation/activator.py b/src/virtualenv/activation/activator.py
index 728fa7e..587ac10 100644
--- a/src/virtualenv/activation/activator.py
+++ b/src/virtualenv/activation/activator.py
@@ -2,10 +2,10 @@ from __future__ import absolute_import, unicode_literals
from abc import ABCMeta, abstractmethod
-import six
+from six import add_metaclass
-@six.add_metaclass(ABCMeta)
+@add_metaclass(ABCMeta)
class Activator(object):
"""Generates an activate script for the virtual environment"""
diff --git a/src/virtualenv/activation/python/__init__.py b/src/virtualenv/activation/python/__init__.py
index 1376243..8736791 100644
--- a/src/virtualenv/activation/python/__init__.py
+++ b/src/virtualenv/activation/python/__init__.py
@@ -3,10 +3,9 @@ from __future__ import absolute_import, unicode_literals
import os
from collections import OrderedDict
-import six
-
from virtualenv.info import WIN_CPYTHON_2
from virtualenv.util.path import Path
+from virtualenv.util.six import ensure_text
from ..via_template import ViaTemplateActivator
@@ -20,7 +19,7 @@ class PythonActivator(ViaTemplateActivator):
lib_folders = OrderedDict((os.path.relpath(str(i), str(dest_folder)), None) for i in creator.libs)
replacements.update(
{
- "__LIB_FOLDERS__": six.ensure_text(os.pathsep.join(lib_folders.keys())),
+ "__LIB_FOLDERS__": ensure_text(os.pathsep.join(lib_folders.keys())),
"__DECODE_PATH__": ("yes" if WIN_CPYTHON_2 else ""),
}
)
@@ -30,5 +29,5 @@ class PythonActivator(ViaTemplateActivator):
def _repr_unicode(creator, value):
py2 = creator.interpreter.version_info.major == 2
if py2: # on Python 2 we need to encode this into explicit utf-8, py3 supports unicode literals
- value = six.ensure_text(repr(value.encode("utf-8"))[1:-1])
+ value = ensure_text(repr(value.encode("utf-8"))[1:-1])
return value
diff --git a/src/virtualenv/activation/via_template.py b/src/virtualenv/activation/via_template.py
index d9d0a14..651ed8f 100644
--- a/src/virtualenv/activation/via_template.py
+++ b/src/virtualenv/activation/via_template.py
@@ -4,7 +4,9 @@ import os
import sys
from abc import ABCMeta, abstractmethod
-import six
+from six import add_metaclass
+
+from virtualenv.util.six import ensure_text
from .activator import Activator
@@ -14,7 +16,7 @@ else:
from importlib_resources import read_text
-@six.add_metaclass(ABCMeta)
+@add_metaclass(ABCMeta)
class ViaTemplateActivator(Activator):
@abstractmethod
def templates(self):
@@ -30,10 +32,10 @@ class ViaTemplateActivator(Activator):
def replacements(self, creator, dest_folder):
return {
"__VIRTUAL_PROMPT__": "" if self.flag_prompt is None else self.flag_prompt,
- "__VIRTUAL_ENV__": six.ensure_text(str(creator.dest)),
+ "__VIRTUAL_ENV__": ensure_text(str(creator.dest)),
"__VIRTUAL_NAME__": creator.env_name,
- "__BIN_NAME__": six.ensure_text(str(creator.bin_dir.relative_to(creator.dest))),
- "__PATH_SEP__": six.ensure_text(os.pathsep),
+ "__BIN_NAME__": ensure_text(str(creator.bin_dir.relative_to(creator.dest))),
+ "__PATH_SEP__": ensure_text(os.pathsep),
}
def _generate(self, replacements, templates, to_folder, creator):
diff --git a/src/virtualenv/config/env_var.py b/src/virtualenv/config/env_var.py
index e42142d..259399a 100644
--- a/src/virtualenv/config/env_var.py
+++ b/src/virtualenv/config/env_var.py
@@ -2,7 +2,7 @@ from __future__ import absolute_import, unicode_literals
import os
-import six
+from virtualenv.util.six import ensure_str, ensure_text
from .convert import convert
@@ -14,12 +14,12 @@ def get_env_var(key, as_type):
:param as_type: the type we would like to convert it to
:return:
"""
- environ_key = six.ensure_str("VIRTUALENV_{}".format(key.upper()))
+ environ_key = ensure_str("VIRTUALENV_{}".format(key.upper()))
if os.environ.get(environ_key):
value = os.environ[environ_key]
# noinspection PyBroadException
try:
- source = "env var {}".format(six.ensure_text(environ_key))
+ source = "env var {}".format(ensure_text(environ_key))
as_type = convert(value, as_type, source)
return as_type, source
except Exception: # note the converter already logs a warning when failures happen
diff --git a/src/virtualenv/config/ini.py b/src/virtualenv/config/ini.py
index 8839607..c910375 100644
--- a/src/virtualenv/config/ini.py
+++ b/src/virtualenv/config/ini.py
@@ -3,18 +3,17 @@ from __future__ import absolute_import, unicode_literals
import logging
import os
-import six
-
from virtualenv.dirs import default_config_dir
from virtualenv.info import PY3
from virtualenv.util import ConfigParser
from virtualenv.util.path import Path
+from virtualenv.util.six import ensure_str
from .convert import convert
class IniConfig(object):
- VIRTUALENV_CONFIG_FILE_ENV_VAR = six.ensure_str("VIRTUALENV_CONFIG_FILE")
+ VIRTUALENV_CONFIG_FILE_ENV_VAR = ensure_str("VIRTUALENV_CONFIG_FILE")
STATE = {None: "failed to parse", True: "active", False: "missing"}
section = "virtualenv"
diff --git a/src/virtualenv/create/creator.py b/src/virtualenv/create/creator.py
index cf46804..1546940 100644
--- a/src/virtualenv/create/creator.py
+++ b/src/virtualenv/create/creator.py
@@ -11,13 +11,13 @@ from ast import literal_eval
from collections import OrderedDict
from stat import S_IWUSR
-import six
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
+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__
@@ -43,14 +43,14 @@ class Creator(object):
self.pyenv_cfg = PyEnvCfg.from_folder(self.dest)
def __repr__(self):
- return six.ensure_str(self.__unicode__())
+ 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", six.ensure_text(str(self.dest))),
+ ("dest", ensure_text(str(self.dest))),
("clear", self.clear),
]
@@ -103,7 +103,7 @@ class Creator(object):
encoding = sys.getfilesystemencoding()
refused = OrderedDict()
kwargs = {"errors": "ignore"} if encoding != "mbcs" else {}
- for char in six.ensure_text(raw_value):
+ for char in ensure_text(raw_value):
try:
trip = char.encode(encoding, **kwargs).decode(encoding)
if trip == char:
@@ -135,7 +135,7 @@ class Creator(object):
value = dest
while dest:
if dest.exists():
- if os.access(six.ensure_text(str(dest)), os.W_OK):
+ if os.access(ensure_text(str(dest)), os.W_OK):
break
else:
non_write_able(dest, value)
@@ -188,7 +188,7 @@ def get_env_debug_info(env_exe, debug_script):
with ensure_file_on_disk(debug_script) as debug_script:
cmd = [str(env_exe), str(debug_script)]
if WIN_CPYTHON_2:
- cmd = [six.ensure_text(i) for i in cmd]
+ cmd = [ensure_text(i) for i in cmd]
logging.debug(str("debug via %r"), LogCmd(cmd))
code, out, err = run_cmd(cmd)
diff --git a/src/virtualenv/create/describe.py b/src/virtualenv/create/describe.py
index b2686a6..526ec86 100644
--- a/src/virtualenv/create/describe.py
+++ b/src/virtualenv/create/describe.py
@@ -3,10 +3,11 @@ from __future__ import absolute_import, print_function, unicode_literals
from abc import ABCMeta
from collections import OrderedDict
-from six import add_metaclass, ensure_text
+from six import add_metaclass
from virtualenv.info import IS_WIN
from virtualenv.util.path import Path
+from virtualenv.util.six import ensure_text
@add_metaclass(ABCMeta)
diff --git a/src/virtualenv/create/via_global_ref/builtin/cpython/cpython2.py b/src/virtualenv/create/via_global_ref/builtin/cpython/cpython2.py
index cd791f4..a9bd52c 100644
--- a/src/virtualenv/create/via_global_ref/builtin/cpython/cpython2.py
+++ b/src/virtualenv/create/via_global_ref/builtin/cpython/cpython2.py
@@ -3,7 +3,7 @@ from __future__ import absolute_import, unicode_literals
import abc
import logging
-import six
+from six import add_metaclass
from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest
from virtualenv.util.path import Path
@@ -12,7 +12,7 @@ from ..python2.python2 import Python2
from .common import CPython, CPythonPosix, CPythonWindows
-@six.add_metaclass(abc.ABCMeta)
+@add_metaclass(abc.ABCMeta)
class CPython2(CPython, Python2):
"""Create a CPython version 2 virtual environment"""
diff --git a/src/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py b/src/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py
index 5d89f1f..a6639c2 100644
--- a/src/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py
+++ b/src/virtualenv/create/via_global_ref/builtin/cpython/cpython3.py
@@ -2,7 +2,7 @@ from __future__ import absolute_import, unicode_literals
import abc
-import six
+from six import add_metaclass
from virtualenv.create.describe import Python3Supports
from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest
@@ -11,7 +11,7 @@ from virtualenv.util.path import Path
from .common import CPython, CPythonPosix, CPythonWindows
-@six.add_metaclass(abc.ABCMeta)
+@add_metaclass(abc.ABCMeta)
class CPython3(CPython, Python3Supports):
""""""
diff --git a/src/virtualenv/create/via_global_ref/builtin/pypy/common.py b/src/virtualenv/create/via_global_ref/builtin/pypy/common.py
index c5bc849..9577ba4 100644
--- a/src/virtualenv/create/via_global_ref/builtin/pypy/common.py
+++ b/src/virtualenv/create/via_global_ref/builtin/pypy/common.py
@@ -2,7 +2,7 @@ from __future__ import absolute_import, unicode_literals
import abc
-import six
+from six import add_metaclass
from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest
from virtualenv.util.path import Path
@@ -10,7 +10,7 @@ from virtualenv.util.path import Path
from ..via_global_self_do import ViaGlobalRefVirtualenvBuiltin
-@six.add_metaclass(abc.ABCMeta)
+@add_metaclass(abc.ABCMeta)
class PyPy(ViaGlobalRefVirtualenvBuiltin):
@classmethod
def can_describe(cls, interpreter):
diff --git a/src/virtualenv/create/via_global_ref/builtin/pypy/pypy2.py b/src/virtualenv/create/via_global_ref/builtin/pypy/pypy2.py
index c00ff4f..c3a9171 100644
--- a/src/virtualenv/create/via_global_ref/builtin/pypy/pypy2.py
+++ b/src/virtualenv/create/via_global_ref/builtin/pypy/pypy2.py
@@ -3,7 +3,7 @@ from __future__ import absolute_import, unicode_literals
import abc
import logging
-import six
+from six import add_metaclass
from virtualenv.create.describe import PosixSupports, WindowsSupports
from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest
@@ -13,7 +13,7 @@ from ..python2.python2 import Python2
from .common import PyPy
-@six.add_metaclass(abc.ABCMeta)
+@add_metaclass(abc.ABCMeta)
class PyPy2(PyPy, Python2):
""""""
diff --git a/src/virtualenv/create/via_global_ref/builtin/pypy/pypy3.py b/src/virtualenv/create/via_global_ref/builtin/pypy/pypy3.py
index a6d64f8..9588706 100644
--- a/src/virtualenv/create/via_global_ref/builtin/pypy/pypy3.py
+++ b/src/virtualenv/create/via_global_ref/builtin/pypy/pypy3.py
@@ -2,7 +2,7 @@ from __future__ import absolute_import, unicode_literals
import abc
-import six
+from six import add_metaclass
from virtualenv.create.describe import PosixSupports, Python3Supports, WindowsSupports
from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest
@@ -11,7 +11,7 @@ from virtualenv.util.path import Path
from .common import PyPy
-@six.add_metaclass(abc.ABCMeta)
+@add_metaclass(abc.ABCMeta)
class PyPy3(PyPy, Python3Supports):
@classmethod
def exe_stem(cls):
diff --git a/src/virtualenv/create/via_global_ref/builtin/python2/python2.py b/src/virtualenv/create/via_global_ref/builtin/python2/python2.py
index 621c68e..e917ca5 100644
--- a/src/virtualenv/create/via_global_ref/builtin/python2/python2.py
+++ b/src/virtualenv/create/via_global_ref/builtin/python2/python2.py
@@ -4,12 +4,13 @@ import abc
import json
import os
-import six
+from six import add_metaclass
from virtualenv.create.describe import Python2Supports
from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest
from virtualenv.info import IS_ZIPAPP
from virtualenv.util.path import Path
+from virtualenv.util.six import ensure_text
from virtualenv.util.zipapp import read as read_from_zipapp
from ..via_global_self_do import ViaGlobalRefVirtualenvBuiltin
@@ -17,7 +18,7 @@ from ..via_global_self_do import ViaGlobalRefVirtualenvBuiltin
HERE = Path(os.path.abspath(__file__)).parent
-@six.add_metaclass(abc.ABCMeta)
+@add_metaclass(abc.ABCMeta)
class Python2(ViaGlobalRefVirtualenvBuiltin, Python2Supports):
def create(self):
"""Perform operations needed to make the created environment work on Python 2"""
@@ -30,9 +31,7 @@ class Python2(ViaGlobalRefVirtualenvBuiltin, Python2Supports):
custom_site_text = read_from_zipapp(custom_site)
else:
custom_site_text = custom_site.read_text()
- expected = json.dumps(
- [os.path.relpath(six.ensure_text(str(i)), six.ensure_text(str(site_py))) for i in self.libs]
- )
+ expected = json.dumps([os.path.relpath(ensure_text(str(i)), ensure_text(str(site_py))) for i in self.libs])
site_py.write_text(custom_site_text.replace("___EXPECTED_SITE_PACKAGES___", expected))
@classmethod
diff --git a/src/virtualenv/create/via_global_ref/builtin/ref.py b/src/virtualenv/create/via_global_ref/builtin/ref.py
index 0c9c361..d75e3d7 100644
--- a/src/virtualenv/create/via_global_ref/builtin/ref.py
+++ b/src/virtualenv/create/via_global_ref/builtin/ref.py
@@ -5,10 +5,11 @@ from abc import ABCMeta, abstractmethod
from collections import OrderedDict
from stat import S_IXGRP, S_IXOTH, S_IXUSR
-from six import add_metaclass, ensure_text
+from six import add_metaclass
from virtualenv.info import PY3, fs_is_case_sensitive, fs_supports_symlink
from virtualenv.util.path import copy, link, make_exe, symlink
+from virtualenv.util.six import ensure_text
@add_metaclass(ABCMeta)
diff --git a/src/virtualenv/discovery/builtin.py b/src/virtualenv/discovery/builtin.py
index c5f4883..fc8eca3 100644
--- a/src/virtualenv/discovery/builtin.py
+++ b/src/virtualenv/discovery/builtin.py
@@ -4,9 +4,8 @@ import logging
import os
import sys
-import six
-
from virtualenv.info import IS_WIN
+from virtualenv.util.six import ensure_str, ensure_text
from .discover import Discover
from .py_info import PythonInfo
@@ -33,7 +32,7 @@ class Builtin(Discover):
return get_interpreter(self.python_spec)
def __repr__(self):
- return six.ensure_str(self.__unicode__())
+ return ensure_str(self.__unicode__())
def __unicode__(self):
return "{} discover of python_spec={!r}".format(self.__class__.__name__, self.python_spec)
@@ -73,7 +72,7 @@ def propose_interpreters(spec):
# find on path, the path order matters (as the candidates are less easy to control by end user)
tested_exes = set()
for pos, path in enumerate(paths):
- path = six.ensure_text(path)
+ path = ensure_text(path)
logging.debug(LazyPathDump(pos, path))
for candidate, match in possible_specs(spec):
found = check_path(candidate, path)
@@ -106,7 +105,7 @@ class LazyPathDump(object):
self.path = path
def __repr__(self):
- return six.ensure_str(self.__unicode__())
+ return ensure_str(self.__unicode__())
def __unicode__(self):
content = "discover PATH[{}]={}".format(self.pos, self.path)
diff --git a/src/virtualenv/discovery/cached_py_info.py b/src/virtualenv/discovery/cached_py_info.py
index 7e28018..29b34f8 100644
--- a/src/virtualenv/discovery/cached_py_info.py
+++ b/src/virtualenv/discovery/cached_py_info.py
@@ -14,12 +14,11 @@ import sys
from collections import OrderedDict
from hashlib import sha256
-from six import ensure_text
-
from virtualenv.dirs import default_data_dir
from virtualenv.discovery.py_info import PythonInfo
from virtualenv.info import PY2, PY3
from virtualenv.util.path import Path
+from virtualenv.util.six import ensure_text
from virtualenv.util.subprocess import Popen, subprocess
from virtualenv.util.zipapp import ensure_file_on_disk
from virtualenv.version import __version__
diff --git a/src/virtualenv/discovery/discover.py b/src/virtualenv/discovery/discover.py
index 17d404e..93c3ea7 100644
--- a/src/virtualenv/discovery/discover.py
+++ b/src/virtualenv/discovery/discover.py
@@ -2,10 +2,10 @@ from __future__ import absolute_import, unicode_literals
from abc import ABCMeta, abstractmethod
-import six
+from six import add_metaclass
-@six.add_metaclass(ABCMeta)
+@add_metaclass(ABCMeta)
class Discover(object):
"""Discover and provide the requested Python interpreter"""
diff --git a/src/virtualenv/discovery/py_spec.py b/src/virtualenv/discovery/py_spec.py
index ac92c3b..fc9f100 100644
--- a/src/virtualenv/discovery/py_spec.py
+++ b/src/virtualenv/discovery/py_spec.py
@@ -6,9 +6,8 @@ import re
import sys
from collections import OrderedDict
-import six
-
from virtualenv.info import fs_is_case_sensitive
+from virtualenv.util.six import ensure_str
PATTERN = re.compile(r"^(?P<impl>[a-zA-Z]+)?(?P<version>[0-9.]+)?(?:-(?P<arch>32|64))?$")
IS_WIN = sys.platform == "win32"
@@ -120,4 +119,4 @@ class PythonSpec(object):
)
def __repr__(self):
- return six.ensure_str(self.__unicode__())
+ return ensure_str(self.__unicode__())
diff --git a/src/virtualenv/pyenv_cfg.py b/src/virtualenv/pyenv_cfg.py
index 8388208..1a8d824 100644
--- a/src/virtualenv/pyenv_cfg.py
+++ b/src/virtualenv/pyenv_cfg.py
@@ -3,7 +3,7 @@ from __future__ import absolute_import, unicode_literals
import logging
from collections import OrderedDict
-import six
+from virtualenv.util.six import ensure_text
class PyEnvCfg(object):
@@ -31,7 +31,7 @@ class PyEnvCfg(object):
return content
def write(self):
- logging.debug("write %s", six.ensure_text(str(self.path)))
+ logging.debug("write %s", ensure_text(str(self.path)))
text = ""
for key, value in self.content.items():
line = "{} = {}".format(key, value)
diff --git a/src/virtualenv/report.py b/src/virtualenv/report.py
index bdcc6c3..e03ccf9 100644
--- a/src/virtualenv/report.py
+++ b/src/virtualenv/report.py
@@ -3,7 +3,7 @@ from __future__ import absolute_import, unicode_literals
import logging
import sys
-import six
+from virtualenv.util.six import ensure_str
LEVELS = {
0: logging.CRITICAL,
@@ -33,7 +33,7 @@ def setup_report(verbose, quiet):
else:
filelock_logger.setLevel(logging.WARN)
- formatter = logging.Formatter(six.ensure_str(msg_format))
+ formatter = logging.Formatter(ensure_str(msg_format))
stream_handler = logging.StreamHandler(stream=sys.stdout)
stream_handler.setLevel(level)
LOGGER.setLevel(logging.NOTSET)
diff --git a/src/virtualenv/seed/embed/base_embed.py b/src/virtualenv/seed/embed/base_embed.py
index b93fff6..708b56a 100644
--- a/src/virtualenv/seed/embed/base_embed.py
+++ b/src/virtualenv/seed/embed/base_embed.py
@@ -2,14 +2,15 @@ from __future__ import absolute_import, unicode_literals
from abc import ABCMeta
-import six
+from six import add_metaclass
from virtualenv.util.path import Path
+from virtualenv.util.six import ensure_str, ensure_text
from ..seeder import Seeder
-@six.add_metaclass(ABCMeta)
+@add_metaclass(ABCMeta)
class BaseEmbed(Seeder):
packages = ["pip", "setuptools", "wheel"]
@@ -80,9 +81,7 @@ class BaseEmbed(Seeder):
def __unicode__(self):
result = self.__class__.__name__
if self.extra_search_dir:
- result += " extra search dirs = {}".format(
- ", ".join(six.ensure_text(str(i)) for i in self.extra_search_dir)
- )
+ result += " extra search dirs = {}".format(", ".join(ensure_text(str(i)) for i in self.extra_search_dir))
for package in self.packages:
result += " {}{}".format(
package, "={}".format(getattr(self, "{}_version".format(package), None) or "latest")
@@ -90,4 +89,4 @@ class BaseEmbed(Seeder):
return result
def __repr__(self):
- return six.ensure_str(self.__unicode__())
+ return ensure_str(self.__unicode__())
diff --git a/src/virtualenv/seed/embed/wheels/acquire.py b/src/virtualenv/seed/embed/wheels/acquire.py
index 180e1db..3be475f 100644
--- a/src/virtualenv/seed/embed/wheels/acquire.py
+++ b/src/virtualenv/seed/embed/wheels/acquire.py
@@ -10,10 +10,9 @@ from copy import copy
from shutil import copy2
from zipfile import ZipFile
-import six
-
from virtualenv.info import IS_ZIPAPP
from virtualenv.util.path import Path
+from virtualenv.util.six import ensure_str, ensure_text
from virtualenv.util.subprocess import Popen, subprocess
from virtualenv.util.zipapp import ensure_file_on_disk
@@ -85,7 +84,7 @@ def acquire_from_dir(packages, for_py_version, to_folder, extra_search_dir):
def wheel_support_py(filename, py_version):
name = "{}.dist-info/METADATA".format("-".join(filename.stem.split("-")[0:2]))
- with ZipFile(six.ensure_text(str(filename)), "r") as zip_file:
+ with ZipFile(ensure_text(str(filename)), "r") as zip_file:
metadata = zip_file.read(name).decode("utf-8")
marker = "Requires-Python:"
requires = next(i[len(marker) :] for i in metadata.splitlines() if i.startswith(marker))
@@ -158,7 +157,7 @@ def pip_wheel_env_run(version):
env = os.environ.copy()
env.update(
{
- six.ensure_str(k): str(v) # python 2 requires these to be string only (non-unicode)
+ ensure_str(k): str(v) # python 2 requires these to be string only (non-unicode)
for k, v in {"PIP_USE_WHEEL": "1", "PIP_USER": "0", "PIP_NO_INPUT": "1"}.items()
}
)
diff --git a/src/virtualenv/seed/seeder.py b/src/virtualenv/seed/seeder.py
index 52b065d..5ed5e5a 100644
--- a/src/virtualenv/seed/seeder.py
+++ b/src/virtualenv/seed/seeder.py
@@ -2,10 +2,10 @@ from __future__ import absolute_import, unicode_literals
from abc import ABCMeta, abstractmethod
-import six
+from six import add_metaclass
-@six.add_metaclass(ABCMeta)
+@add_metaclass(ABCMeta)
class Seeder(object):
"""A seeder will install some seed packages into a virtual environment."""
diff --git a/src/virtualenv/seed/via_app_data/pip_install/base.py b/src/virtualenv/seed/via_app_data/pip_install/base.py
index 49493fa..2f32a7c 100644
--- a/src/virtualenv/seed/via_app_data/pip_install/base.py
+++ b/src/virtualenv/seed/via_app_data/pip_install/base.py
@@ -8,14 +8,14 @@ import zipfile
from abc import ABCMeta, abstractmethod
from tempfile import mkdtemp
-import six
-from six import PY3
+from six import PY3, add_metaclass
from virtualenv.util import ConfigParser
from virtualenv.util.path import Path
+from virtualenv.util.six import ensure_text
-@six.add_metaclass(ABCMeta)
+@add_metaclass(ABCMeta)
class PipInstall(object):
def __init__(self, wheel, creator, image_folder):
self._wheel = wheel
@@ -60,8 +60,7 @@ class PipInstall(object):
def _records_text(self, files):
record_data = "\n".join(
- "{},,".format(os.path.relpath(six.ensure_text(str(rec)), six.ensure_text(str(self._image_dir))))
- for rec in files
+ "{},,".format(os.path.relpath(ensure_text(str(rec)), ensure_text(str(self._image_dir)))) for rec in files
)
return record_data
@@ -77,12 +76,10 @@ class PipInstall(object):
folder = mkdtemp()
try:
to_folder = Path(folder)
- rel = os.path.relpath(
- six.ensure_text(str(self._creator.script_dir)), six.ensure_text(str(self._creator.purelib))
- )
+ rel = os.path.relpath(ensure_text(str(self._creator.script_dir)), ensure_text(str(self._creator.purelib)))
for name, module in self._console_scripts.items():
new_files.update(
- Path(os.path.normpath(six.ensure_text(str(self._image_dir / rel / i.name))))
+ Path(os.path.normpath(ensure_text(str(self._image_dir / rel / i.name))))
for i in self._create_console_entry_point(name, module, to_folder)
)
finally:
@@ -142,7 +139,7 @@ class PipInstall(object):
def clear(self):
if self._image_dir.exists():
- shutil.rmtree(six.ensure_text(str(self._image_dir)))
+ shutil.rmtree(ensure_text(str(self._image_dir)))
def has_image(self):
return self._image_dir.exists() and next(self._image_dir.iterdir()) is not None
diff --git a/src/virtualenv/seed/via_app_data/pip_install/copy.py b/src/virtualenv/seed/via_app_data/pip_install/copy.py
index 1b76edb..29d0bc8 100644
--- a/src/virtualenv/seed/via_app_data/pip_install/copy.py
+++ b/src/virtualenv/seed/via_app_data/pip_install/copy.py
@@ -2,9 +2,8 @@ from __future__ import absolute_import, unicode_literals
import os
-import six
-
from virtualenv.util.path import Path, copy
+from virtualenv.util.six import ensure_text
from .base import PipInstall
@@ -22,7 +21,7 @@ class CopyPipInstall(PipInstall):
def _cache_files(self):
version = self._creator.interpreter.version_info
py_c_ext = ".{}-{}{}.pyc".format(self._creator.interpreter.implementation.lower(), version.major, version.minor)
- for root, dirs, files in os.walk(six.ensure_text(str(self._image_dir)), topdown=True):
+ for root, dirs, files in os.walk(ensure_text(str(self._image_dir)), topdown=True):
root_path = Path(root)
for name in files:
if name.endswith(".py"):
@@ -32,5 +31,5 @@ class CopyPipInstall(PipInstall):
def _fix_records(self, new_files):
extra_record_data_str = self._records_text(new_files)
- with open(six.ensure_text(str(self._dist_info / "RECORD")), "ab") as file_handler:
+ with open(ensure_text(str(self._dist_info / "RECORD")), "ab") as file_handler:
file_handler.write(extra_record_data_str.encode("utf-8"))
diff --git a/src/virtualenv/seed/via_app_data/pip_install/symlink.py b/src/virtualenv/seed/via_app_data/pip_install/symlink.py
index 1d1a52e..578af0c 100644
--- a/src/virtualenv/seed/via_app_data/pip_install/symlink.py
+++ b/src/virtualenv/seed/via_app_data/pip_install/symlink.py
@@ -5,8 +5,7 @@ import shutil
import subprocess
from stat import S_IREAD, S_IRGRP, S_IROTH, S_IWUSR
-import six
-
+from virtualenv.util.six import ensure_text
from virtualenv.util.subprocess import Popen
from .base import PipInstall
@@ -14,14 +13,14 @@ from .base import PipInstall
class SymlinkPipInstall(PipInstall):
def _sync(self, src, dst):
- src_str = six.ensure_text(str(src))
- dest_str = six.ensure_text(str(dst))
+ src_str = ensure_text(str(src))
+ dest_str = ensure_text(str(dst))
os.symlink(src_str, dest_str)
def _generate_new_files(self):
# create the pyc files, as the build image will be R/O
process = Popen(
- [six.ensure_text(str(self._creator.exe)), "-m", "compileall", six.ensure_text(str(self._image_dir))],
+ [ensure_text(str(self._creator.exe)), "-m", "compileall", ensure_text(str(self._image_dir))],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
@@ -32,7 +31,7 @@ class SymlinkPipInstall(PipInstall):
if root_py_cache.exists():
new_files.update(root_py_cache.iterdir())
new_files.add(root_py_cache)
- shutil.rmtree(six.ensure_text(str(root_py_cache)))
+ shutil.rmtree(ensure_text(str(root_py_cache)))
core_new_files = super(SymlinkPipInstall, self)._generate_new_files()
# remove files that are within the image folder deeper than one level (as these will be not linked directly)
for file in core_new_files:
@@ -48,7 +47,7 @@ class SymlinkPipInstall(PipInstall):
def _fix_records(self, new_files):
new_files.update(i for i in self._image_dir.iterdir())
extra_record_data_str = self._records_text(sorted(new_files, key=str))
- with open(six.ensure_text(str(self._dist_info / "RECORD")), "wb") as file_handler:
+ with open(ensure_text(str(self._dist_info / "RECORD")), "wb") as file_handler:
file_handler.write(extra_record_data_str.encode("utf-8"))
def build_image(self):
@@ -63,6 +62,6 @@ class SymlinkPipInstall(PipInstall):
@staticmethod
def _set_tree(folder, stat):
- for root, _, files in os.walk(six.ensure_text(str(folder))):
+ for root, _, files in os.walk(ensure_text(str(folder))):
for filename in files:
os.chmod(os.path.join(root, filename), stat)
diff --git a/src/virtualenv/seed/via_app_data/via_app_data.py b/src/virtualenv/seed/via_app_data/via_app_data.py
index 62bcb28..e8b80d7 100644
--- a/src/virtualenv/seed/via_app_data/via_app_data.py
+++ b/src/virtualenv/seed/via_app_data/via_app_data.py
@@ -6,12 +6,11 @@ import shutil
from contextlib import contextmanager
from threading import Lock, Thread
-import six
-
from virtualenv.dirs import default_data_dir
from virtualenv.info import fs_supports_symlink
from virtualenv.seed.embed.base_embed import BaseEmbed
from virtualenv.seed.embed.wheels.acquire import get_wheels
+from virtualenv.util.six import ensure_text
from .pip_install.copy import CopyPipInstall
from .pip_install.symlink import SymlinkPipInstall
@@ -74,7 +73,7 @@ class FromAppData(BaseEmbed):
with base_cache.lock_for_key("wheels"):
wheels_to = base_cache.path / "wheels"
if self.clear and wheels_to.exists():
- shutil.rmtree(six.ensure_text(str(wheels_to)))
+ shutil.rmtree(ensure_text(str(wheels_to)))
wheels_to.mkdir(parents=True, exist_ok=True)
name_to_whl, lock = {}, Lock()
diff --git a/src/virtualenv/session.py b/src/virtualenv/session.py
index 9e79966..ffd0c07 100644
--- a/src/virtualenv/session.py
+++ b/src/virtualenv/session.py
@@ -3,7 +3,7 @@ from __future__ import absolute_import, unicode_literals
import json
import logging
-import six
+from virtualenv.util.six import ensure_text
class Session(object):
@@ -48,7 +48,7 @@ class Session(object):
self.creator.pyenv_cfg.write()
def _create(self):
- logging.info("create virtual environment via %s", six.ensure_text(str(self.creator)))
+ logging.info("create virtual environment via %s", ensure_text(str(self.creator)))
self.creator.run()
logging.debug(_DEBUG_MARKER)
logging.debug("%s", _Debug(self.creator))
@@ -77,7 +77,7 @@ class _Debug(object):
self.creator = creator
def __unicode__(self):
- return six.ensure_text(repr(self))
+ return ensure_text(repr(self))
def __repr__(self):
return json.dumps(self.creator.debug, indent=2)
diff --git a/src/virtualenv/util/path/_pathlib/via_os_path.py b/src/virtualenv/util/path/_pathlib/via_os_path.py
index 56315c1..6ce7b43 100644
--- a/src/virtualenv/util/path/_pathlib/via_os_path.py
+++ b/src/virtualenv/util/path/_pathlib/via_os_path.py
@@ -4,7 +4,7 @@ import os
import platform
from contextlib import contextmanager
-import six
+from virtualenv.util.six import ensure_str, ensure_text
IS_PYPY = platform.python_implementation() == "PyPy"
@@ -14,25 +14,25 @@ class Path(object):
if isinstance(path, Path):
_path = path._path
else:
- _path = six.ensure_text(path)
+ _path = ensure_text(path)
if IS_PYPY:
_path = _path.encode("utf-8")
self._path = _path
def __repr__(self):
- return six.ensure_str("Path({})".format(six.ensure_text(self._path)))
+ return ensure_str("Path({})".format(ensure_text(self._path)))
def __unicode__(self):
- return six.ensure_text(self._path)
+ return ensure_text(self._path)
def __str__(self):
- return six.ensure_str(self._path)
+ return ensure_str(self._path)
def __div__(self, other):
if isinstance(other, Path):
right = other._path
else:
- right = six.ensure_text(other)
+ right = ensure_text(other)
if IS_PYPY:
right = right.encode("utf-8")
return Path(os.path.join(self._path, right))
diff --git a/src/virtualenv/util/path/_sync.py b/src/virtualenv/util/path/_sync.py
index dcf040f..df687a9 100644
--- a/src/virtualenv/util/path/_sync.py
+++ b/src/virtualenv/util/path/_sync.py
@@ -4,9 +4,10 @@ import logging
import os
import shutil
-from six import PY2, PY3, ensure_text
+from six import PY2, PY3
from virtualenv.info import IS_CPYTHON, IS_WIN
+from virtualenv.util.six import ensure_text
if PY3:
from os import link as os_link
diff --git a/src/virtualenv/util/six.py b/src/virtualenv/util/six.py
new file mode 100644
index 0000000..16f1c6c
--- /dev/null
+++ b/src/virtualenv/util/six.py
@@ -0,0 +1,50 @@
+"""Backward compatibility layer with older version of six.
+
+This is used to avoid virtualenv requring a version of six newer than what
+the system may have.
+"""
+from __future__ import absolute_import
+
+from six import PY2, PY3, binary_type, text_type
+
+try:
+ from six import ensure_text
+except ImportError:
+
+ def ensure_text(s, encoding="utf-8", errors="strict"):
+ """Coerce *s* to six.text_type.
+ For Python 2:
+ - `unicode` -> `unicode`
+ - `str` -> `unicode`
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ if isinstance(s, binary_type):
+ return s.decode(encoding, errors)
+ elif isinstance(s, text_type):
+ return s
+ else:
+ raise TypeError("not expecting type '%s'" % type(s))
+
+
+try:
+ from six import ensure_str
+except ImportError:
+
+ def ensure_str(s, encoding="utf-8", errors="strict"):
+ """Coerce *s* to `str`.
+ For Python 2:
+ - `unicode` -> encoded to `str`
+ - `str` -> `str`
+ For Python 3:
+ - `str` -> `str`
+ - `bytes` -> decoded to `str`
+ """
+ if not isinstance(s, (text_type, binary_type)):
+ raise TypeError("not expecting type '%s'" % type(s))
+ if PY2 and isinstance(s, text_type):
+ s = s.encode(encoding, errors)
+ elif PY3 and isinstance(s, binary_type):
+ s = s.decode(encoding, errors)
+ return s
diff --git a/src/virtualenv/util/zipapp.py b/src/virtualenv/util/zipapp.py
index e8cb4cb..d6fe54c 100644
--- a/src/virtualenv/util/zipapp.py
+++ b/src/virtualenv/util/zipapp.py
@@ -5,10 +5,9 @@ import os
import zipfile
from contextlib import contextmanager
-import six
-
from virtualenv.dirs import default_data_dir
from virtualenv.info import IS_WIN, IS_ZIPAPP, ROOT
+from virtualenv.util.six import ensure_text
from virtualenv.version import __version__
@@ -25,7 +24,7 @@ def extract(full_path, dest):
with zipfile.ZipFile(ROOT, "r") as zip_file:
info = zip_file.getinfo(sub_file)
info.filename = dest.name
- zip_file.extract(info, six.ensure_text(str(dest.parent)))
+ zip_file.extract(info, ensure_text(str(dest.parent)))
def _get_path_within_zip(full_path):