Commit 337ea160 authored by Steve Kowalik's avatar Steve Kowalik

Merge from default.

parents 3bd5118e d49c41c6
......@@ -233,3 +233,4 @@ cc41477ecf92f221c113736fac2830bf8079d40c 19.0
834782ce49154e9744e499e00eb392c347f9e034 19.1
0a2a3d89416e1642cf6f41d22dbc07b3d3c15a4d 19.1.1
5d24cf9d1ced76c406ab3c4a94c25d1fe79b94bc 19.2
66fa131a0d77a1b0e6f89ccb76b254cfb07d3da3 19.3b1
......@@ -2,6 +2,13 @@
CHANGES
=======
----
19.3
----
* Issue #229: Implement new technique for readily incorporating
dependencies conditionally from vendored copies or primary
locations. Adds a new dependency on six.
----
19.3
......
......@@ -3,6 +3,7 @@ recursive-include tests *.py
recursive-include setuptools/tests *.html
recursive-include docs *.py *.txt *.conf *.css *.css_t Makefile indexsidebar.html
recursive-include _markerlib *.py
recursive-include setuptools/_vendor *
recursive-include pkg_resources *.py *.txt
include *.py
include *.txt
......
This diff is collapsed.
import sys
class VendorImporter:
"""
A PEP 302 meta path importer for finding optionally-vendored
or otherwise naturally-installed packages from root_name.
"""
def __init__(self, root_name, vendored_names=(), vendor_pkg=None):
self.root_name = root_name
self.vendored_names = set(vendored_names)
self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor')
@property
def search_path(self):
"""
Search first the vendor package then as a natural package.
"""
yield self.vendor_pkg + '.'
yield ''
def find_module(self, fullname, path=None):
"""
Return self when fullname starts with root_name and the
target module is one vendored through this importer.
"""
root, base, target = fullname.partition(self.root_name + '.')
if root:
return
if not any(map(target.startswith, self.vendored_names)):
return
return self
def load_module(self, fullname):
"""
Iterate over the search path to locate and load fullname.
"""
root, base, target = fullname.partition(self.root_name + '.')
for prefix in self.search_path:
try:
extant = prefix + target
__import__(extant)
mod = sys.modules[extant]
sys.modules[fullname] = mod
# mysterious hack:
# Remove the reference to the extant package/module
# on later Python versions to cause relative imports
# in the vendor package to resolve the same modules
# as those going through this importer.
if sys.version_info > (3, 3):
del sys.modules[extant]
return mod
except ImportError:
pass
else:
raise ImportError(
"The '{target}' package is required; "
"normally this is bundled with this package so if you get "
"this warning, consult the packager of your "
"distribution.".format(**locals())
)
def install(self):
"""
Install this importer into sys.meta_path if not already present.
"""
if self not in sys.meta_path:
sys.meta_path.append(self)
names = 'packaging', 'six'
VendorImporter(__name__, names).install()
......@@ -5,14 +5,13 @@ import shutil
import string
import pytest
from pkg_resources.extern import packaging
import pkg_resources
from pkg_resources import (parse_requirements, VersionConflict, parse_version,
Distribution, EntryPoint, Requirement, safe_version, safe_name,
WorkingSet)
packaging = pkg_resources.packaging
def safe_repr(obj, short=False):
""" copied from Python2.7"""
......@@ -245,9 +244,8 @@ class TestWorkingSet:
with pytest.raises(VersionConflict) as vc:
ws.resolve(parse_requirements("Foo\nBar\n"))
msg = "Baz 1.0 is installed but Baz==2.0 is required by {'Bar'}"
if pkg_resources.PY2:
msg = msg.replace("{'Bar'}", "set(['Bar'])")
msg = "Baz 1.0 is installed but Baz==2.0 is required by "
msg += repr(set(['Bar']))
assert vc.value.report() == msg
......@@ -313,7 +311,7 @@ class TestEntryPoints:
def checkSubMap(self, m):
assert len(m) == len(self.submap_expect)
for key, ep in pkg_resources.iteritems(self.submap_expect):
for key, ep in self.submap_expect.items():
assert repr(m.get(key)) == repr(ep)
submap_expect = dict(
......
[pytest]
addopts=--doctest-modules --ignore release.py --ignore setuptools/lib2to3_ex.py --ignore tests/manual_test.py --ignore tests/shlib_test --doctest-glob=pkg_resources/api_tests.txt --ignore scripts/upload-old-releases-as-zip.py
norecursedirs=dist build *.egg
norecursedirs=dist build *.egg setuptools/extern pkg_resources/extern
......@@ -8,11 +8,12 @@ from distutils.core import Command as _Command
from distutils.util import convert_path
from fnmatch import fnmatchcase
from setuptools.extern.six.moves import filterfalse
import setuptools.version
from setuptools.extension import Extension
from setuptools.dist import Distribution, Feature, _get_unpatched
from setuptools.depends import Require
from setuptools.compat import filterfalse
__all__ = [
'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require',
......
......@@ -11,9 +11,10 @@ import os
import marshal
import textwrap
from setuptools.extern import six
from pkg_resources import get_build_platform, Distribution, ensure_directory
from pkg_resources import EntryPoint
from setuptools.compat import basestring
from setuptools.extension import Library
from setuptools import Command
......@@ -413,7 +414,7 @@ def iter_symbols(code):
for name in code.co_names:
yield name
for const in code.co_consts:
if isinstance(const, basestring):
if isinstance(const, six.string_types):
yield const
elif isinstance(const, CodeType):
for name in iter_symbols(const):
......
......@@ -5,9 +5,10 @@ import os
import glob
import io
from setuptools.extern import six
from pkg_resources import Distribution, PathMetadata, normalize_path
from setuptools.command.easy_install import easy_install
from setuptools.compat import PY3
import setuptools
......@@ -87,7 +88,7 @@ class develop(easy_install):
" installation directory", p, normalize_path(os.curdir))
def install_for_development(self):
if PY3 and getattr(self.distribution, 'use_2to3', False):
if six.PY3 and getattr(self.distribution, 'use_2to3', False):
# If we run 2to3 we can not do this inplace:
# Ensure metadata is up-to-date
......
......@@ -40,6 +40,9 @@ import subprocess
import shlex
import io
from setuptools.extern import six
from setuptools.extern.six.moves import configparser
from setuptools import Command
from setuptools.sandbox import run_setup
from setuptools.py31compat import get_path, get_config_vars
......@@ -48,8 +51,6 @@ from setuptools.archive_util import unpack_archive
from setuptools.package_index import PackageIndex
from setuptools.package_index import URL_SCHEME
from setuptools.command import bdist_egg, egg_info
from setuptools.compat import (iteritems, maxsize, basestring, unicode,
reraise, PY2, PY3)
from pkg_resources import (
yield_lines, normalize_path, resource_string, ensure_directory,
get_distribution, find_distributions, Environment, Requirement,
......@@ -82,13 +83,13 @@ def samefile(p1, p2):
return norm_p1 == norm_p2
if PY2:
if six.PY2:
def _to_ascii(s):
return s
def isascii(s):
try:
unicode(s, 'ascii')
six.text_type(s, 'ascii')
return True
except UnicodeError:
return False
......@@ -320,7 +321,7 @@ class easy_install(Command):
self.local_index = Environment(self.shadow_path + sys.path)
if self.find_links is not None:
if isinstance(self.find_links, basestring):
if isinstance(self.find_links, six.string_types):
self.find_links = self.find_links.split()
else:
self.find_links = []
......@@ -413,7 +414,7 @@ class easy_install(Command):
try:
pid = os.getpid()
except:
pid = random.randint(0, maxsize)
pid = random.randint(0, sys.maxsize)
return os.path.join(self.install_dir, "test-easy-install-%s" % pid)
def warn_deprecated_options(self):
......@@ -1245,7 +1246,7 @@ class easy_install(Command):
f = open(sitepy, 'rb')
current = f.read()
# we want str, not bytes
if PY3:
if six.PY3:
current = current.decode()
f.close()
......@@ -1271,7 +1272,7 @@ class easy_install(Command):
if not self.user:
return
home = convert_path(os.path.expanduser("~"))
for name, path in iteritems(self.config_vars):
for name, path in six.iteritems(self.config_vars):
if path.startswith(home) and not os.path.isdir(path):
self.debug_print("os.makedirs('%s', 0o700)" % path)
os.makedirs(path, 0o700)
......@@ -1415,9 +1416,6 @@ def extract_wininst_cfg(dist_filename):
return None
f.seek(prepended - 12)
from setuptools.compat import StringIO, configparser
import struct
tag, cfglen, bmlen = struct.unpack("<iii", f.read(12))
if tag not in (0x1234567A, 0x1234567B):
return None # not a valid tag
......@@ -1432,7 +1430,7 @@ def extract_wininst_cfg(dist_filename):
# Now the config is in bytes, but for RawConfigParser, it should
# be text, so decode it.
config = config.decode(sys.getfilesystemencoding())
cfg.readfp(StringIO(config))
cfg.readfp(six.StringIO(config))
except configparser.Error:
return None
if not cfg.has_section('metadata') or not cfg.has_section('Setup'):
......@@ -1467,7 +1465,7 @@ def get_exe_prefixes(exe_filename):
continue
if parts[0].upper() in ('PURELIB', 'PLATLIB'):
contents = z.read(name)
if PY3:
if six.PY3:
contents = contents.decode()
for pth in yield_lines(contents):
pth = pth.strip().replace('\\', '/')
......@@ -1643,7 +1641,7 @@ def auto_chmod(func, arg, exc):
chmod(arg, stat.S_IWRITE)
return func(arg)
et, ev, _ = sys.exc_info()
reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg))))
six.reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg))))
def update_dist_caches(dist_path, fix_zipimporter_caches):
......@@ -2209,7 +2207,7 @@ def get_win_launcher(type):
def load_launcher_manifest(name):
manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml')
if PY2:
if six.PY2:
return manifest % vars()
else:
return manifest.decode('utf-8') % vars()
......
......@@ -14,7 +14,7 @@ import io
import warnings
import time
from setuptools.compat import basestring, PY3, StringIO
from setuptools.extern import six
from setuptools import Command
from setuptools.command.sdist import sdist
......@@ -26,7 +26,7 @@ from pkg_resources import (
safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename)
import setuptools.unicode_utils as unicode_utils
from pkg_resources import packaging
from pkg_resources.extern import packaging
try:
from setuptools_svn import svn_utils
......@@ -148,7 +148,7 @@ class egg_info(Command):
to the file.
"""
log.info("writing %s to %s", what, filename)
if PY3:
if six.PY3:
data = data.encode("utf-8")
if not self.dry_run:
f = open(filename, 'wb')
......@@ -412,7 +412,7 @@ def _write_requirements(stream, reqs):
def write_requirements(cmd, basename, filename):
dist = cmd.distribution
data = StringIO()
data = six.StringIO()
_write_requirements(data, dist.install_requires)
extras_require = dist.extras_require or {}
for extra in sorted(extras_require):
......@@ -452,12 +452,12 @@ def write_arg(cmd, basename, filename, force=False):
def write_entries(cmd, basename, filename):
ep = cmd.distribution.entry_points
if isinstance(ep, basestring) or ep is None:
if isinstance(ep, six.string_types) or ep is None:
data = ep
elif ep is not None:
data = []
for section, contents in sorted(ep.items()):
if not isinstance(contents, basestring):
if not isinstance(contents, six.string_types):
contents = EntryPoint.parse_group(section, contents)
contents = '\n'.join(sorted(map(str, contents.values())))
data.append('[%s]\n%s\n\n' % (section, contents))
......
......@@ -3,8 +3,9 @@ from distutils import log
from distutils.errors import DistutilsOptionError
import os
from setuptools.extern import six
from setuptools import Command
from setuptools.compat import basestring
class rotate(Command):
......@@ -36,7 +37,7 @@ class rotate(Command):
self.keep = int(self.keep)
except ValueError:
raise DistutilsOptionError("--keep must be an integer")
if isinstance(self.match, basestring):
if isinstance(self.match, six.string_types):
self.match = [
convert_path(p.strip()) for p in self.match.split(',')
]
......
......@@ -5,7 +5,8 @@ import os
import sys
import io
from setuptools.compat import PY3
from setuptools.extern import six
from setuptools.utils import cs_path_exists
import pkg_resources
......@@ -181,7 +182,7 @@ class sdist(orig.sdist):
manifest = open(self.manifest, 'rbU')
for line in manifest:
# The manifest must contain UTF-8. See #303.
if PY3:
if six.PY3:
try:
line = line.decode('UTF-8')
except UnicodeDecodeError:
......
......@@ -4,6 +4,8 @@ from distutils.errors import DistutilsOptionError
import distutils
import os
from setuptools.extern.six.moves import configparser
from setuptools import Command
......@@ -37,8 +39,6 @@ def edit_config(filename, settings, dry_run=False):
while a dictionary lists settings to be changed or deleted in that section.
A setting of ``None`` means to delete that setting.
"""
from setuptools.compat import configparser
log.debug("Reading configuration from %s", filename)
opts = configparser.RawConfigParser()
opts.read([filename])
......
......@@ -2,11 +2,12 @@ from distutils.errors import DistutilsOptionError
from unittest import TestLoader
import sys
from setuptools.extern import six
from pkg_resources import (resource_listdir, resource_exists, normalize_path,
working_set, _namespace_packages,
add_activation_listener, require, EntryPoint)
from setuptools import Command
from setuptools.compat import PY3
from setuptools.py31compat import unittest_main
......@@ -100,7 +101,7 @@ class test(Command):
yield self.test_suite
def with_project_on_sys_path(self, func):
with_2to3 = PY3 and getattr(self.distribution, 'use_2to3', False)
with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False)
if with_2to3:
# If we run 2to3 we can not do this inplace:
......@@ -160,7 +161,7 @@ class test(Command):
# Purge modules under test from sys.modules. The test loader will
# re-import them from the build location. Required when 2to3 is used
# with namespace packages.
if PY3 and getattr(self.distribution, 'use_2to3', False):
if six.PY3 and getattr(self.distribution, 'use_2to3', False):
module = self.test_suite.split('.')[0]
if module in _namespace_packages:
del_modules = []
......
......@@ -16,17 +16,19 @@ import tempfile
import sys
import shutil
from setuptools.compat import httplib, urlparse, unicode, iteritems, PY3
from setuptools.extern import six
from setuptools.extern.six.moves import http_client, urllib
from pkg_resources import iter_entry_points
errors = 'surrogateescape' if PY3 else 'strict'
errors = 'surrogateescape' if six.PY3 else 'strict'
# This is not just a replacement for byte literals
# but works as a general purpose encoder
def b(s, encoding='utf-8'):
if isinstance(s, unicode):
if isinstance(s, six.text_type):
return s.encode(encoding, errors)
return s
......@@ -113,7 +115,7 @@ class upload_docs(upload):
# set up the authentication
credentials = b(self.username + ':' + self.password)
credentials = standard_b64encode(credentials)
if PY3:
if six.PY3:
credentials = credentials.decode('ascii')
auth = "Basic " + credentials
......@@ -122,7 +124,7 @@ class upload_docs(upload):
sep_boundary = b('\n--') + b(boundary)
end_boundary = sep_boundary + b('--')
body = []
for key, values in iteritems(data):
for key, values in six.iteritems(data):
title = '\nContent-Disposition: form-data; name="%s"' % key
# handle multiple entries for the same name
if not isinstance(values, list):
......@@ -150,12 +152,12 @@ class upload_docs(upload):
# We can't use urllib2 since we need to send the Basic
# auth right with the first request
schema, netloc, url, params, query, fragments = \
urlparse(self.repository)
urllib.parse.urlparse(self.repository)
assert not params and not query and not fragments
if schema == 'http':
conn = httplib.HTTPConnection(netloc)
conn = http_client.HTTPConnection(netloc)
elif schema == 'https':
conn = httplib.HTTPSConnection(netloc)
conn = http_client.HTTPSConnection(netloc)
else:
raise AssertionError("unsupported schema " + schema)
......
import sys
import itertools
PY3 = sys.version_info >= (3,)
PY2 = not PY3
if PY2:
basestring = basestring
import __builtin__ as builtins
import ConfigParser as configparser
from StringIO import StringIO
BytesIO = StringIO
func_code = lambda o: o.func_code
func_globals = lambda o: o.func_globals
im_func = lambda o: o.im_func
from htmlentitydefs import name2codepoint
import httplib
from BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import BaseHTTPRequestHandler
iteritems = lambda o: o.iteritems()
long_type = long
maxsize = sys.maxint
unichr = unichr
unicode = unicode
bytes = str
from urllib import url2pathname, splittag, pathname2url
import urllib2
from urllib2 import urlopen, HTTPError, URLError, unquote, splituser
from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit
filterfalse = itertools.ifilterfalse
filter = itertools.ifilter
map = itertools.imap
exec("""def reraise(tp, value, tb=None):
raise tp, value, tb""")
if PY3:
basestring = str
import builtins
import configparser
from io import StringIO, BytesIO
func_code = lambda o: o.__code__
func_globals = lambda o: o.__globals__
im_func = lambda o: o.__func__
from html.entities import name2codepoint
import http.client as httplib
from http.server import HTTPServer, SimpleHTTPRequestHandler
from http.server import BaseHTTPRequestHandler
iteritems = lambda o: o.items()
long_type = int
maxsize = sys.maxsize
unichr = chr
unicode = str
bytes = bytes
from urllib.error import HTTPError, URLError
import urllib.request as urllib2
from urllib.request import urlopen, url2pathname, pathname2url
from urllib.parse import (
urlparse, urlunparse, unquote, splituser, urljoin, urlsplit,
urlunsplit, splittag,
)
filterfalse = itertools.filterfalse
filter = filter
map = map
def reraise(tp, value, tb=None):
if value.__traceback__ is not tb:
raise value.with_traceback(tb)
raise value
......@@ -3,7 +3,8 @@ import imp
import marshal
from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN
from distutils.version import StrictVersion
from setuptools import compat
from setuptools.extern import six
__all__ = [
'Require', 'find_module', 'get_module_constant', 'extract_constant'
......@@ -99,7 +100,8 @@ def _iter_code(code):
ptr += 3
if op==EXTENDED_ARG:
extended_arg = arg * compat.long_type(65536)
long_type = six.integer_types[-1]
extended_arg = arg * long_type(65536)
continue
else:
......
......@@ -13,13 +13,13 @@ from distutils.core import Distribution as _Distribution
from distutils.errors import (DistutilsOptionError, DistutilsPlatformError,
DistutilsSetupError)
from setuptools.extern import six
from pkg_resources.extern import packaging
from setuptools.depends import Require
from setuptools.compat import basestring, PY2
from setuptools import windows_support
import pkg_resources
packaging = pkg_resources.packaging
def _get_unpatched(cls):
"""Protect against re-patching the distutils if reloaded
......@@ -138,7 +138,7 @@ def check_entry_points(dist, attr, value):
raise DistutilsSetupError(e)
def check_test_suite(dist, attr, value):
if not isinstance(value,basestring):
if not isinstance(value, six.string_types):
raise DistutilsSetupError("test_suite must be a string")
def check_package_data(dist, attr, value):
......@@ -682,7 +682,7 @@ class Distribution(_Distribution):
"""
import sys
if PY2 or self.help_commands:
if six.PY2 or self.help_commands:
return _Distribution.handle_display_options(self, option_order)
# Stdout may be StringIO (e.g. in tests)
......
from pkg_resources.extern import VendorImporter
names = 'six',
VendorImporter(__name__, names, 'pkg_resources._vendor').install()
This diff is collapsed.
......@@ -4,7 +4,10 @@ Compatibility Support for Python 2.6 and earlier
import sys
from setuptools.compat import splittag
try:
from urllib.parse import splittag
except ImportError:
from urllib import splittag
def strip_fragment(url):
"""
......
......@@ -8,6 +8,9 @@ import re
import contextlib
import pickle
from setuptools.extern import six
from setuptools.extern.six.moves import builtins
import pkg_resources
if sys.platform.startswith('java'):
......@@ -22,9 +25,6 @@ _open = open
from distutils.errors import DistutilsError
from pkg_resources import working_set
from setuptools import compat
from setuptools.compat import builtins
__all__ = [
"AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup",
]
......@@ -138,7 +138,7 @@ class ExceptionSaver:
return
type, exc = map(pickle.loads, self._saved)
compat.reraise(type, exc, self._tb)
six.reraise(type, exc, self._tb)
@contextlib.contextmanager
......
......@@ -3,9 +3,10 @@ import socket
import atexit
import re
from setuptools.extern.six.moves import urllib, http_client
import pkg_resources
from pkg_resources import ResolutionError, ExtractionError
from setuptools.compat import urllib2
try:
import ssl
......@@ -27,17 +28,11 @@ cert_paths = """
""".strip().split()
HTTPSHandler = HTTPSConnection = object
for what, where in (
('HTTPSHandler', ['urllib2','urllib.request']),
('HTTPSConnection', ['httplib', 'http.client']),
):
for module in where:
try:
exec("from %s import %s" % (module, what))
except ImportError:
pass
try:
HTTPSHandler = urllib.request.HTTPSHandler
HTTPSConnection = http_client.HTTPSConnection
except AttributeError:
HTTPSHandler = HTTPSConnection = object
is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection)
......@@ -198,7 +193,7 @@ class VerifyingHTTPSConn(HTTPSConnection):
def opener_for(ca_bundle=None):
"""Get a urlopen() replacement that uses ca_bundle for verification"""
return urllib2.build_opener(
return urllib.request.build_opener(
VerifyingHTTPSHandler(ca_bundle or find_ca_bundle())
).open
......
......@@ -7,8 +7,8 @@ from distutils.errors import DistutilsOptionError, DistutilsPlatformError
from distutils.errors import DistutilsSetupError
from distutils.core import Extension
from distutils.version import LooseVersion
from setuptools.compat import func_code
from setuptools.extern import six
import pytest
import setuptools.dist
......@@ -52,7 +52,7 @@ class TestDepends:
x = "test"
y = z
fc = func_code(f1)
fc = six.get_function_code(f1)
# unrecognized name
assert dep.extract_constant(fc,'q', -1) is None
......
......@@ -5,7 +5,7 @@ import sys
import contextlib
import site
from ..compat import StringIO
from setuptools.extern import six
@contextlib.contextmanager
......@@ -57,8 +57,8 @@ def quiet():
old_stdout = sys.stdout
old_stderr = sys.stderr
new_stdout = sys.stdout = StringIO()
new_stderr = sys.stderr = StringIO()
new_stdout = sys.stdout = six.StringIO()
new_stderr = sys.stderr = six.StringIO()
try:
yield new_stdout, new_stderr
finally:
......
......@@ -3,10 +3,11 @@
import time
import threading
from setuptools.compat import BaseHTTPRequestHandler
from setuptools.compat import HTTPServer, SimpleHTTPRequestHandler
class IndexServer(HTTPServer):
from setuptools.extern.six.moves import BaseHTTPServer, SimpleHTTPServer
class IndexServer(BaseHTTPServer.HTTPServer):
"""Basic single-threaded http server simulating a package index
You can use this server in unittest like this::
......@@ -18,8 +19,9 @@ class IndexServer(HTTPServer):
s.stop()
"""
def __init__(self, server_address=('', 0),
RequestHandlerClass=SimpleHTTPRequestHandler):
HTTPServer.__init__(self, server_address, RequestHandlerClass)
RequestHandlerClass=SimpleHTTPServer.SimpleHTTPRequestHandler):
BaseHTTPServer.HTTPServer.__init__(self, server_address,
RequestHandlerClass)
self._run = True
def start(self):
......@@ -40,19 +42,20 @@ class IndexServer(HTTPServer):
port = self.server_port
return 'http://127.0.0.1:%s/setuptools/tests/indexes/' % port
class RequestRecorder(BaseHTTPRequestHandler):
class RequestRecorder(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
requests = vars(self.server).setdefault('requests', [])
requests.append(self)
self.send_response(200, 'OK')
class MockServer(HTTPServer, threading.Thread):
class MockServer(BaseHTTPServer.HTTPServer, threading.Thread):
"""
A simple HTTP Server that records the requests made to it.
"""
def __init__(self, server_address=('', 0),
RequestHandlerClass=RequestRecorder):
HTTPServer.__init__(self, server_address, RequestHandlerClass)
BaseHTTPServer.HTTPServer.__init__(self, server_address,
RequestHandlerClass)
threading.Thread.__init__(self)
self.setDaemon(True)
self.requests = []
......
......@@ -5,12 +5,13 @@ import site
import sys
import io
from setuptools.extern import six
import pytest
from setuptools.command.develop import develop
from setuptools.dist import Distribution
from . import contexts
from setuptools.compat import PY3
SETUP_PY = """\
......@@ -85,7 +86,7 @@ class TestDevelop:
with io.open(fn) as init_file:
init = init_file.read().strip()
expected = 'print("foo")' if PY3 else 'print "foo"'
expected = 'print("foo")' if six.PY3 else 'print "foo"'
assert init == expected
def test_console_scripts(self, tmpdir):
......
......@@ -14,6 +14,10 @@ import tarfile
import logging
import itertools
import distutils.errors
import io
from setuptools.extern import six
from setuptools.extern.six.moves import urllib
import pytest
try:
......@@ -22,8 +26,6 @@ except ImportError:
import mock
from setuptools import sandbox
from setuptools import compat
from setuptools.compat import StringIO, BytesIO, urlparse
from setuptools.sandbox import run_setup
import setuptools.command.easy_install as ei
from setuptools.command.easy_install import PthDistributions
......@@ -272,7 +274,7 @@ class TestSetupRequires:
p_index = setuptools.tests.server.MockServer()
p_index.start()
netloc = 1
p_index_loc = urlparse(p_index.url)[netloc]
p_index_loc = urllib.parse.urlparse(p_index.url)[netloc]
if p_index_loc.endswith(':0'):
# Some platforms (Jython) don't find a port to which to bind,
# so skip this test for them.
......@@ -391,12 +393,7 @@ def make_trivial_sdist(dist_path, setup_py):
"""
setup_py_file = tarfile.TarInfo(name='setup.py')
try:
# Python 3 (StringIO gets converted to io module)
MemFile = BytesIO
except AttributeError:
MemFile = StringIO
setup_py_bytes = MemFile(setup_py.encode('utf-8'))
setup_py_bytes = io.BytesIO(setup_py.encode('utf-8'))
setup_py_file.size = len(setup_py_bytes.getvalue())
with tarfile_open(dist_path, 'w:gz') as dist:
dist.addfile(setup_py_file, fileobj=setup_py_bytes)
......@@ -431,7 +428,7 @@ class TestScriptHeader:
assert actual == expected
@pytest.mark.xfail(
compat.PY3 and is_ascii,
six.PY3 and is_ascii,
reason="Test fails in this locale on Python 3"
)
@mock.patch.dict(sys.modules, java=mock.Mock(lang=mock.Mock(System=
......
......@@ -7,12 +7,12 @@ import glob
import os
import sys
from setuptools.extern.six.moves import urllib
import pytest
from setuptools.command.easy_install import easy_install
from setuptools.command import easy_install as easy_install_pkg
from setuptools.dist import Distribution
from setuptools.compat import urlopen
def setup_module(module):
......@@ -26,7 +26,7 @@ def setup_module(module):
pass
try:
urlopen('https://pypi.python.org/pypi')
urllib.request.urlopen('https://pypi.python.org/pypi')
except Exception as exc:
pytest.skip(str(exc))
......
......@@ -4,9 +4,10 @@ import sys
import os
import distutils.errors
from setuptools.compat import httplib, HTTPError, unicode, pathname2url
from .textwrap import DALS
from setuptools.extern import six
from setuptools.extern.six.moves import urllib, http_client
from .textwrap import DALS
import pkg_resources
import setuptools.package_index
from setuptools.tests.server import IndexServer
......@@ -22,7 +23,7 @@ class TestPackageIndex:
except Exception as v:
assert url in str(v)
else:
assert isinstance(v, HTTPError)
assert isinstance(v, urllib.error.HTTPError)
def test_bad_url_typo(self):
# issue 16
......@@ -38,7 +39,7 @@ class TestPackageIndex:
except Exception as v:
assert url in str(v)
else:
assert isinstance(v, HTTPError)
assert isinstance(v, urllib.error.HTTPError)
def test_bad_url_bad_status_line(self):
index = setuptools.package_index.PackageIndex(
......@@ -46,7 +47,7 @@ class TestPackageIndex:
)
def _urlopen(*args):
raise httplib.BadStatusLine('line')
raise http_client.BadStatusLine('line')
index.opener = _urlopen
url = 'http://example.com'
......@@ -70,7 +71,7 @@ class TestPackageIndex:
try:
index.open_url(url)
except distutils.errors.DistutilsError as error:
msg = unicode(error)
msg = six.text_type(error)
assert 'nonnumeric port' in msg or 'getaddrinfo failed' in msg or 'Name or service not known' in msg
return
raise RuntimeError("Did not raise")
......@@ -167,7 +168,7 @@ class TestPackageIndex:
index_file = tmpdir / 'index.html'
with index_file.open('w') as f:
f.write('<div>content</div>')
url = 'file:' + pathname2url(str(tmpdir)) + '/'
url = 'file:' + urllib.request.pathname2url(str(tmpdir)) + '/'
res = setuptools.package_index.local_open(url)
assert 'content' in res.read()
......
......@@ -9,17 +9,18 @@ import unicodedata
import contextlib
import io
from setuptools.extern import six
import pytest
import pkg_resources
from setuptools.compat import StringIO, unicode, PY3, PY2
from setuptools.command.sdist import sdist
from setuptools.command.egg_info import manifest_maker
from setuptools.dist import Distribution
from setuptools.tests import fail_on_ascii
py3_only = pytest.mark.xfail(PY2, reason="Test runs on Python 3 only")
py3_only = pytest.mark.xfail(six.PY2, reason="Test runs on Python 3 only")
SETUP_ATTRS = {
......@@ -37,7 +38,7 @@ setup(**%r)
""" % SETUP_ATTRS
if PY3:
if six.PY3:
LATIN1_FILENAME = 'smörbröd.py'.encode('latin-1')
else:
LATIN1_FILENAME = 'sm\xf6rbr\xf6d.py'
......@@ -47,7 +48,7 @@ else:
@contextlib.contextmanager
def quiet():
old_stdout, old_stderr = sys.stdout, sys.stderr
sys.stdout, sys.stderr = StringIO(), StringIO()
sys.stdout, sys.stderr = six.StringIO(), six.StringIO()
try:
yield
finally:
......@@ -56,14 +57,14 @@ def quiet():
# Fake byte literals for Python <= 2.5
def b(s, encoding='utf-8'):
if PY3:
if six.PY3:
return s.encode(encoding)
return s
# Convert to POSIX path
def posix(path):
if PY3 and not isinstance(path, str):
if six.PY3 and not isinstance(path, str):
return path.replace(os.sep.encode('ascii'), b('/'))
else:
return path.replace(os.sep, '/')
......@@ -71,7 +72,7 @@ def posix(path):
# HFS Plus uses decomposed UTF-8
def decompose(path):
if isinstance(path, unicode):
if isinstance(path, six.text_type):
return unicodedata.normalize('NFD', path)
try:
path = path.decode('utf-8')
......@@ -184,7 +185,7 @@ class TestSdistTest:
u_contents = contents.decode('UTF-8')
# The manifest should contain the UTF-8 filename
if PY2:
if six.PY2:
fs_enc = sys.getfilesystemencoding()
filename = filename.decode(fs_enc)
......@@ -289,7 +290,7 @@ class TestSdistTest:
cmd.read_manifest()
# The filelist should contain the UTF-8 filename
if PY3:
if six.PY3:
filename = filename.decode('utf-8')
assert filename in cmd.filelist.files
......@@ -342,7 +343,7 @@ class TestSdistTest:
if sys.platform == 'darwin':
filename = decompose(filename)
if PY3:
if six.PY3:
fs_enc = sys.getfilesystemencoding()
if sys.platform == 'win32':
......@@ -374,7 +375,7 @@ class TestSdistTest:
with quiet():
cmd.run()
if PY3:
if six.PY3:
# not all windows systems have a default FS encoding of cp1252
if sys.platform == 'win32':
# Latin-1 is similar to Windows-1252 however
......
......@@ -4,6 +4,7 @@ from __future__ import unicode_literals
import os
import site
from distutils.errors import DistutilsError
import pytest
......
import unicodedata
import sys
from setuptools.compat import unicode as decoded_string
from setuptools.extern import six
# HFS Plus uses decomposed UTF-8
def decompose(path):
if isinstance(path, decoded_string):
if isinstance(path, six.text_type):
return unicodedata.normalize('NFD', path)
try:
path = path.decode('utf-8')
......@@ -23,7 +23,7 @@ def filesys_decode(path):
"""
fs_enc = sys.getfilesystemencoding()
if isinstance(path, decoded_string):
if isinstance(path, six.text_type):
return path
for enc in (fs_enc, "utf-8"):
......
......@@ -7,7 +7,8 @@ import tempfile
import subprocess
from distutils.command.install import INSTALL_SCHEMES
from string import Template
from setuptools.compat import urlopen
from six.moves import urllib
def _system_call(*args):
assert subprocess.call(args) == 0
......@@ -76,7 +77,7 @@ def test_full():
f.write(SIMPLE_BUILDOUT)
with open('bootstrap.py', 'w') as f:
f.write(urlopen(BOOTSTRAP).read())
f.write(urllib.request.urlopen(BOOTSTRAP).read())
_system_call('bin/python', 'bootstrap.py')
_system_call('bin/buildout', '-q')
......
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