update sqlalchemy
This commit is contained in:
parent
22cbffb8a3
commit
e4bd5b5042
362 changed files with 37677 additions and 11013 deletions
|
|
@ -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, map
|
||||
|
||||
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',
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ __all__ = [
|
|||
'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop',
|
||||
'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts',
|
||||
'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts',
|
||||
'register', 'bdist_wininst', 'upload_docs',
|
||||
'register', 'bdist_wininst', 'upload_docs', 'upload',
|
||||
]
|
||||
|
||||
from distutils.command.bdist import bdist
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
from distutils.errors import DistutilsOptionError
|
||||
|
||||
from setuptools.extern.six.moves import map
|
||||
|
||||
from setuptools.command.setopt import edit_config, option_base, config_file
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -2,9 +2,14 @@ from glob import glob
|
|||
from distutils.util import convert_path
|
||||
import distutils.command.build_py as orig
|
||||
import os
|
||||
import sys
|
||||
import fnmatch
|
||||
import textwrap
|
||||
import io
|
||||
import distutils.errors
|
||||
import collections
|
||||
import itertools
|
||||
|
||||
from setuptools.extern.six.moves import map
|
||||
|
||||
try:
|
||||
from setuptools.lib2to3_ex import Mixin2to3
|
||||
|
|
@ -55,9 +60,10 @@ class build_py(orig.build_py, Mixin2to3):
|
|||
self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0))
|
||||
|
||||
def __getattr__(self, attr):
|
||||
if attr == 'data_files': # lazily compute data files
|
||||
self.data_files = files = self._get_data_files()
|
||||
return files
|
||||
"lazily compute data files"
|
||||
if attr == 'data_files':
|
||||
self.data_files = self._get_data_files()
|
||||
return self.data_files
|
||||
return orig.build_py.__getattr__(self, attr)
|
||||
|
||||
def build_module(self, module, module_file, package):
|
||||
|
|
@ -70,23 +76,21 @@ class build_py(orig.build_py, Mixin2to3):
|
|||
def _get_data_files(self):
|
||||
"""Generate list of '(package,src_dir,build_dir,filenames)' tuples"""
|
||||
self.analyze_manifest()
|
||||
data = []
|
||||
for package in self.packages or ():
|
||||
# Locate package source directory
|
||||
src_dir = self.get_package_dir(package)
|
||||
return list(map(self._get_pkg_data_files, self.packages or ()))
|
||||
|
||||
# Compute package build directory
|
||||
build_dir = os.path.join(*([self.build_lib] + package.split('.')))
|
||||
def _get_pkg_data_files(self, package):
|
||||
# Locate package source directory
|
||||
src_dir = self.get_package_dir(package)
|
||||
|
||||
# Length of path to strip from found files
|
||||
plen = len(src_dir) + 1
|
||||
# Compute package build directory
|
||||
build_dir = os.path.join(*([self.build_lib] + package.split('.')))
|
||||
|
||||
# Strip directory from globbed filenames
|
||||
filenames = [
|
||||
file[plen:] for file in self.find_data_files(package, src_dir)
|
||||
]
|
||||
data.append((package, src_dir, build_dir, filenames))
|
||||
return data
|
||||
# Strip directory from globbed filenames
|
||||
filenames = [
|
||||
os.path.relpath(file, src_dir)
|
||||
for file in self.find_data_files(package, src_dir)
|
||||
]
|
||||
return package, src_dir, build_dir, filenames
|
||||
|
||||
def find_data_files(self, package, src_dir):
|
||||
"""Return filenames for package's data files in 'src_dir'"""
|
||||
|
|
@ -157,17 +161,15 @@ class build_py(orig.build_py, Mixin2to3):
|
|||
else:
|
||||
return init_py
|
||||
|
||||
f = open(init_py, 'rbU')
|
||||
if 'declare_namespace'.encode() not in f.read():
|
||||
from distutils.errors import DistutilsError
|
||||
|
||||
raise DistutilsError(
|
||||
with io.open(init_py, 'rb') as f:
|
||||
contents = f.read()
|
||||
if b'declare_namespace' not in contents:
|
||||
raise distutils.errors.DistutilsError(
|
||||
"Namespace package problem: %s is a namespace package, but "
|
||||
"its\n__init__.py does not call declare_namespace()! Please "
|
||||
'fix it.\n(See the setuptools manual under '
|
||||
'"Namespace Packages" for details.)\n"' % (package,)
|
||||
)
|
||||
f.close()
|
||||
return init_py
|
||||
|
||||
def initialize_options(self):
|
||||
|
|
@ -182,20 +184,25 @@ class build_py(orig.build_py, Mixin2to3):
|
|||
|
||||
def exclude_data_files(self, package, src_dir, files):
|
||||
"""Filter filenames for package's data files in 'src_dir'"""
|
||||
globs = (self.exclude_package_data.get('', [])
|
||||
+ self.exclude_package_data.get(package, []))
|
||||
bad = []
|
||||
for pattern in globs:
|
||||
bad.extend(
|
||||
fnmatch.filter(
|
||||
files, os.path.join(src_dir, convert_path(pattern))
|
||||
)
|
||||
globs = (
|
||||
self.exclude_package_data.get('', [])
|
||||
+ self.exclude_package_data.get(package, [])
|
||||
)
|
||||
bad = set(
|
||||
item
|
||||
for pattern in globs
|
||||
for item in fnmatch.filter(
|
||||
files,
|
||||
os.path.join(src_dir, convert_path(pattern)),
|
||||
)
|
||||
bad = dict.fromkeys(bad)
|
||||
seen = {}
|
||||
)
|
||||
seen = collections.defaultdict(itertools.count)
|
||||
return [
|
||||
f for f in files if f not in bad
|
||||
and f not in seen and seen.setdefault(f, 1) # ditch dupes
|
||||
fn
|
||||
for fn in files
|
||||
if fn not in bad
|
||||
# ditch dupes
|
||||
and not next(seen[fn])
|
||||
]
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,10 +3,12 @@ from distutils import log
|
|||
from distutils.errors import DistutilsError, DistutilsOptionError
|
||||
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
|
||||
|
||||
|
||||
|
|
@ -53,8 +55,8 @@ class develop(easy_install):
|
|||
# pick up setup-dir .egg files only: no .egg-info
|
||||
self.package_index.scan(glob.glob('*.egg'))
|
||||
|
||||
self.egg_link = os.path.join(self.install_dir, ei.egg_name +
|
||||
'.egg-link')
|
||||
egg_link_fn = ei.egg_name + '.egg-link'
|
||||
self.egg_link = os.path.join(self.install_dir, egg_link_fn)
|
||||
self.egg_base = ei.egg_base
|
||||
if self.egg_path is None:
|
||||
self.egg_path = os.path.abspath(ei.egg_base)
|
||||
|
|
@ -86,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
|
||||
|
|
@ -124,9 +126,8 @@ class develop(easy_install):
|
|||
# create an .egg-link in the installation dir, pointing to our egg
|
||||
log.info("Creating %s (link to %s)", self.egg_link, self.egg_base)
|
||||
if not self.dry_run:
|
||||
f = open(self.egg_link, "w")
|
||||
f.write(self.egg_path + "\n" + self.setup_path)
|
||||
f.close()
|
||||
with open(self.egg_link, "w") as f:
|
||||
f.write(self.egg_path + "\n" + self.setup_path)
|
||||
# postprocess the installed distro, fixing up .pth, installing scripts,
|
||||
# and handling requirements
|
||||
self.process_distribution(None, self.dist, not self.no_deps)
|
||||
|
|
@ -163,9 +164,8 @@ class develop(easy_install):
|
|||
for script_name in self.distribution.scripts or []:
|
||||
script_path = os.path.abspath(convert_path(script_name))
|
||||
script_name = os.path.basename(script_path)
|
||||
f = open(script_path, 'rU')
|
||||
script_text = f.read()
|
||||
f.close()
|
||||
with io.open(script_path) as strm:
|
||||
script_text = strm.read()
|
||||
self.install_script(dist, script_name, script_text, script_path)
|
||||
|
||||
def install_wrapper_scripts(self, dist):
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ from distutils.errors import DistutilsArgError, DistutilsOptionError, \
|
|||
from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS
|
||||
from distutils import log, dir_util
|
||||
from distutils.command.build_scripts import first_line_re
|
||||
from distutils.spawn import find_executable
|
||||
import sys
|
||||
import os
|
||||
import zipimport
|
||||
|
|
@ -39,6 +40,9 @@ import subprocess
|
|||
import shlex
|
||||
import io
|
||||
|
||||
from setuptools.extern import six
|
||||
from setuptools.extern.six.moves import configparser, map
|
||||
|
||||
from setuptools import Command
|
||||
from setuptools.sandbox import run_setup
|
||||
from setuptools.py31compat import get_path, get_config_vars
|
||||
|
|
@ -47,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,
|
||||
|
|
@ -81,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
|
||||
|
|
@ -319,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 = []
|
||||
|
|
@ -412,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):
|
||||
|
|
@ -771,8 +773,8 @@ class easy_install(Command):
|
|||
is_script = is_python_script(script_text, script_name)
|
||||
|
||||
if is_script:
|
||||
script_text = (ScriptWriter.get_header(script_text) +
|
||||
self._load_template(dev_path) % locals())
|
||||
body = self._load_template(dev_path) % locals()
|
||||
script_text = ScriptWriter.get_header(script_text) + body
|
||||
self.write_script(script_name, _to_ascii(script_text), 'b')
|
||||
|
||||
@staticmethod
|
||||
|
|
@ -804,9 +806,8 @@ class easy_install(Command):
|
|||
ensure_directory(target)
|
||||
if os.path.exists(target):
|
||||
os.unlink(target)
|
||||
f = open(target, "w" + mode)
|
||||
f.write(contents)
|
||||
f.close()
|
||||
with open(target, "w" + mode) as f:
|
||||
f.write(contents)
|
||||
chmod(target, 0o777 - mask)
|
||||
|
||||
def install_eggs(self, spec, dist_filename, tmpdir):
|
||||
|
|
@ -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)
|
||||
|
|
@ -1402,7 +1403,7 @@ def expand_paths(inputs):
|
|||
def extract_wininst_cfg(dist_filename):
|
||||
"""Extract configuration data from a bdist_wininst .exe
|
||||
|
||||
Returns a ConfigParser.RawConfigParser, or None
|
||||
Returns a configparser.RawConfigParser, or None
|
||||
"""
|
||||
f = open(dist_filename, 'rb')
|
||||
try:
|
||||
|
|
@ -1415,15 +1416,12 @@ 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
|
||||
|
||||
f.seek(prepended - (12 + cfglen))
|
||||
cfg = ConfigParser.RawConfigParser(
|
||||
cfg = configparser.RawConfigParser(
|
||||
{'version': '', 'target_version': ''})
|
||||
try:
|
||||
part = f.read(cfglen)
|
||||
|
|
@ -1432,8 +1430,8 @@ 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))
|
||||
except ConfigParser.Error:
|
||||
cfg.readfp(six.StringIO(config))
|
||||
except configparser.Error:
|
||||
return None
|
||||
if not cfg.has_section('metadata') or not cfg.has_section('Setup'):
|
||||
return None
|
||||
|
|
@ -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):
|
||||
|
|
@ -1878,17 +1876,6 @@ def chmod(path, mode):
|
|||
log.debug("chmod failed: %s", e)
|
||||
|
||||
|
||||
def fix_jython_executable(executable, options):
|
||||
warnings.warn("Use JythonCommandSpec", DeprecationWarning, stacklevel=2)
|
||||
|
||||
if not JythonCommandSpec.relevant():
|
||||
return executable
|
||||
|
||||
cmd = CommandSpec.best().from_param(executable)
|
||||
cmd.install_options(options)
|
||||
return cmd.as_header().lstrip('#!').rstrip('\n')
|
||||
|
||||
|
||||
class CommandSpec(list):
|
||||
"""
|
||||
A command spec for a #! header, specified as a list of arguments akin to
|
||||
|
|
@ -1903,7 +1890,7 @@ class CommandSpec(list):
|
|||
"""
|
||||
Choose the best CommandSpec class based on environmental conditions.
|
||||
"""
|
||||
return cls if not JythonCommandSpec.relevant() else JythonCommandSpec
|
||||
return cls
|
||||
|
||||
@classmethod
|
||||
def _sys_executable(cls):
|
||||
|
|
@ -1970,36 +1957,6 @@ class WindowsCommandSpec(CommandSpec):
|
|||
split_args = dict(posix=False)
|
||||
|
||||
|
||||
class JythonCommandSpec(CommandSpec):
|
||||
@classmethod
|
||||
def relevant(cls):
|
||||
return (
|
||||
sys.platform.startswith('java')
|
||||
and
|
||||
__import__('java').lang.System.getProperty('os.name') != 'Linux'
|
||||
)
|
||||
|
||||
def as_header(self):
|
||||
"""
|
||||
Workaround Jython's sys.executable being a .sh (an invalid
|
||||
shebang line interpreter)
|
||||
"""
|
||||
if not is_sh(self[0]):
|
||||
return super(JythonCommandSpec, self).as_header()
|
||||
|
||||
if self.options:
|
||||
# Can't apply the workaround, leave it broken
|
||||
log.warn(
|
||||
"WARNING: Unable to adapt shebang line for Jython,"
|
||||
" the following script is NOT executable\n"
|
||||
" see http://bugs.jython.org/issue1112 for"
|
||||
" more information.")
|
||||
return super(JythonCommandSpec, self).as_header()
|
||||
|
||||
items = ['/usr/bin/env'] + self + list(self.options)
|
||||
return self._render(items)
|
||||
|
||||
|
||||
class ScriptWriter(object):
|
||||
"""
|
||||
Encapsulates behavior around writing entry point scripts for console and
|
||||
|
|
@ -2076,7 +2033,10 @@ class ScriptWriter(object):
|
|||
"""
|
||||
Select the best ScriptWriter for this environment.
|
||||
"""
|
||||
return WindowsScriptWriter.best() if sys.platform == 'win32' else cls
|
||||
if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'):
|
||||
return WindowsScriptWriter.best()
|
||||
else:
|
||||
return cls
|
||||
|
||||
@classmethod
|
||||
def _get_script_args(cls, type_, name, header, script_text):
|
||||
|
|
@ -2126,8 +2086,8 @@ class WindowsScriptWriter(ScriptWriter):
|
|||
blockers = [name + x for x in old]
|
||||
yield name + ext, header + script_text, 't', blockers
|
||||
|
||||
@staticmethod
|
||||
def _adjust_header(type_, orig_header):
|
||||
@classmethod
|
||||
def _adjust_header(cls, type_, orig_header):
|
||||
"""
|
||||
Make sure 'pythonw' is used for gui and and 'python' is used for
|
||||
console (regardless of what sys.executable is).
|
||||
|
|
@ -2138,11 +2098,19 @@ class WindowsScriptWriter(ScriptWriter):
|
|||
pattern, repl = repl, pattern
|
||||
pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE)
|
||||
new_header = pattern_ob.sub(string=orig_header, repl=repl)
|
||||
return new_header if cls._use_header(new_header) else orig_header
|
||||
|
||||
@staticmethod
|
||||
def _use_header(new_header):
|
||||
"""
|
||||
Should _adjust_header use the replaced header?
|
||||
|
||||
On non-windows systems, always use. On
|
||||
Windows systems, only use the replaced header if it resolves
|
||||
to an executable on the system.
|
||||
"""
|
||||
clean_header = new_header[2:-1].strip('"')
|
||||
if sys.platform == 'win32' and not os.path.exists(clean_header):
|
||||
# the adjusted version doesn't exist, so return the original
|
||||
return orig_header
|
||||
return new_header
|
||||
return sys.platform != 'win32' or find_executable(clean_header)
|
||||
|
||||
|
||||
class WindowsExecutableLauncherWriter(WindowsScriptWriter):
|
||||
|
|
@ -2201,7 +2169,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()
|
||||
|
|
|
|||
|
|
@ -10,22 +10,30 @@ import distutils.filelist
|
|||
import os
|
||||
import re
|
||||
import sys
|
||||
import io
|
||||
import warnings
|
||||
import time
|
||||
|
||||
from setuptools.extern import six
|
||||
from setuptools.extern.six.moves import map
|
||||
|
||||
from setuptools import Command
|
||||
from setuptools.command.sdist import sdist
|
||||
from setuptools.command.sdist import walk_revctrl
|
||||
from setuptools.command.setopt import edit_config
|
||||
from setuptools.command import bdist_egg
|
||||
from pkg_resources import (
|
||||
parse_requirements, safe_name, parse_version,
|
||||
safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename)
|
||||
import setuptools.unicode_utils as unicode_utils
|
||||
|
||||
from pkg_resources.extern import packaging
|
||||
|
||||
try:
|
||||
from setuptools_svn import svn_utils
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
from setuptools import Command
|
||||
from setuptools.command.sdist import sdist
|
||||
from setuptools.compat import basestring, PY3, StringIO
|
||||
from setuptools.command.sdist import walk_revctrl
|
||||
from pkg_resources import (
|
||||
parse_requirements, safe_name, parse_version,
|
||||
safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename)
|
||||
import setuptools.unicode_utils as unicode_utils
|
||||
|
||||
from pkg_resources import packaging
|
||||
|
||||
class egg_info(Command):
|
||||
description = "create a distribution's .egg-info directory"
|
||||
|
|
@ -58,8 +66,6 @@ class egg_info(Command):
|
|||
self.vtags = None
|
||||
|
||||
def save_version_info(self, filename):
|
||||
from setuptools.command.setopt import edit_config
|
||||
|
||||
values = dict(
|
||||
egg_info=dict(
|
||||
tag_svn_revision=0,
|
||||
|
|
@ -143,7 +149,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')
|
||||
|
|
@ -184,12 +190,8 @@ class egg_info(Command):
|
|||
if self.tag_build:
|
||||
version += self.tag_build
|
||||
if self.tag_svn_revision:
|
||||
rev = self.get_svn_revision()
|
||||
if rev: # is 0 if it's not an svn working copy
|
||||
version += '-r%s' % rev
|
||||
version += '-r%s' % self.get_svn_revision()
|
||||
if self.tag_date:
|
||||
import time
|
||||
|
||||
version += time.strftime("-%Y%m%d")
|
||||
return version
|
||||
|
||||
|
|
@ -390,7 +392,6 @@ def write_pkg_info(cmd, basename, filename):
|
|||
metadata.name, metadata.version = oldname, oldver
|
||||
|
||||
safe = getattr(cmd.distribution, 'zip_safe', None)
|
||||
from setuptools.command import bdist_egg
|
||||
|
||||
bdist_egg.write_safety_flag(cmd.egg_info, safe)
|
||||
|
||||
|
|
@ -412,7 +413,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 +453,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))
|
||||
|
|
@ -467,14 +468,15 @@ def write_entries(cmd, basename, filename):
|
|||
|
||||
|
||||
def get_pkg_info_revision():
|
||||
# See if we can get a -r### off of PKG-INFO, in case this is an sdist of
|
||||
# a subversion revision
|
||||
#
|
||||
"""
|
||||
Get a -r### off of PKG-INFO Version in case this is an sdist of
|
||||
a subversion revision.
|
||||
"""
|
||||
warnings.warn("get_pkg_info_revision is deprecated.", DeprecationWarning)
|
||||
if os.path.exists('PKG-INFO'):
|
||||
f = open('PKG-INFO', 'rU')
|
||||
for line in f:
|
||||
match = re.match(r"Version:.*-r(\d+)\s*$", line)
|
||||
if match:
|
||||
return int(match.group(1))
|
||||
f.close()
|
||||
with io.open('PKG-INFO') as f:
|
||||
for line in f:
|
||||
match = re.match(r"Version:.*-r(\d+)\s*$", line)
|
||||
if match:
|
||||
return int(match.group(1))
|
||||
return 0
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
from distutils import log, dir_util
|
||||
import os
|
||||
|
||||
from setuptools.extern.six.moves import map
|
||||
|
||||
from setuptools import Command
|
||||
from setuptools.archive_util import unpack_archive
|
||||
import pkg_resources
|
||||
|
|
@ -27,7 +29,7 @@ class install_egg_info(Command):
|
|||
).egg_name() + '.egg-info'
|
||||
self.source = ei_cmd.egg_info
|
||||
self.target = os.path.join(self.install_dir, basename)
|
||||
self.outputs = [self.target]
|
||||
self.outputs = []
|
||||
|
||||
def run(self):
|
||||
self.run_command('egg_info')
|
||||
|
|
|
|||
|
|
@ -79,6 +79,8 @@ class install_lib(orig.install_lib):
|
|||
base = os.path.join('__pycache__', '__init__.' + imp.get_tag())
|
||||
yield base + '.pyc'
|
||||
yield base + '.pyo'
|
||||
yield base + '.opt-1.pyc'
|
||||
yield base + '.opt-2.pyc'
|
||||
|
||||
def copy_tree(
|
||||
self, infile, outfile,
|
||||
|
|
|
|||
|
|
@ -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(',')
|
||||
]
|
||||
|
|
|
|||
|
|
@ -3,8 +3,10 @@ from distutils import log
|
|||
import distutils.command.sdist as orig
|
||||
import os
|
||||
import sys
|
||||
import io
|
||||
|
||||
from setuptools.extern import six
|
||||
|
||||
from setuptools.compat import PY3
|
||||
from setuptools.utils import cs_path_exists
|
||||
|
||||
import pkg_resources
|
||||
|
|
@ -166,11 +168,8 @@ class sdist(orig.sdist):
|
|||
if not os.path.isfile(self.manifest):
|
||||
return False
|
||||
|
||||
fp = open(self.manifest, 'rbU')
|
||||
try:
|
||||
with io.open(self.manifest, 'rb') as fp:
|
||||
first_line = fp.readline()
|
||||
finally:
|
||||
fp.close()
|
||||
return (first_line !=
|
||||
'# file GENERATED by distutils, do NOT edit\n'.encode())
|
||||
|
||||
|
|
@ -183,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,10 +39,8 @@ 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 = configparser.RawConfigParser()
|
||||
opts.read([filename])
|
||||
for section, options in settings.items():
|
||||
if options is None:
|
||||
|
|
|
|||
|
|
@ -2,11 +2,13 @@ from distutils.errors import DistutilsOptionError
|
|||
from unittest import TestLoader
|
||||
import sys
|
||||
|
||||
from setuptools.extern import six
|
||||
from setuptools.extern.six.moves import map
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
|
@ -41,6 +43,17 @@ class ScanningLoader(TestLoader):
|
|||
return tests[0] # don't create a nested suite for only one return
|
||||
|
||||
|
||||
# adapted from jaraco.classes.properties:NonDataProperty
|
||||
class NonDataProperty(object):
|
||||
def __init__(self, fget):
|
||||
self.fget = fget
|
||||
|
||||
def __get__(self, obj, objtype=None):
|
||||
if obj is None:
|
||||
return self
|
||||
return self.fget(obj)
|
||||
|
||||
|
||||
class test(Command):
|
||||
"""Command to run unit tests after in-place build"""
|
||||
|
||||
|
|
@ -78,7 +91,7 @@ class test(Command):
|
|||
if self.test_runner is None:
|
||||
self.test_runner = getattr(self.distribution, 'test_runner', None)
|
||||
|
||||
@property
|
||||
@NonDataProperty
|
||||
def test_args(self):
|
||||
return list(self._test_args())
|
||||
|
||||
|
|
@ -89,7 +102,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:
|
||||
|
|
@ -149,7 +162,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 = []
|
||||
|
|
|
|||
23
lib/python3.4/site-packages/setuptools/command/upload.py
Normal file
23
lib/python3.4/site-packages/setuptools/command/upload.py
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
from distutils.command import upload as orig
|
||||
|
||||
|
||||
class upload(orig.upload):
|
||||
"""
|
||||
Override default upload behavior to look up password
|
||||
in the keyring if available.
|
||||
"""
|
||||
|
||||
def finalize_options(self):
|
||||
orig.upload.finalize_options(self)
|
||||
self.password or self._load_password_from_keyring()
|
||||
|
||||
def _load_password_from_keyring(self):
|
||||
"""
|
||||
Attempt to load password from keyring. Suppress Exceptions.
|
||||
"""
|
||||
try:
|
||||
keyring = __import__('keyring')
|
||||
self.password = keyring.get_password(self.repository,
|
||||
self.username)
|
||||
except Exception:
|
||||
pass
|
||||
|
|
@ -8,25 +8,26 @@ PyPI's pythonhosted.org).
|
|||
from base64 import standard_b64encode
|
||||
from distutils import log
|
||||
from distutils.errors import DistutilsOptionError
|
||||
from distutils.command.upload import upload
|
||||
import os
|
||||
import socket
|
||||
import zipfile
|
||||
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
|
||||
from .upload import upload
|
||||
|
||||
|
||||
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 +114,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 +123,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 +151,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)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,66 +0,0 @@
|
|||
import sys
|
||||
import itertools
|
||||
|
||||
PY3 = sys.version_info >= (3,)
|
||||
PY2 = not PY3
|
||||
|
||||
if PY2:
|
||||
basestring = basestring
|
||||
import __builtin__ as builtins
|
||||
import 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
|
||||
|
||||
exec("""def reraise(tp, value, tb=None):
|
||||
raise tp, value, tb""")
|
||||
|
||||
if PY3:
|
||||
basestring = str
|
||||
import builtins
|
||||
import configparser as 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
|
||||
|
||||
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,14 @@ from distutils.core import Distribution as _Distribution
|
|||
from distutils.errors import (DistutilsOptionError, DistutilsPlatformError,
|
||||
DistutilsSetupError)
|
||||
|
||||
from setuptools.extern import six
|
||||
from setuptools.extern.six.moves import map
|
||||
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 +139,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):
|
||||
|
|
@ -160,7 +161,7 @@ def check_packages(dist, attr, value):
|
|||
for pkgname in value:
|
||||
if not re.match(r'\w+(\.\w+)*', pkgname):
|
||||
distutils.log.warn(
|
||||
"WARNING: %r not a valid package name; please use only"
|
||||
"WARNING: %r not a valid package name; please use only "
|
||||
".-separated package names in setup.py", pkgname
|
||||
)
|
||||
|
||||
|
|
@ -267,8 +268,7 @@ class Distribution(_Distribution):
|
|||
if attrs and 'setup_requires' in attrs:
|
||||
self.fetch_build_eggs(attrs['setup_requires'])
|
||||
for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'):
|
||||
if not hasattr(self,ep.name):
|
||||
setattr(self,ep.name,None)
|
||||
vars(self).setdefault(ep.name, None)
|
||||
_Distribution.__init__(self,attrs)
|
||||
if isinstance(self.metadata.version, numbers.Number):
|
||||
# Some people apparently take "version number" too literally :)
|
||||
|
|
@ -440,6 +440,14 @@ class Distribution(_Distribution):
|
|||
self.cmdclass[ep.name] = cmdclass
|
||||
return _Distribution.print_commands(self)
|
||||
|
||||
def get_command_list(self):
|
||||
for ep in pkg_resources.iter_entry_points('distutils.commands'):
|
||||
if ep.name not in self.cmdclass:
|
||||
# don't require extras as the commands won't be invoked
|
||||
cmdclass = ep.resolve()
|
||||
self.cmdclass[ep.name] = cmdclass
|
||||
return _Distribution.get_command_list(self)
|
||||
|
||||
def _set_feature(self,name,status):
|
||||
"""Set feature's inclusion status"""
|
||||
setattr(self,self._feature_attrname(name),status)
|
||||
|
|
@ -675,7 +683,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)
|
||||
|
|
@ -818,7 +826,7 @@ class Feature:
|
|||
|
||||
if not self.available:
|
||||
raise DistutilsPlatformError(
|
||||
self.description+" is required,"
|
||||
self.description+" is required, "
|
||||
"but is not available on this platform"
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@ import distutils.core
|
|||
import distutils.errors
|
||||
import distutils.extension
|
||||
|
||||
from setuptools.extern.six.moves import map
|
||||
|
||||
from .dist import _get_unpatched
|
||||
from . import msvc9_support
|
||||
|
||||
|
|
|
|||
5
lib/python3.4/site-packages/setuptools/extern/__init__.py
vendored
Normal file
5
lib/python3.4/site-packages/setuptools/extern/__init__.py
vendored
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
from pkg_resources.extern import VendorImporter
|
||||
|
||||
|
||||
names = 'six',
|
||||
VendorImporter(__name__, names, 'pkg_resources._vendor').install()
|
||||
35
lib/python3.4/site-packages/setuptools/launch.py
Normal file
35
lib/python3.4/site-packages/setuptools/launch.py
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
"""
|
||||
Launch the Python script on the command line after
|
||||
setuptools is bootstrapped via import.
|
||||
"""
|
||||
|
||||
# Note that setuptools gets imported implicitly by the
|
||||
# invocation of this script using python -m setuptools.launch
|
||||
|
||||
import tokenize
|
||||
import sys
|
||||
|
||||
|
||||
def run():
|
||||
"""
|
||||
Run the script in sys.argv[1] as if it had
|
||||
been invoked naturally.
|
||||
"""
|
||||
__builtins__
|
||||
script_name = sys.argv[1]
|
||||
namespace = dict(
|
||||
__file__ = script_name,
|
||||
__name__ = '__main__',
|
||||
__doc__ = None,
|
||||
)
|
||||
sys.argv[:] = sys.argv[1:]
|
||||
|
||||
open_ = getattr(tokenize, 'open', open)
|
||||
script = open_(script_name).read()
|
||||
norm_script = script.replace('\\r\\n', '\\n')
|
||||
code = compile(norm_script, script_name, 'exec')
|
||||
exec(code, namespace)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
||||
|
|
@ -6,8 +6,17 @@ import shutil
|
|||
import socket
|
||||
import base64
|
||||
import hashlib
|
||||
import itertools
|
||||
from functools import wraps
|
||||
|
||||
try:
|
||||
from urllib.parse import splituser
|
||||
except ImportError:
|
||||
from urllib2 import splituser
|
||||
|
||||
from setuptools.extern import six
|
||||
from setuptools.extern.six.moves import urllib, http_client, configparser, map
|
||||
|
||||
from pkg_resources import (
|
||||
CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST,
|
||||
require, Environment, find_distributions, safe_name, safe_version,
|
||||
|
|
@ -16,12 +25,6 @@ from pkg_resources import (
|
|||
from setuptools import ssl_support
|
||||
from distutils import log
|
||||
from distutils.errors import DistutilsError
|
||||
from setuptools.compat import (urllib2, httplib, StringIO, HTTPError,
|
||||
urlparse, urlunparse, unquote, splituser,
|
||||
url2pathname, name2codepoint,
|
||||
unichr, urljoin, urlsplit, urlunsplit,
|
||||
ConfigParser)
|
||||
from setuptools.compat import filterfalse
|
||||
from fnmatch import translate
|
||||
from setuptools.py26compat import strip_fragment
|
||||
from setuptools.py27compat import get_all_headers
|
||||
|
|
@ -68,10 +71,11 @@ def parse_bdist_wininst(name):
|
|||
|
||||
|
||||
def egg_info_for_url(url):
|
||||
scheme, server, path, parameters, query, fragment = urlparse(url)
|
||||
base = unquote(path.split('/')[-1])
|
||||
parts = urllib.parse.urlparse(url)
|
||||
scheme, server, path, parameters, query, fragment = parts
|
||||
base = urllib.parse.unquote(path.split('/')[-1])
|
||||
if server=='sourceforge.net' and base=='download': # XXX Yuck
|
||||
base = unquote(path.split('/')[-2])
|
||||
base = urllib.parse.unquote(path.split('/')[-2])
|
||||
if '#' in base: base, fragment = base.split('#',1)
|
||||
return base,fragment
|
||||
|
||||
|
|
@ -157,7 +161,7 @@ def unique_everseen(iterable, key=None):
|
|||
seen = set()
|
||||
seen_add = seen.add
|
||||
if key is None:
|
||||
for element in filterfalse(seen.__contains__, iterable):
|
||||
for element in six.moves.filterfalse(seen.__contains__, iterable):
|
||||
seen_add(element)
|
||||
yield element
|
||||
else:
|
||||
|
|
@ -189,14 +193,14 @@ def find_external_links(url, page):
|
|||
rels = set(map(str.strip, rel.lower().split(',')))
|
||||
if 'homepage' in rels or 'download' in rels:
|
||||
for match in HREF.finditer(tag):
|
||||
yield urljoin(url, htmldecode(match.group(1)))
|
||||
yield urllib.parse.urljoin(url, htmldecode(match.group(1)))
|
||||
|
||||
for tag in ("<th>Home Page", "<th>Download URL"):
|
||||
pos = page.find(tag)
|
||||
if pos!=-1:
|
||||
match = HREF.search(page,pos)
|
||||
if match:
|
||||
yield urljoin(url, htmldecode(match.group(1)))
|
||||
yield urllib.parse.urljoin(url, htmldecode(match.group(1)))
|
||||
|
||||
user_agent = "Python-urllib/%s setuptools/%s" % (
|
||||
sys.version[:3], require('setuptools')[0].version
|
||||
|
|
@ -239,7 +243,7 @@ class HashChecker(ContentChecker):
|
|||
@classmethod
|
||||
def from_url(cls, url):
|
||||
"Construct a (possibly null) ContentChecker from a URL"
|
||||
fragment = urlparse(url)[-1]
|
||||
fragment = urllib.parse.urlparse(url)[-1]
|
||||
if not fragment:
|
||||
return ContentChecker()
|
||||
match = cls.pattern.search(fragment)
|
||||
|
|
@ -274,7 +278,7 @@ class PackageIndex(Environment):
|
|||
self.to_scan = []
|
||||
if verify_ssl and ssl_support.is_available and (ca_bundle or ssl_support.find_ca_bundle()):
|
||||
self.opener = ssl_support.opener_for(ca_bundle)
|
||||
else: self.opener = urllib2.urlopen
|
||||
else: self.opener = urllib.request.urlopen
|
||||
|
||||
def process_url(self, url, retrieve=False):
|
||||
"""Evaluate a URL as a possible download, and maybe retrieve it"""
|
||||
|
|
@ -311,7 +315,7 @@ class PackageIndex(Environment):
|
|||
base = f.url # handle redirects
|
||||
page = f.read()
|
||||
if not isinstance(page, str): # We are in Python 3 and got bytes. We want str.
|
||||
if isinstance(f, HTTPError):
|
||||
if isinstance(f, urllib.error.HTTPError):
|
||||
# Errors have no charset, assume latin1:
|
||||
charset = 'latin-1'
|
||||
else:
|
||||
|
|
@ -319,7 +323,7 @@ class PackageIndex(Environment):
|
|||
page = page.decode(charset, "ignore")
|
||||
f.close()
|
||||
for match in HREF.finditer(page):
|
||||
link = urljoin(base, htmldecode(match.group(1)))
|
||||
link = urllib.parse.urljoin(base, htmldecode(match.group(1)))
|
||||
self.process_url(link)
|
||||
if url.startswith(self.index_url) and getattr(f,'code',None)!=404:
|
||||
page = self.process_index(url, page)
|
||||
|
|
@ -342,7 +346,7 @@ class PackageIndex(Environment):
|
|||
|
||||
def url_ok(self, url, fatal=False):
|
||||
s = URL_SCHEME(url)
|
||||
if (s and s.group(1).lower()=='file') or self.allows(urlparse(url)[1]):
|
||||
if (s and s.group(1).lower()=='file') or self.allows(urllib.parse.urlparse(url)[1]):
|
||||
return True
|
||||
msg = ("\nNote: Bypassing %s (disallowed host; see "
|
||||
"http://bit.ly/1dg9ijs for details).\n")
|
||||
|
|
@ -352,20 +356,30 @@ class PackageIndex(Environment):
|
|||
self.warn(msg, url)
|
||||
|
||||
def scan_egg_links(self, search_path):
|
||||
for item in search_path:
|
||||
if os.path.isdir(item):
|
||||
for entry in os.listdir(item):
|
||||
if entry.endswith('.egg-link'):
|
||||
self.scan_egg_link(item, entry)
|
||||
dirs = filter(os.path.isdir, search_path)
|
||||
egg_links = (
|
||||
(path, entry)
|
||||
for path in dirs
|
||||
for entry in os.listdir(path)
|
||||
if entry.endswith('.egg-link')
|
||||
)
|
||||
list(itertools.starmap(self.scan_egg_link, egg_links))
|
||||
|
||||
def scan_egg_link(self, path, entry):
|
||||
lines = [_f for _f in map(str.strip,
|
||||
open(os.path.join(path, entry))) if _f]
|
||||
if len(lines)==2:
|
||||
for dist in find_distributions(os.path.join(path, lines[0])):
|
||||
dist.location = os.path.join(path, *lines)
|
||||
dist.precedence = SOURCE_DIST
|
||||
self.add(dist)
|
||||
with open(os.path.join(path, entry)) as raw_lines:
|
||||
# filter non-empty lines
|
||||
lines = list(filter(None, map(str.strip, raw_lines)))
|
||||
|
||||
if len(lines) != 2:
|
||||
# format is not recognized; punt
|
||||
return
|
||||
|
||||
egg_path, setup_path = lines
|
||||
|
||||
for dist in find_distributions(os.path.join(path, egg_path)):
|
||||
dist.location = os.path.join(path, *lines)
|
||||
dist.precedence = SOURCE_DIST
|
||||
self.add(dist)
|
||||
|
||||
def process_index(self,url,page):
|
||||
"""Process the contents of a PyPI page"""
|
||||
|
|
@ -373,7 +387,7 @@ class PackageIndex(Environment):
|
|||
# Process a URL to see if it's for a package page
|
||||
if link.startswith(self.index_url):
|
||||
parts = list(map(
|
||||
unquote, link[len(self.index_url):].split('/')
|
||||
urllib.parse.unquote, link[len(self.index_url):].split('/')
|
||||
))
|
||||
if len(parts)==2 and '#' not in parts[1]:
|
||||
# it's a package page, sanitize and index it
|
||||
|
|
@ -386,7 +400,7 @@ class PackageIndex(Environment):
|
|||
# process an index page into the package-page index
|
||||
for match in HREF.finditer(page):
|
||||
try:
|
||||
scan(urljoin(url, htmldecode(match.group(1))))
|
||||
scan(urllib.parse.urljoin(url, htmldecode(match.group(1))))
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
|
|
@ -662,7 +676,7 @@ class PackageIndex(Environment):
|
|||
try:
|
||||
checker = HashChecker.from_url(url)
|
||||
fp = self.open_url(strip_fragment(url))
|
||||
if isinstance(fp, HTTPError):
|
||||
if isinstance(fp, urllib.error.HTTPError):
|
||||
raise DistutilsError(
|
||||
"Can't download %s: %s %s" % (url, fp.code,fp.msg)
|
||||
)
|
||||
|
|
@ -698,21 +712,21 @@ class PackageIndex(Environment):
|
|||
return local_open(url)
|
||||
try:
|
||||
return open_with_auth(url, self.opener)
|
||||
except (ValueError, httplib.InvalidURL) as v:
|
||||
except (ValueError, http_client.InvalidURL) as v:
|
||||
msg = ' '.join([str(arg) for arg in v.args])
|
||||
if warning:
|
||||
self.warn(warning, msg)
|
||||
else:
|
||||
raise DistutilsError('%s %s' % (url, msg))
|
||||
except urllib2.HTTPError as v:
|
||||
except urllib.error.HTTPError as v:
|
||||
return v
|
||||
except urllib2.URLError as v:
|
||||
except urllib.error.URLError as v:
|
||||
if warning:
|
||||
self.warn(warning, v.reason)
|
||||
else:
|
||||
raise DistutilsError("Download error for %s: %s"
|
||||
% (url, v.reason))
|
||||
except httplib.BadStatusLine as v:
|
||||
except http_client.BadStatusLine as v:
|
||||
if warning:
|
||||
self.warn(warning, v.line)
|
||||
else:
|
||||
|
|
@ -721,7 +735,7 @@ class PackageIndex(Environment):
|
|||
'down, %s' %
|
||||
(url, v.line)
|
||||
)
|
||||
except httplib.HTTPException as v:
|
||||
except http_client.HTTPException as v:
|
||||
if warning:
|
||||
self.warn(warning, v)
|
||||
else:
|
||||
|
|
@ -752,7 +766,7 @@ class PackageIndex(Environment):
|
|||
elif scheme.startswith('hg+'):
|
||||
return self._download_hg(url, filename)
|
||||
elif scheme=='file':
|
||||
return url2pathname(urlparse(url)[2])
|
||||
return urllib.request.url2pathname(urllib.parse.urlparse(url)[2])
|
||||
else:
|
||||
self.url_ok(url, True) # raises error if not allowed
|
||||
return self._attempt_download(url, filename)
|
||||
|
|
@ -786,7 +800,7 @@ class PackageIndex(Environment):
|
|||
url = url.split('#',1)[0] # remove any fragment for svn's sake
|
||||
creds = ''
|
||||
if url.lower().startswith('svn:') and '@' in url:
|
||||
scheme, netloc, path, p, q, f = urlparse(url)
|
||||
scheme, netloc, path, p, q, f = urllib.parse.urlparse(url)
|
||||
if not netloc and path.startswith('//') and '/' in path[2:]:
|
||||
netloc, path = path[2:].split('/',1)
|
||||
auth, host = splituser(netloc)
|
||||
|
|
@ -797,14 +811,15 @@ class PackageIndex(Environment):
|
|||
else:
|
||||
creds = " --username="+auth
|
||||
netloc = host
|
||||
url = urlunparse((scheme, netloc, url, p, q, f))
|
||||
parts = scheme, netloc, url, p, q, f
|
||||
url = urllib.parse.urlunparse(parts)
|
||||
self.info("Doing subversion checkout from %s to %s", url, filename)
|
||||
os.system("svn checkout%s -q %s %s" % (creds, url, filename))
|
||||
return filename
|
||||
|
||||
@staticmethod
|
||||
def _vcs_split_rev_from_url(url, pop_prefix=False):
|
||||
scheme, netloc, path, query, frag = urlsplit(url)
|
||||
scheme, netloc, path, query, frag = urllib.parse.urlsplit(url)
|
||||
|
||||
scheme = scheme.split('+', 1)[-1]
|
||||
|
||||
|
|
@ -816,7 +831,7 @@ class PackageIndex(Environment):
|
|||
path, rev = path.rsplit('@', 1)
|
||||
|
||||
# Also, discard fragment
|
||||
url = urlunsplit((scheme, netloc, path, query, ''))
|
||||
url = urllib.parse.urlunsplit((scheme, netloc, path, query, ''))
|
||||
|
||||
return url, rev
|
||||
|
||||
|
|
@ -868,7 +883,7 @@ entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub
|
|||
def uchr(c):
|
||||
if not isinstance(c, int):
|
||||
return c
|
||||
if c>255: return unichr(c)
|
||||
if c>255: return six.unichr(c)
|
||||
return chr(c)
|
||||
|
||||
def decode_entity(match):
|
||||
|
|
@ -878,7 +893,7 @@ def decode_entity(match):
|
|||
elif what.startswith('#'):
|
||||
what = int(what[1:])
|
||||
else:
|
||||
what = name2codepoint.get(what, match.group(0))
|
||||
what = six.moves.html_entities.name2codepoint.get(what, match.group(0))
|
||||
return uchr(what)
|
||||
|
||||
def htmldecode(text):
|
||||
|
|
@ -909,7 +924,7 @@ def _encode_auth(auth):
|
|||
>>> chr(10) in str(_encode_auth(long_auth))
|
||||
False
|
||||
"""
|
||||
auth_s = unquote(auth)
|
||||
auth_s = urllib.parse.unquote(auth)
|
||||
# convert to bytes
|
||||
auth_bytes = auth_s.encode()
|
||||
# use the legacy interface for Python 2.3 support
|
||||
|
|
@ -934,14 +949,14 @@ class Credential(object):
|
|||
def __str__(self):
|
||||
return '%(username)s:%(password)s' % vars(self)
|
||||
|
||||
class PyPIConfig(ConfigParser.ConfigParser):
|
||||
class PyPIConfig(configparser.RawConfigParser):
|
||||
|
||||
def __init__(self):
|
||||
"""
|
||||
Load from ~/.pypirc
|
||||
"""
|
||||
defaults = dict.fromkeys(['username', 'password', 'repository'], '')
|
||||
ConfigParser.ConfigParser.__init__(self, defaults)
|
||||
configparser.RawConfigParser.__init__(self, defaults)
|
||||
|
||||
rc = os.path.join(os.path.expanduser('~'), '.pypirc')
|
||||
if os.path.exists(rc):
|
||||
|
|
@ -973,15 +988,15 @@ class PyPIConfig(ConfigParser.ConfigParser):
|
|||
return cred
|
||||
|
||||
|
||||
def open_with_auth(url, opener=urllib2.urlopen):
|
||||
def open_with_auth(url, opener=urllib.request.urlopen):
|
||||
"""Open a urllib2 request, handling HTTP authentication"""
|
||||
|
||||
scheme, netloc, path, params, query, frag = urlparse(url)
|
||||
scheme, netloc, path, params, query, frag = urllib.parse.urlparse(url)
|
||||
|
||||
# Double scheme does not raise on Mac OS X as revealed by a
|
||||
# failing test. We would expect "nonnumeric port". Refs #20.
|
||||
if netloc.endswith(':'):
|
||||
raise httplib.InvalidURL("nonnumeric port: ''")
|
||||
raise http_client.InvalidURL("nonnumeric port: ''")
|
||||
|
||||
if scheme in ('http', 'https'):
|
||||
auth, host = splituser(netloc)
|
||||
|
|
@ -997,11 +1012,12 @@ def open_with_auth(url, opener=urllib2.urlopen):
|
|||
|
||||
if auth:
|
||||
auth = "Basic " + _encode_auth(auth)
|
||||
new_url = urlunparse((scheme,host,path,params,query,frag))
|
||||
request = urllib2.Request(new_url)
|
||||
parts = scheme, host, path, params, query, frag
|
||||
new_url = urllib.parse.urlunparse(parts)
|
||||
request = urllib.request.Request(new_url)
|
||||
request.add_header("Authorization", auth)
|
||||
else:
|
||||
request = urllib2.Request(url)
|
||||
request = urllib.request.Request(url)
|
||||
|
||||
request.add_header('User-Agent', user_agent)
|
||||
fp = opener(request)
|
||||
|
|
@ -1009,9 +1025,10 @@ def open_with_auth(url, opener=urllib2.urlopen):
|
|||
if auth:
|
||||
# Put authentication info back into request URL if same host,
|
||||
# so that links found on the page will work
|
||||
s2, h2, path2, param2, query2, frag2 = urlparse(fp.url)
|
||||
s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url)
|
||||
if s2==scheme and h2==host:
|
||||
fp.url = urlunparse((s2,netloc,path2,param2,query2,frag2))
|
||||
parts = s2, netloc, path2, param2, query2, frag2
|
||||
fp.url = urllib.parse.urlunparse(parts)
|
||||
|
||||
return fp
|
||||
|
||||
|
|
@ -1024,26 +1041,29 @@ def fix_sf_url(url):
|
|||
|
||||
def local_open(url):
|
||||
"""Read a local path, with special support for directories"""
|
||||
scheme, server, path, param, query, frag = urlparse(url)
|
||||
filename = url2pathname(path)
|
||||
scheme, server, path, param, query, frag = urllib.parse.urlparse(url)
|
||||
filename = urllib.request.url2pathname(path)
|
||||
if os.path.isfile(filename):
|
||||
return urllib2.urlopen(url)
|
||||
return urllib.request.urlopen(url)
|
||||
elif path.endswith('/') and os.path.isdir(filename):
|
||||
files = []
|
||||
for f in os.listdir(filename):
|
||||
if f=='index.html':
|
||||
with open(os.path.join(filename,f),'r') as fp:
|
||||
filepath = os.path.join(filename, f)
|
||||
if f == 'index.html':
|
||||
with open(filepath, 'r') as fp:
|
||||
body = fp.read()
|
||||
break
|
||||
elif os.path.isdir(os.path.join(filename,f)):
|
||||
f+='/'
|
||||
files.append("<a href=%r>%s</a>" % (f,f))
|
||||
elif os.path.isdir(filepath):
|
||||
f += '/'
|
||||
files.append('<a href="{name}">{name}</a>'.format(name=f))
|
||||
else:
|
||||
body = ("<html><head><title>%s</title>" % url) + \
|
||||
"</head><body>%s</body></html>" % '\n'.join(files)
|
||||
tmpl = ("<html><head><title>{url}</title>"
|
||||
"</head><body>{files}</body></html>")
|
||||
body = tmpl.format(url=url, files='\n'.join(files))
|
||||
status, message = 200, "OK"
|
||||
else:
|
||||
status, message, body = 404, "Path not found", "Not found"
|
||||
|
||||
headers = {'content-type': 'text/html'}
|
||||
return HTTPError(url, status, message, headers, StringIO(body))
|
||||
body_stream = six.StringIO(body)
|
||||
return urllib.error.HTTPError(url, status, message, headers, body_stream)
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ except ImportError:
|
|||
import shutil
|
||||
import tempfile
|
||||
class TemporaryDirectory(object):
|
||||
""""
|
||||
"""
|
||||
Very simple temporary directory context manager.
|
||||
Will try to delete afterward, but will also ignore OS and similar
|
||||
errors on deletion.
|
||||
|
|
|
|||
|
|
@ -8,6 +8,9 @@ import re
|
|||
import contextlib
|
||||
import pickle
|
||||
|
||||
from setuptools.extern import six
|
||||
from setuptools.extern.six.moves import builtins, map
|
||||
|
||||
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",
|
||||
]
|
||||
|
|
@ -98,8 +98,8 @@ class UnpickleableException(Exception):
|
|||
"""
|
||||
An exception representing another Exception that could not be pickled.
|
||||
"""
|
||||
@classmethod
|
||||
def dump(cls, type, exc):
|
||||
@staticmethod
|
||||
def dump(type, exc):
|
||||
"""
|
||||
Always return a dumped (pickled) type and exc. If exc can't be pickled,
|
||||
wrap it in UnpickleableException first.
|
||||
|
|
@ -107,6 +107,8 @@ class UnpickleableException(Exception):
|
|||
try:
|
||||
return pickle.dumps(type), pickle.dumps(exc)
|
||||
except Exception:
|
||||
# get UnpickleableException inside the sandbox
|
||||
from setuptools.sandbox import UnpickleableException as cls
|
||||
return cls.dump(cls, cls(repr(exc)))
|
||||
|
||||
|
||||
|
|
@ -136,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
|
||||
|
|
@ -205,8 +207,12 @@ def _needs_hiding(mod_name):
|
|||
True
|
||||
>>> _needs_hiding('distutils')
|
||||
True
|
||||
>>> _needs_hiding('os')
|
||||
False
|
||||
>>> _needs_hiding('Cython')
|
||||
True
|
||||
"""
|
||||
pattern = re.compile('(setuptools|pkg_resources|distutils)(\.|$)')
|
||||
pattern = re.compile('(setuptools|pkg_resources|distutils|Cython)(\.|$)')
|
||||
return bool(pattern.match(mod_name))
|
||||
|
||||
|
||||
|
|
@ -382,6 +388,7 @@ class DirectorySandbox(AbstractSandbox):
|
|||
AbstractSandbox.__init__(self)
|
||||
|
||||
def _violation(self, operation, *args, **kw):
|
||||
from setuptools.sandbox import SandboxViolation
|
||||
raise SandboxViolation(operation, args, kw)
|
||||
|
||||
if _file:
|
||||
|
|
|
|||
|
|
@ -3,9 +3,10 @@ import socket
|
|||
import atexit
|
||||
import re
|
||||
|
||||
from setuptools.extern.six.moves import urllib, http_client, map
|
||||
|
||||
import pkg_resources
|
||||
from pkg_resources import ResolutionError, ExtractionError
|
||||
from setuptools.compat import urllib2
|
||||
|
||||
try:
|
||||
import ssl
|
||||
|
|
@ -24,20 +25,15 @@ cert_paths = """
|
|||
/usr/local/share/certs/ca-root.crt
|
||||
/etc/ssl/cert.pem
|
||||
/System/Library/OpenSSL/certs/cert.pem
|
||||
/usr/local/share/certs/ca-root-nss.crt
|
||||
""".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 +194,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
|
||||
|
||||
|
|
@ -223,6 +219,12 @@ def get_win_certfile():
|
|||
self.addcerts(certs)
|
||||
atexit.register(self.close)
|
||||
|
||||
def close(self):
|
||||
try:
|
||||
super(MyCertFile, self).close()
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
_wincerts = MyCertFile(stores=['CA', 'ROOT'])
|
||||
return _wincerts.name
|
||||
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
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')
|
||||
|
|
@ -22,11 +22,13 @@ def filesys_decode(path):
|
|||
NONE when no expected encoding works
|
||||
"""
|
||||
|
||||
fs_enc = sys.getfilesystemencoding()
|
||||
if isinstance(path, decoded_string):
|
||||
if isinstance(path, six.text_type):
|
||||
return path
|
||||
|
||||
for enc in (fs_enc, "utf-8"):
|
||||
fs_enc = sys.getfilesystemencoding() or 'utf-8'
|
||||
candidates = fs_enc, 'utf-8'
|
||||
|
||||
for enc in candidates:
|
||||
try:
|
||||
return path.decode(enc)
|
||||
except UnicodeDecodeError:
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
__version__ = '18.6.1'
|
||||
__version__ = '20.1.1'
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue