Commit 89ef5bb7 authored by Jason R. Coombs's avatar Jason R. Coombs

Drop support for Python 2.6 by merging the drop-py26 branch. Fixes #878.

parents 45ec75be c6fe76cb
...@@ -2,7 +2,6 @@ dist: trusty ...@@ -2,7 +2,6 @@ dist: trusty
sudo: false sudo: false
language: python language: python
python: python:
- 2.6
- &latest_py2 2.7 - &latest_py2 2.7
- 3.3 - 3.3
- 3.4 - 3.4
......
v37.0.0
-------
* #878: Drop support for Python 2.6. Python 2.6 users should
rely on 'setuptools < 37dev'.
v36.8.0 v36.8.0
------- -------
......
...@@ -35,7 +35,7 @@ Please see the `setuptools PyPI page <https://pypi.python.org/pypi/setuptools>`_ ...@@ -35,7 +35,7 @@ Please see the `setuptools PyPI page <https://pypi.python.org/pypi/setuptools>`_
for download links and basic installation instructions for each of the for download links and basic installation instructions for each of the
supported platforms. supported platforms.
You will need at least Python 2.6. An ``easy_install`` script will be You will need at least Python 3.3 or 2.7. An ``easy_install`` script will be
installed in the normal location for Python scripts on your platform. installed in the normal location for Python scripts on your platform.
Note that the instructions on the setuptools PyPI page assume that you are Note that the instructions on the setuptools PyPI page assume that you are
...@@ -305,8 +305,7 @@ Regardless of the technique used, the script(s) will be installed to a Scripts ...@@ -305,8 +305,7 @@ Regardless of the technique used, the script(s) will be installed to a Scripts
directory (by default in the Python installation directory). It is recommended directory (by default in the Python installation directory). It is recommended
for EasyInstall that you ensure this directory is in the PATH environment for EasyInstall that you ensure this directory is in the PATH environment
variable. The easiest way to ensure the Scripts directory is in the PATH is variable. The easiest way to ensure the Scripts directory is in the PATH is
to run ``Tools\Scripts\win_add2path.py`` from the Python directory (requires to run ``Tools\Scripts\win_add2path.py`` from the Python directory.
Python 2.6 or later).
Note that instead of changing your ``PATH`` to include the Python scripts Note that instead of changing your ``PATH`` to include the Python scripts
directory, you can also retarget the installation location for scripts so they directory, you can also retarget the installation location for scripts so they
...@@ -987,21 +986,20 @@ The following section lists only the easiest and most relevant approaches [1]_. ...@@ -987,21 +986,20 @@ The following section lists only the easiest and most relevant approaches [1]_.
`Use "virtualenv"`_ `Use "virtualenv"`_
.. [1] There are older ways to achieve custom installation using various ``easy_install`` and ``setup.py install`` options, combined with ``PYTHONPATH`` and/or ``PYTHONUSERBASE`` alterations, but all of these are effectively deprecated by the User scheme brought in by `PEP-370`_ in Python 2.6. .. [1] There are older ways to achieve custom installation using various ``easy_install`` and ``setup.py install`` options, combined with ``PYTHONPATH`` and/or ``PYTHONUSERBASE`` alterations, but all of these are effectively deprecated by the User scheme brought in by `PEP-370`_.
.. _PEP-370: http://www.python.org/dev/peps/pep-0370/ .. _PEP-370: http://www.python.org/dev/peps/pep-0370/
Use the "--user" option Use the "--user" option
~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
With Python 2.6 came the User scheme for installation, which means that all Python provides a User scheme for installation, which means that all
python distributions support an alternative install location that is specific to a user [2]_ [3]_. python distributions support an alternative install location that is specific to a user [3]_.
The Default location for each OS is explained in the python documentation The Default location for each OS is explained in the python documentation
for the ``site.USER_BASE`` variable. This mode of installation can be turned on by for the ``site.USER_BASE`` variable. This mode of installation can be turned on by
specifying the ``--user`` option to ``setup.py install`` or ``easy_install``. specifying the ``--user`` option to ``setup.py install`` or ``easy_install``.
This approach serves the need to have a user-specific stash of packages. This approach serves the need to have a user-specific stash of packages.
.. [2] Prior to Python2.6, Mac OS X offered a form of the User scheme. That is now subsumed into the User scheme introduced in Python 2.6.
.. [3] Prior to the User scheme, there was the Home scheme, which is still available, but requires more effort than the User scheme to get packages recognized. .. [3] Prior to the User scheme, there was the Home scheme, which is still available, but requires more effort than the User scheme to get packages recognized.
Use the "--user" option and customize "PYTHONUSERBASE" Use the "--user" option and customize "PYTHONUSERBASE"
......
...@@ -110,7 +110,7 @@ the need to create a directory just to store one file. This option is ...@@ -110,7 +110,7 @@ the need to create a directory just to store one file. This option is
other metadata. (In fact, setuptools itself never generates other metadata. (In fact, setuptools itself never generates
``.egg-info`` files, either; the support for using files was added so ``.egg-info`` files, either; the support for using files was added so
that the requirement could easily be satisfied by other tools, such that the requirement could easily be satisfied by other tools, such
as the distutils in Python 2.5). as distutils).
In addition to the ``PKG-INFO`` file, an egg's metadata directory may In addition to the ``PKG-INFO`` file, an egg's metadata directory may
also include files and directories representing various forms of also include files and directories representing various forms of
......
...@@ -620,8 +620,8 @@ Requirements Parsing ...@@ -620,8 +620,8 @@ Requirements Parsing
The "markers" in a requirement are used to specify when a requirement The "markers" in a requirement are used to specify when a requirement
should be installed -- the requirement will be installed if the marker should be installed -- the requirement will be installed if the marker
evaluates as true in the current environment. For example, specifying evaluates as true in the current environment. For example, specifying
``argparse;python_version<"2.7"`` will not install in an Python 2.7 or 3.3 ``argparse;python_version<"3.0"`` will not install in an Python 3
environment, but will in a Python 2.6 environment. environment, but will in a Python 2 environment.
``Requirement`` Methods and Attributes ``Requirement`` Methods and Attributes
-------------------------------------- --------------------------------------
...@@ -1658,19 +1658,7 @@ PEP 302 Utilities ...@@ -1658,19 +1658,7 @@ PEP 302 Utilities
----------------- -----------------
``get_importer(path_item)`` ``get_importer(path_item)``
Retrieve a PEP 302 "importer" for the given path item (which need not A deprecated alias for ``pkgutil.get_importer()``
actually be on ``sys.path``). This routine simulates the PEP 302 protocol
for obtaining an "importer" object. It first checks for an importer for
the path item in ``sys.path_importer_cache``, and if not found it calls
each of the ``sys.path_hooks`` and caches the result if a good importer is
found. If no importer is found, this routine returns an ``ImpWrapper``
instance that wraps the builtin import machinery as a PEP 302-compliant
"importer" object. This ``ImpWrapper`` is *not* cached; instead a new
instance is returned each time.
(Note: When run under Python 2.5, this function is simply an alias for
``pkgutil.get_importer()``, and instead of ``pkg_resources.ImpWrapper``
instances, it may return ``pkgutil.ImpImporter`` instances.)
File/Path Utilities File/Path Utilities
......
...@@ -3,7 +3,7 @@ Building and Distributing Packages with Setuptools ...@@ -3,7 +3,7 @@ Building and Distributing Packages with Setuptools
================================================== ==================================================
``Setuptools`` is a collection of enhancements to the Python ``distutils`` ``Setuptools`` is a collection of enhancements to the Python ``distutils``
(for Python 2.6 and up) that allow developers to more easily build and that allow developers to more easily build and
distribute Python packages, especially ones that have dependencies on other distribute Python packages, especially ones that have dependencies on other
packages. packages.
......
...@@ -1644,7 +1644,7 @@ class ZipManifests(dict): ...@@ -1644,7 +1644,7 @@ class ZipManifests(dict):
Use a platform-specific path separator (os.sep) for the path keys Use a platform-specific path separator (os.sep) for the path keys
for compatibility with pypy on Windows. for compatibility with pypy on Windows.
""" """
with ContextualZipFile(path) as zfile: with zipfile.ZipFile(path) as zfile:
items = ( items = (
( (
name.replace('/', os.sep), name.replace('/', os.sep),
...@@ -1677,26 +1677,6 @@ class MemoizedZipManifests(ZipManifests): ...@@ -1677,26 +1677,6 @@ class MemoizedZipManifests(ZipManifests):
return self[path].manifest return self[path].manifest
class ContextualZipFile(zipfile.ZipFile):
"""
Supplement ZipFile class to support context manager for Python 2.6
"""
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
self.close()
def __new__(cls, *args, **kwargs):
"""
Construct a ZipFile or ContextualZipFile as appropriate
"""
if hasattr(zipfile.ZipFile, '__exit__'):
return zipfile.ZipFile(*args, **kwargs)
return super(ContextualZipFile, cls).__new__(cls)
class ZipProvider(EggProvider): class ZipProvider(EggProvider):
"""Resource support for zips and eggs""" """Resource support for zips and eggs"""
...@@ -1897,7 +1877,7 @@ class FileMetadata(EmptyProvider): ...@@ -1897,7 +1877,7 @@ class FileMetadata(EmptyProvider):
return metadata return metadata
def _warn_on_replacement(self, metadata): def _warn_on_replacement(self, metadata):
# Python 2.6 and 3.2 compat for: replacement_char = '�' # Python 2.7 compat for: replacement_char = '�'
replacement_char = b'\xef\xbf\xbd'.decode('utf-8') replacement_char = b'\xef\xbf\xbd'.decode('utf-8')
if replacement_char in metadata: if replacement_char in metadata:
tmpl = "{self.path} could not be properly decoded in UTF-8" tmpl = "{self.path} could not be properly decoded in UTF-8"
......
...@@ -385,10 +385,10 @@ Environment Markers ...@@ -385,10 +385,10 @@ Environment Markers
>>> em("sys_platform=='win32'") == (sys.platform=='win32') >>> em("sys_platform=='win32'") == (sys.platform=='win32')
True True
>>> em("python_version >= '2.6'") >>> em("python_version >= '2.7'")
True True
>>> em("python_version > '2.5'") >>> em("python_version > '2.6'")
True True
>>> im("implementation_name=='cpython'") >>> im("implementation_name=='cpython'")
......
...@@ -206,12 +206,10 @@ class TestDistro: ...@@ -206,12 +206,10 @@ class TestDistro:
"""Extras are also evaluated as markers at resolution time.""" """Extras are also evaluated as markers at resolution time."""
ad = pkg_resources.Environment([]) ad = pkg_resources.Environment([])
ws = WorkingSet([]) ws = WorkingSet([])
# Metadata needs to be native strings due to cStringIO behaviour in
# 2.6, so use str().
Foo = Distribution.from_filename( Foo = Distribution.from_filename(
"/foo_dir/Foo-1.2.dist-info", "/foo_dir/Foo-1.2.dist-info",
metadata=Metadata(("METADATA", str("Provides-Extra: baz\n" metadata=Metadata(("METADATA", "Provides-Extra: baz\n"
"Requires-Dist: quux; extra=='baz'"))) "Requires-Dist: quux; extra=='baz'"))
) )
ad.add(Foo) ad.add(Foo)
assert list(ws.resolve(parse_requirements("Foo"), ad)) == [Foo] assert list(ws.resolve(parse_requirements("Foo"), ad)) == [Foo]
...@@ -224,12 +222,10 @@ class TestDistro: ...@@ -224,12 +222,10 @@ class TestDistro:
"""Extras are also evaluated as markers at resolution time.""" """Extras are also evaluated as markers at resolution time."""
ad = pkg_resources.Environment([]) ad = pkg_resources.Environment([])
ws = WorkingSet([]) ws = WorkingSet([])
# Metadata needs to be native strings due to cStringIO behaviour in
# 2.6, so use str().
Foo = Distribution.from_filename( Foo = Distribution.from_filename(
"/foo_dir/Foo-1.2.dist-info", "/foo_dir/Foo-1.2.dist-info",
metadata=Metadata(("METADATA", str("Provides-Extra: baz-lightyear\n" metadata=Metadata(("METADATA", "Provides-Extra: baz-lightyear\n"
"Requires-Dist: quux; extra=='baz-lightyear'"))) "Requires-Dist: quux; extra=='baz-lightyear'"))
) )
ad.add(Foo) ad.add(Foo)
assert list(ws.resolve(parse_requirements("Foo"), ad)) == [Foo] assert list(ws.resolve(parse_requirements("Foo"), ad)) == [Foo]
...@@ -241,14 +237,12 @@ class TestDistro: ...@@ -241,14 +237,12 @@ class TestDistro:
def test_marker_evaluation_with_multiple_extras(self): def test_marker_evaluation_with_multiple_extras(self):
ad = pkg_resources.Environment([]) ad = pkg_resources.Environment([])
ws = WorkingSet([]) ws = WorkingSet([])
# Metadata needs to be native strings due to cStringIO behaviour in
# 2.6, so use str().
Foo = Distribution.from_filename( Foo = Distribution.from_filename(
"/foo_dir/Foo-1.2.dist-info", "/foo_dir/Foo-1.2.dist-info",
metadata=Metadata(("METADATA", str("Provides-Extra: baz\n" metadata=Metadata(("METADATA", "Provides-Extra: baz\n"
"Requires-Dist: quux; extra=='baz'\n" "Requires-Dist: quux; extra=='baz'\n"
"Provides-Extra: bar\n" "Provides-Extra: bar\n"
"Requires-Dist: fred; extra=='bar'\n"))) "Requires-Dist: fred; extra=='bar'\n"))
) )
ad.add(Foo) ad.add(Foo)
quux = Distribution.from_filename("/foo_dir/quux-1.0.dist-info") quux = Distribution.from_filename("/foo_dir/quux-1.0.dist-info")
...@@ -261,22 +255,20 @@ class TestDistro: ...@@ -261,22 +255,20 @@ class TestDistro:
def test_marker_evaluation_with_extras_loop(self): def test_marker_evaluation_with_extras_loop(self):
ad = pkg_resources.Environment([]) ad = pkg_resources.Environment([])
ws = WorkingSet([]) ws = WorkingSet([])
# Metadata needs to be native strings due to cStringIO behaviour in
# 2.6, so use str().
a = Distribution.from_filename( a = Distribution.from_filename(
"/foo_dir/a-0.2.dist-info", "/foo_dir/a-0.2.dist-info",
metadata=Metadata(("METADATA", str("Requires-Dist: c[a]"))) metadata=Metadata(("METADATA", "Requires-Dist: c[a]"))
) )
b = Distribution.from_filename( b = Distribution.from_filename(
"/foo_dir/b-0.3.dist-info", "/foo_dir/b-0.3.dist-info",
metadata=Metadata(("METADATA", str("Requires-Dist: c[b]"))) metadata=Metadata(("METADATA", "Requires-Dist: c[b]"))
) )
c = Distribution.from_filename( c = Distribution.from_filename(
"/foo_dir/c-1.0.dist-info", "/foo_dir/c-1.0.dist-info",
metadata=Metadata(("METADATA", str("Provides-Extra: a\n" metadata=Metadata(("METADATA", "Provides-Extra: a\n"
"Requires-Dist: b;extra=='a'\n" "Requires-Dist: b;extra=='a'\n"
"Provides-Extra: b\n" "Provides-Extra: b\n"
"Requires-Dist: foo;extra=='b'"))) "Requires-Dist: foo;extra=='b'"))
) )
foo = Distribution.from_filename("/foo_dir/foo-0.1.dist-info") foo = Distribution.from_filename("/foo_dir/foo-0.1.dist-info")
for dist in (a, b, c, foo): for dist in (a, b, c, foo):
......
...@@ -151,7 +151,6 @@ setup_params = dict( ...@@ -151,7 +151,6 @@ setup_params = dict(
License :: OSI Approved :: MIT License License :: OSI Approved :: MIT License
Operating System :: OS Independent Operating System :: OS Independent
Programming Language :: Python :: 2 Programming Language :: Python :: 2
Programming Language :: Python :: 2.6
Programming Language :: Python :: 2.7 Programming Language :: Python :: 2.7
Programming Language :: Python :: 3 Programming Language :: Python :: 3
Programming Language :: Python :: 3.3 Programming Language :: Python :: 3.3
...@@ -163,7 +162,7 @@ setup_params = dict( ...@@ -163,7 +162,7 @@ setup_params = dict(
Topic :: System :: Systems Administration Topic :: System :: Systems Administration
Topic :: Utilities Topic :: Utilities
""").strip().splitlines(), """).strip().splitlines(),
python_requires='>=2.6,!=3.0.*,!=3.1.*,!=3.2.*', python_requires='>=2.7,!=3.0.*,!=3.1.*,!=3.2.*',
extras_require={ extras_require={
"ssl:sys_platform=='win32'": "wincertstore==0.2", "ssl:sys_platform=='win32'": "wincertstore==0.2",
"certs": "certifi==2016.9.26", "certs": "certifi==2016.9.26",
......
...@@ -8,7 +8,7 @@ import posixpath ...@@ -8,7 +8,7 @@ import posixpath
import contextlib import contextlib
from distutils.errors import DistutilsError from distutils.errors import DistutilsError
from pkg_resources import ensure_directory, ContextualZipFile from pkg_resources import ensure_directory
__all__ = [ __all__ = [
"unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter",
...@@ -98,7 +98,7 @@ def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): ...@@ -98,7 +98,7 @@ def unpack_zipfile(filename, extract_dir, progress_filter=default_filter):
if not zipfile.is_zipfile(filename): if not zipfile.is_zipfile(filename):
raise UnrecognizedFormat("%s is not a zip file" % (filename,)) raise UnrecognizedFormat("%s is not a zip file" % (filename,))
with ContextualZipFile(filename) as z: with zipfile.ZipFile(filename) as z:
for info in z.infolist(): for info in z.infolist():
name = info.filename name = info.filename
......
...@@ -160,9 +160,7 @@ class egg_info(Command): ...@@ -160,9 +160,7 @@ class egg_info(Command):
build tag. Install build keys in a deterministic order build tag. Install build keys in a deterministic order
to avoid arbitrary reordering on subsequent builds. to avoid arbitrary reordering on subsequent builds.
""" """
# python 2.6 compatibility egg_info = collections.OrderedDict()
odict = getattr(collections, 'OrderedDict', dict)
egg_info = odict()
# follow the order these keys would have been added # follow the order these keys would have been added
# when PYTHONHASHSEED=0 # when PYTHONHASHSEED=0
egg_info['tag_build'] = self.tags() egg_info['tag_build'] = self.tags()
......
...@@ -51,13 +51,6 @@ class sdist(sdist_add_defaults, orig.sdist): ...@@ -51,13 +51,6 @@ class sdist(sdist_add_defaults, orig.sdist):
for cmd_name in self.get_sub_commands(): for cmd_name in self.get_sub_commands():
self.run_command(cmd_name) self.run_command(cmd_name)
# Call check_metadata only if no 'check' command
# (distutils <= 2.6)
import distutils.command
if 'check' not in distutils.command.__all__:
self.check_metadata()
self.make_distribution() self.make_distribution()
dist_files = getattr(self.distribution, 'dist_files', []) dist_files = getattr(self.distribution, 'dist_files', [])
......
...@@ -3,6 +3,7 @@ import operator ...@@ -3,6 +3,7 @@ import operator
import sys import sys
import contextlib import contextlib
import itertools import itertools
import unittest
from distutils.errors import DistutilsError, DistutilsOptionError from distutils.errors import DistutilsError, DistutilsOptionError
from distutils import log from distutils import log
from unittest import TestLoader from unittest import TestLoader
...@@ -14,7 +15,6 @@ from pkg_resources import (resource_listdir, resource_exists, normalize_path, ...@@ -14,7 +15,6 @@ from pkg_resources import (resource_listdir, resource_exists, normalize_path,
working_set, _namespace_packages, evaluate_marker, working_set, _namespace_packages, evaluate_marker,
add_activation_listener, require, EntryPoint) add_activation_listener, require, EntryPoint)
from setuptools import Command from setuptools import Command
from setuptools.py31compat import unittest_main
class ScanningLoader(TestLoader): class ScanningLoader(TestLoader):
...@@ -241,12 +241,11 @@ class test(Command): ...@@ -241,12 +241,11 @@ class test(Command):
del_modules.append(name) del_modules.append(name)
list(map(sys.modules.__delitem__, del_modules)) list(map(sys.modules.__delitem__, del_modules))
exit_kwarg = {} if sys.version_info < (2, 7) else {"exit": False} test = unittest.main(
test = unittest_main(
None, None, self._argv, None, None, self._argv,
testLoader=self._resolve_as_ep(self.test_loader), testLoader=self._resolve_as_ep(self.test_loader),
testRunner=self._resolve_as_ep(self.test_runner), testRunner=self._resolve_as_ep(self.test_runner),
**exit_kwarg exit=False,
) )
if not test.result.wasSuccessful(): if not test.result.wasSuccessful():
msg = 'Test failed: %s' % test.result msg = 'Test failed: %s' % test.result
......
...@@ -4,9 +4,9 @@ import os ...@@ -4,9 +4,9 @@ import os
import sys import sys
from collections import defaultdict from collections import defaultdict
from functools import partial from functools import partial
from importlib import import_module
from distutils.errors import DistutilsOptionError, DistutilsFileError from distutils.errors import DistutilsOptionError, DistutilsFileError
from setuptools.py26compat import import_module
from setuptools.extern.six import string_types from setuptools.extern.six import string_types
......
...@@ -7,9 +7,9 @@ import distutils.filelist ...@@ -7,9 +7,9 @@ import distutils.filelist
import platform import platform
import types import types
import functools import functools
from importlib import import_module
import inspect import inspect
from .py26compat import import_module
from setuptools.extern import six from setuptools.extern import six
import setuptools import setuptools
......
...@@ -27,7 +27,6 @@ from setuptools import ssl_support ...@@ -27,7 +27,6 @@ from setuptools import ssl_support
from distutils import log from distutils import log
from distutils.errors import DistutilsError from distutils.errors import DistutilsError
from fnmatch import translate from fnmatch import translate
from setuptools.py26compat import strip_fragment
from setuptools.py27compat import get_all_headers from setuptools.py27compat import get_all_headers
EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$') EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$')
...@@ -717,7 +716,7 @@ class PackageIndex(Environment): ...@@ -717,7 +716,7 @@ class PackageIndex(Environment):
fp = None fp = None
try: try:
checker = HashChecker.from_url(url) checker = HashChecker.from_url(url)
fp = self.open_url(strip_fragment(url)) fp = self.open_url(url)
if isinstance(fp, urllib.error.HTTPError): if isinstance(fp, urllib.error.HTTPError):
raise DistutilsError( raise DistutilsError(
"Can't download %s: %s %s" % (url, fp.code, fp.msg) "Can't download %s: %s %s" % (url, fp.code, fp.msg)
......
"""
Compatibility Support for Python 2.6 and earlier
"""
import sys
try:
from urllib.parse import splittag
except ImportError:
from urllib import splittag
def strip_fragment(url):
"""
In `Python 8280 <http://bugs.python.org/issue8280>`_, Python 2.7 and
later was patched to disregard the fragment when making URL requests.
Do the same for Python 2.6 and earlier.
"""
url, fragment = splittag(url)
return url
if sys.version_info >= (2, 7):
strip_fragment = lambda x: x
try:
from importlib import import_module
except ImportError:
def import_module(module_name):
return __import__(module_name, fromlist=['__name__'])
import sys
import unittest
__all__ = ['get_config_vars', 'get_path'] __all__ = ['get_config_vars', 'get_path']
try: try:
...@@ -42,15 +39,3 @@ except ImportError: ...@@ -42,15 +39,3 @@ except ImportError:
except OSError: # removal errors are not the only possible except OSError: # removal errors are not the only possible
pass pass
self.name = None self.name = None
unittest_main = unittest.main
_PY31 = (3, 1) <= sys.version_info[:2] < (3, 2)
if _PY31:
# on Python 3.1, translate testRunner==None to TextTestRunner
# for compatibility with Python 2.6, 2.7, and 3.2+
def unittest_main(*args, **kwargs):
if 'testRunner' in kwargs and kwargs['testRunner'] is None:
kwargs['testRunner'] = unittest.TextTestRunner
return unittest.main(*args, **kwargs)
...@@ -39,10 +39,6 @@ def _execfile(filename, globals, locals=None): ...@@ -39,10 +39,6 @@ def _execfile(filename, globals, locals=None):
mode = 'rb' mode = 'rb'
with open(filename, mode) as stream: with open(filename, mode) as stream:
script = stream.read() script = stream.read()
# compile() function in Python 2.6 and 3.1 requires LF line endings.
if sys.version_info[:2] < (2, 7) or sys.version_info[:2] >= (3, 0) and sys.version_info[:2] < (3, 2):
script = script.replace(b'\r\n', b'\n')
script = script.replace(b'\r', b'\n')
if locals is None: if locals is None:
locals = globals locals = globals
code = compile(script, filename, 'exec') code = compile(script, filename, 'exec')
......
import sys
import tarfile
import contextlib
def _tarfile_open_ex(*args, **kwargs):
"""
Extend result as a context manager.
"""
return contextlib.closing(tarfile.open(*args, **kwargs))
if sys.version_info[:2] < (2, 7) or (3, 0) <= sys.version_info[:2] < (3, 2):
tarfile_open = _tarfile_open_ex
else:
tarfile_open = tarfile.open
...@@ -178,7 +178,7 @@ class TestNamespaces: ...@@ -178,7 +178,7 @@ class TestNamespaces:
install_cmd = [ install_cmd = [
sys.executable, sys.executable,
'-m', '-m',
'pip.__main__', 'pip',
'install', 'install',
str(pkg_A), str(pkg_A),
'-t', str(target), '-t', str(target),
......
...@@ -33,7 +33,6 @@ import setuptools.tests.server ...@@ -33,7 +33,6 @@ import setuptools.tests.server
from setuptools.tests import fail_on_ascii from setuptools.tests import fail_on_ascii
import pkg_resources import pkg_resources
from .py26compat import tarfile_open
from . import contexts from . import contexts
from .textwrap import DALS from .textwrap import DALS
...@@ -432,7 +431,7 @@ class TestSetupRequires: ...@@ -432,7 +431,7 @@ class TestSetupRequires:
# extracted path to sys.path so foo.bar v0.1 is importable # extracted path to sys.path so foo.bar v0.1 is importable
foobar_1_dir = os.path.join(temp_dir, 'foo.bar-0.1') foobar_1_dir = os.path.join(temp_dir, 'foo.bar-0.1')
os.mkdir(foobar_1_dir) os.mkdir(foobar_1_dir)
with tarfile_open(foobar_1_archive) as tf: with tarfile.open(foobar_1_archive) as tf:
tf.extractall(foobar_1_dir) tf.extractall(foobar_1_dir)
sys.path.insert(1, foobar_1_dir) sys.path.insert(1, foobar_1_dir)
...@@ -563,7 +562,7 @@ def make_sdist(dist_path, files): ...@@ -563,7 +562,7 @@ def make_sdist(dist_path, files):
listed in ``files`` as ``(filename, content)`` tuples. listed in ``files`` as ``(filename, content)`` tuples.
""" """
with tarfile_open(dist_path, 'w:gz') as dist: with tarfile.open(dist_path, 'w:gz') as dist:
for filename, content in files: for filename, content in files:
file_bytes = io.BytesIO(content.encode('utf-8')) file_bytes = io.BytesIO(content.encode('utf-8'))
file_info = tarfile.TarInfo(name=filename) file_info = tarfile.TarInfo(name=filename)
......
import sys
import ast import ast
import os import os
import glob import glob
import re import re
import stat import stat
import sys
from setuptools.command.egg_info import egg_info, manifest_maker from setuptools.command.egg_info import egg_info, manifest_maker
from setuptools.dist import Distribution from setuptools.dist import Distribution
...@@ -64,12 +64,6 @@ class TestEggInfo(object): ...@@ -64,12 +64,6 @@ class TestEggInfo(object):
}) })
yield env yield env
dict_order_fails = pytest.mark.skipif(
sys.version_info < (2, 7),
reason="Intermittent failures on Python 2.6",
)
@dict_order_fails
def test_egg_info_save_version_info_setup_empty(self, tmpdir_cwd, env): def test_egg_info_save_version_info_setup_empty(self, tmpdir_cwd, env):
""" """
When the egg_info section is empty or not present, running When the egg_info section is empty or not present, running
...@@ -104,7 +98,6 @@ class TestEggInfo(object): ...@@ -104,7 +98,6 @@ class TestEggInfo(object):
flags = re.MULTILINE | re.DOTALL flags = re.MULTILINE | re.DOTALL
assert re.search(pattern, content, flags) assert re.search(pattern, content, flags)
@dict_order_fails
def test_egg_info_save_version_info_setup_defaults(self, tmpdir_cwd, env): def test_egg_info_save_version_info_setup_defaults(self, tmpdir_cwd, env):
""" """
When running save_version_info on an existing setup.cfg When running save_version_info on an existing setup.cfg
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# #
# To run Tox against all supported Python interpreters, you can set: # To run Tox against all supported Python interpreters, you can set:
# #
# export TOXENV='py2{6,7},py3{3,4,5,6},pypy,pypy3' # export TOXENV='py27,py3{3,4,5,6},pypy,pypy3'
[testenv] [testenv]
deps=-rtests/requirements.txt deps=-rtests/requirements.txt
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment