aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGES.txt12
-rwxr-xr-xREADME.txt14
-rw-r--r--docs/easy_install.txt2
-rw-r--r--docs/index.txt2
-rw-r--r--docs/pkg_resources.txt2
-rw-r--r--docs/roadmap.txt12
-rw-r--r--docs/setuptools.txt15
-rw-r--r--ez_setup.py77
-rw-r--r--pkg_resources.py118
-rwxr-xr-xsetup.py70
-rw-r--r--setuptools.egg-info/dependency_links.txt4
-rw-r--r--setuptools.egg-info/entry_points.txt96
-rw-r--r--setuptools.egg-info/requires.txt10
-rw-r--r--setuptools/_backport/__init__.py0
-rw-r--r--setuptools/_backport/hashlib/__init__.py146
-rw-r--r--setuptools/_backport/hashlib/_sha.py359
-rw-r--r--setuptools/_backport/hashlib/_sha256.py260
-rw-r--r--setuptools/_backport/hashlib/_sha512.py288
-rw-r--r--setuptools/command/__init__.py6
-rw-r--r--setuptools/command/build_py.py101
-rwxr-xr-xsetuptools/command/easy_install.py41
-rwxr-xr-xsetuptools/command/egg_info.py116
-rwxr-xr-xsetuptools/command/upload.py183
-rw-r--r--setuptools/command/upload_docs.py24
-rw-r--r--setuptools/compat.py20
-rw-r--r--setuptools/lib2to3_ex.py58
-rwxr-xr-xsetuptools/package_index.py4
-rw-r--r--setuptools/py24compat.py17
-rw-r--r--setuptools/py31compat.py11
-rwxr-xr-xsetuptools/sandbox.py45
-rw-r--r--setuptools/ssl_support.py83
-rw-r--r--setuptools/svn_utils.py45
-rw-r--r--setuptools/tests/doctest.py4
-rw-r--r--setuptools/tests/test_easy_install.py150
-rw-r--r--setuptools/version.py2
35 files changed, 406 insertions, 1991 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 09c6479e..f04f5b91 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -2,6 +2,18 @@
CHANGES
=======
+---
+2.0
+---
+
+* Issue #41: Dropped support for Python 2.4 and Python 2.5. Clients requiring
+ setuptools for those versions of Python should use setuptools 1.x.
+* Removed ``setuptools.command.easy_install.HAS_USER_SITE``. Clients
+ expecting this boolean variable should use ``site.ENABLE_USER_SITE``
+ instead.
+* Removed ``pkg_resources.ImpWrapper``. Clients that expected this class
+ should use ``pkgutil.ImpImporter`` instead.
+
-----
1.4.2
-----
diff --git a/README.txt b/README.txt
index 53608bae..0cc3dd42 100755
--- a/README.txt
+++ b/README.txt
@@ -33,7 +33,7 @@ file and install it for you.
For best results, uninstall previous versions FIRST (see `Uninstalling`_).
-Once installation is complete, you will find an ``easy_install.exe`` program in
+Once installation is complete, you will find an ``easy_install`` program in
your Python ``Scripts`` subdirectory. For simple invocation and best results,
add this directory to your ``PATH`` environment variable, if it is not already
present.
@@ -48,7 +48,9 @@ will download the appropriate version and install it for you::
> wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python
Note that you will may need to invoke the command with superuser privileges to
-install to the system Python.
+install to the system Python::
+
+ > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | sudo python
Alternatively, on Python 2.6 and later, Setuptools may be installed to a
user-local path::
@@ -57,6 +59,14 @@ user-local path::
> python ez_setup.py --user
+Python 2.4 and Python 2.5 support
+=================================
+
+Setuptools 2.0 and later requires Python 2.6 or later. To install setuptools
+on Python 2.4 or Python 2.5, use the bootstrap script for Setuptools 1.x:
+https://bitbucket.org/pypa/setuptools/raw/bootstrap-py24/ez_setup.py.
+
+
Advanced Installation
=====================
diff --git a/docs/easy_install.txt b/docs/easy_install.txt
index a69ddd59..6739ba16 100644
--- a/docs/easy_install.txt
+++ b/docs/easy_install.txt
@@ -35,7 +35,7 @@ Please see the `setuptools PyPI page <https://pypi.python.org/pypi/setuptools>`_
for download links and basic installation instructions for each of the
supported platforms.
-You will need at least Python 2.4. An ``easy_install`` script will be
+You will need at least Python 2.6. An ``easy_install`` script will be
installed in the normal location for Python scripts on your platform.
Note that the instructions on the setuptools PyPI page assume that you are
diff --git a/docs/index.txt b/docs/index.txt
index 8c68651d..53839bee 100644
--- a/docs/index.txt
+++ b/docs/index.txt
@@ -16,7 +16,6 @@ Documentation content:
.. toctree::
:maxdepth: 2
- merge
roadmap
python3
using
@@ -24,3 +23,4 @@ Documentation content:
easy_install
pkg_resources
development
+ merge
diff --git a/docs/pkg_resources.txt b/docs/pkg_resources.txt
index 3aac4720..8dd3e9ab 100644
--- a/docs/pkg_resources.txt
+++ b/docs/pkg_resources.txt
@@ -975,7 +975,7 @@ parsed_version
py_version
The major/minor Python version the distribution supports, as a string.
- For example, "2.3" or "2.4". The default is the current version of Python.
+ For example, "2.7" or "3.4". The default is the current version of Python.
platform
A string representing the platform the distribution is intended for, or
diff --git a/docs/roadmap.txt b/docs/roadmap.txt
index 44bcdb0f..8f175b9f 100644
--- a/docs/roadmap.txt
+++ b/docs/roadmap.txt
@@ -2,13 +2,5 @@
Roadmap
=======
-Setuptools has merged with Distribute and to provide a unified codebase for
-ongoing development.
-
-This new effort will draw from the resources of both projects to leverage
-community contribution for ongoing advancement but also maintain stability
-for the user base.
-
-An initial release of Setuptools 0.7 will attempt to be compatible both with
-Setuptools 0.6c11 and Distribute 0.6.36. Where compatibility cannot be
-achieved, the changes should be well-documented.
+Setuptools is primarily in maintenance mode. The project attempts to address
+user issues, concerns, and feature requests in a timely fashion.
diff --git a/docs/setuptools.txt b/docs/setuptools.txt
index dfa9ecdd..d48ad34f 100644
--- a/docs/setuptools.txt
+++ b/docs/setuptools.txt
@@ -3,19 +3,19 @@ Building and Distributing Packages with Setuptools
==================================================
``Setuptools`` is a collection of enhancements to the Python ``distutils``
-(for Python 2.3.5 and up on most platforms; 64-bit platforms require a minimum
-of Python 2.4) that allow you to more easily build and distribute Python
-packages, especially ones that have dependencies on other packages.
+(for Python 2.6 and up) that allow developers to more easily build and
+distribute Python packages, especially ones that have dependencies on other
+packages.
Packages built and distributed using ``setuptools`` look to the user like
ordinary Python packages based on the ``distutils``. Your users don't need to
install or even know about setuptools in order to use them, and you don't
have to include the entire setuptools package in your distributions. By
-including just a single `bootstrap module`_ (an 8K .py file), your package will
+including just a single `bootstrap module`_ (a 12K .py file), your package will
automatically download and install ``setuptools`` if the user is building your
package from source and doesn't have a suitable version already installed.
-.. _bootstrap module: https://bitbucket.org/pypa/setuptools/downloads/ez_setup.py
+.. _bootstrap module: https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
Feature Highlights:
@@ -28,10 +28,7 @@ Feature Highlights:
* Create `Python Eggs <http://peak.telecommunity.com/DevCenter/PythonEggs>`_ -
a single-file importable distribution format
-* Include data files inside your package directories, where your code can
- actually use them. (Python 2.4 distutils also supports this feature, but
- setuptools provides the feature for Python 2.3 packages also, and supports
- accessing data files in zipped packages too.)
+* Enhanced support for accessing data files hosted in zipped packages.
* Automatically include all packages in your source tree, without listing them
individually in setup.py
diff --git a/ez_setup.py b/ez_setup.py
index 9b380b01..2aa994b3 100644
--- a/ez_setup.py
+++ b/ez_setup.py
@@ -1,14 +1,14 @@
#!python
"""Bootstrap setuptools installation
-If you want to use setuptools in your package's setup.py, just include this
-file in the same directory with it, and add this to the top of your setup.py::
+To use setuptools in your package's setup.py, include this
+file in the same directory and add this to the top of your setup.py::
from ez_setup import use_setuptools
use_setuptools()
-If you want to require a specific version of setuptools, set a download
-mirror, or use an alternate download directory, you can do so by supplying
+To require a specific version of setuptools, set a download
+mirror, or use an alternate download directory, simply supply
the appropriate options to ``use_setuptools()``.
This file can also be run as a script to install or upgrade setuptools.
@@ -21,6 +21,7 @@ import tarfile
import optparse
import subprocess
import platform
+import textwrap
from distutils import log
@@ -29,22 +30,13 @@ try:
except ImportError:
USER_SITE = None
-DEFAULT_VERSION = "1.4.3"
+DEFAULT_VERSION = "2.0"
DEFAULT_URL = "https://pypi.python.org/packages/source/s/setuptools/"
def _python_cmd(*args):
args = (sys.executable,) + args
return subprocess.call(args) == 0
-def _check_call_py24(cmd, *args, **kwargs):
- res = subprocess.call(cmd, *args, **kwargs)
- class CalledProcessError(Exception):
- pass
- if not res == 0:
- msg = "Command '%s' return non-zero exit status %d" % (cmd, res)
- raise CalledProcessError(msg)
-vars(subprocess).setdefault('check_call', _check_call_py24)
-
def _install(tarball, install_args=()):
# extracting the tarball
tmpdir = tempfile.mkdtemp()
@@ -122,10 +114,9 @@ def _do_download(version, download_base, to_dir, download_delay):
def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
to_dir=os.curdir, download_delay=15):
- # making sure we use the absolute path
to_dir = os.path.abspath(to_dir)
- was_imported = 'pkg_resources' in sys.modules or \
- 'setuptools' in sys.modules
+ rep_modules = 'pkg_resources', 'setuptools'
+ imported = set(sys.modules).intersection(rep_modules)
try:
import pkg_resources
except ImportError:
@@ -133,23 +124,24 @@ def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL,
try:
pkg_resources.require("setuptools>=" + version)
return
- except pkg_resources.VersionConflict:
- e = sys.exc_info()[1]
- if was_imported:
- sys.stderr.write(
- "The required version of setuptools (>=%s) is not available,\n"
- "and can't be installed while this script is running. Please\n"
- "install a more recent version first, using\n"
- "'easy_install -U setuptools'."
- "\n\n(Currently using %r)\n" % (version, e.args[0]))
- sys.exit(2)
- else:
- del pkg_resources, sys.modules['pkg_resources'] # reload ok
- return _do_download(version, download_base, to_dir,
- download_delay)
except pkg_resources.DistributionNotFound:
- return _do_download(version, download_base, to_dir,
- download_delay)
+ return _do_download(version, download_base, to_dir, download_delay)
+ except pkg_resources.VersionConflict as VC_err:
+ if imported:
+ msg = textwrap.dedent("""
+ The required version of setuptools (>={version}) is not available,
+ and can't be installed while this script is running. Please
+ install a more recent version first, using
+ 'easy_install -U setuptools'.
+
+ (Currently using {VC_err.args[0]!r})
+ """).format(VC_err=VC_err, version=version)
+ sys.stderr.write(msg)
+ sys.exit(2)
+
+ # otherwise, reload ok
+ del pkg_resources, sys.modules['pkg_resources']
+ return _do_download(version, download_base, to_dir, download_delay)
def _clean_check(cmd, target):
"""
@@ -315,13 +307,7 @@ def _extractall(self, path=".", members=None):
self.extract(tarinfo, path)
# Reverse sort directories.
- if sys.version_info < (2, 4):
- def sorter(dir1, dir2):
- return cmp(dir1.name, dir2.name)
- directories.sort(sorter)
- directories.reverse()
- else:
- directories.sort(key=operator.attrgetter('name'), reverse=True)
+ directories.sort(key=operator.attrgetter('name'), reverse=True)
# Set correct owner, mtime and filemode on directories.
for tarinfo in directories:
@@ -330,8 +316,7 @@ def _extractall(self, path=".", members=None):
self.chown(tarinfo, dirpath)
self.utime(tarinfo, dirpath)
self.chmod(tarinfo, dirpath)
- except ExtractError:
- e = sys.exc_info()[1]
+ except ExtractError as e:
if self.errorlevel > 1:
raise
else:
@@ -342,13 +327,7 @@ def _build_install_args(options):
"""
Build the arguments to 'python setup.py install' on the setuptools package
"""
- install_args = []
- if options.user_install:
- if sys.version_info < (2, 6):
- log.warn("--user requires Python 2.6 or later")
- raise SystemExit(1)
- install_args.append('--user')
- return install_args
+ return ['--user'] if options.user_install else []
def _parse_args():
"""
diff --git a/pkg_resources.py b/pkg_resources.py
index 02976016..36a7b306 100644
--- a/pkg_resources.py
+++ b/pkg_resources.py
@@ -22,6 +22,10 @@ import zipfile
import zipimport
import warnings
import stat
+import functools
+import pkgutil
+from pkgutil import get_importer
+
try:
from urlparse import urlparse, urlunparse
except ImportError:
@@ -35,28 +39,15 @@ try:
basestring
next = lambda o: o.next()
from cStringIO import StringIO as BytesIO
- def exec_(code, globs=None, locs=None):
- if globs is None:
- frame = sys._getframe(1)
- globs = frame.f_globals
- if locs is None:
- locs = frame.f_locals
- del frame
- elif locs is None:
- locs = globs
- exec("""exec code in globs, locs""")
except NameError:
basestring = str
from io import BytesIO
- exec_ = eval("exec")
def execfile(fn, globs=None, locs=None):
if globs is None:
globs = globals()
if locs is None:
locs = globs
- exec_(compile(open(fn).read(), fn, 'exec'), globs, locs)
- import functools
- reduce = functools.reduce
+ exec(compile(open(fn).read(), fn, 'exec'), globs, locs)
# capture these to bypass sandboxing
from os import utime
@@ -716,7 +707,7 @@ class Environment(object):
`platform` is an optional string specifying the name of the platform
that platform-specific distributions must be compatible with. If
unspecified, it defaults to the current platform. `python` is an
- optional string naming the desired version of Python (e.g. ``'2.4'``);
+ optional string naming the desired version of Python (e.g. ``'3.3'``);
it defaults to the current version.
You may explicitly set `platform` (and/or `python`) to ``None`` if you
@@ -1189,11 +1180,11 @@ def evaluate_marker(text, extra=None, _ops={}):
def and_test(nodelist):
# MUST NOT short-circuit evaluation, or invalid syntax can be skipped!
- return reduce(operator.and_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)])
+ return functools.reduce(operator.and_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)])
def test(nodelist):
# MUST NOT short-circuit evaluation, or invalid syntax can be skipped!
- return reduce(operator.or_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)])
+ return functools.reduce(operator.or_, [interpret(nodelist[i]) for i in range(1,len(nodelist),2)])
def atom(nodelist):
t = nodelist[1][0]
@@ -1354,7 +1345,7 @@ class NullProvider:
len(script_text), 0, script_text.split('\n'), script_filename
)
script_code = compile(script_text,script_filename,'exec')
- exec_(script_code, namespace, namespace)
+ exec(script_code, namespace, namespace)
def _has(self, path):
raise NotImplementedError(
@@ -1712,83 +1703,6 @@ class EggMetadata(ZipProvider):
self.module_path = importer.archive
self._setup_prefix()
-
-class ImpWrapper:
- """PEP 302 Importer that wraps Python's "normal" import algorithm"""
-
- def __init__(self, path=None):
- self.path = path
-
- def find_module(self, fullname, path=None):
- subname = fullname.split(".")[-1]
- if subname != fullname and self.path is None:
- return None
- if self.path is None:
- path = None
- else:
- path = [self.path]
- try:
- file, filename, etc = imp.find_module(subname, path)
- except ImportError:
- return None
- return ImpLoader(file, filename, etc)
-
-
-class ImpLoader:
- """PEP 302 Loader that wraps Python's "normal" import algorithm"""
-
- def __init__(self, file, filename, etc):
- self.file = file
- self.filename = filename
- self.etc = etc
-
- def load_module(self, fullname):
- try:
- mod = imp.load_module(fullname, self.file, self.filename, self.etc)
- finally:
- if self.file: self.file.close()
- # Note: we don't set __loader__ because we want the module to look
- # normal; i.e. this is just a wrapper for standard import machinery
- return mod
-
-
-def get_importer(path_item):
- """Retrieve a PEP 302 "importer" for the given path item
-
- If there is no importer, this returns a wrapper around the builtin import
- machinery. The returned importer is only cached if it was created by a
- path hook.
- """
- try:
- importer = sys.path_importer_cache[path_item]
- except KeyError:
- for hook in sys.path_hooks:
- try:
- importer = hook(path_item)
- except ImportError:
- pass
- else:
- break
- else:
- importer = None
-
- sys.path_importer_cache.setdefault(path_item,importer)
- if importer is None:
- try:
- importer = ImpWrapper(path_item)
- except ImportError:
- pass
- return importer
-
-try:
- from pkgutil import get_importer, ImpImporter
-except ImportError:
- pass # Python 2.3 or 2.4, use our own implementation
-else:
- ImpWrapper = ImpImporter # Python 2.5, use pkgutil's implementation
- del ImpLoader, ImpImporter
-
-
_declare_state('dict', _distribution_finders = {})
def register_finder(importer_type, distribution_finder):
@@ -1865,7 +1779,7 @@ def find_on_path(importer, path_item, only=False):
for item in find_distributions(os.path.join(path_item,line.rstrip())):
yield item
break
-register_finder(ImpWrapper,find_on_path)
+register_finder(pkgutil.ImpImporter,find_on_path)
if importlib_bootstrap is not None:
register_finder(importlib_bootstrap.FileFinder, find_on_path)
@@ -1902,14 +1816,17 @@ def _handle_ns(packageName, path_item):
module = sys.modules.get(packageName)
if module is None:
module = sys.modules[packageName] = imp.new_module(packageName)
- module.__path__ = []; _set_parent_ns(packageName)
+ module.__path__ = []
+ _set_parent_ns(packageName)
elif not hasattr(module,'__path__'):
raise TypeError("Not a package:", packageName)
handler = _find_adapter(_namespace_handlers, importer)
subpath = handler(importer,path_item,packageName,module)
if subpath is not None:
- path = module.__path__; path.append(subpath)
- loader.load_module(packageName); module.__path__ = path
+ path = module.__path__
+ path.append(subpath)
+ loader.load_module(packageName)
+ module.__path__ = path
return subpath
def declare_namespace(packageName):
@@ -1966,7 +1883,7 @@ def file_ns_handler(importer, path_item, packageName, module):
# Only return the path if it's not already there
return subpath
-register_namespace_handler(ImpWrapper,file_ns_handler)
+register_namespace_handler(pkgutil.ImpImporter,file_ns_handler)
register_namespace_handler(zipimport.zipimporter,file_ns_handler)
if importlib_bootstrap is not None:
@@ -2420,7 +2337,6 @@ class Distribution(object):
bdir = os.path.dirname(nloc)
npath= [(p and _normalize_cached(p) or p) for p in path]
- bp = None
for p, item in enumerate(npath):
if item==nloc:
break
diff --git a/setup.py b/setup.py
index d08d7144..15ba65f6 100755
--- a/setup.py
+++ b/setup.py
@@ -13,17 +13,15 @@ from distutils.util import convert_path
command_ns = {}
init_path = convert_path('setuptools/command/__init__.py')
-init_file = open(init_path)
-exec(init_file.read(), command_ns)
-init_file.close()
+with open(init_path) as init_file:
+ exec(init_file.read(), command_ns)
SETUP_COMMANDS = command_ns['__all__']
main_ns = {}
ver_path = convert_path('setuptools/version.py')
-ver_file = open(ver_path)
-exec(ver_file.read(), main_ns)
-ver_file.close()
+with open(ver_path) as ver_file:
+ exec(ver_file.read(), main_ns)
import setuptools
from setuptools.command.build_py import build_py as _build_py
@@ -31,20 +29,28 @@ from setuptools.command.test import test as _test
scripts = []
-console_scripts = ["easy_install = setuptools.command.easy_install:main"]
+def _gen_console_scripts():
+ yield "easy_install = setuptools.command.easy_install:main"
+
+ # Gentoo distributions manage the python-version-specific scripts
+ # themselves, so those platforms define an environment variable to
+ # suppress the creation of the version-specific scripts.
+ var_names = (
+ 'SETUPTOOLS_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT',
+ 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT',
+ )
+ if any(os.environ.get(var) not in (None, "", "0") for var in var_names):
+ return
+ yield ("easy_install-{shortver} = setuptools.command.easy_install:main"
+ .format(shortver=sys.version[:3]))
+
+console_scripts = list(_gen_console_scripts())
-# Gentoo distributions manage the python-version-specific scripts themselves,
-# so they define an environment variable to suppress the creation of the
-# version-specific scripts.
-if os.environ.get("SETUPTOOLS_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT") in (None, "", "0") and \
- os.environ.get("DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT") in (None, "", "0"):
- console_scripts.append("easy_install-%s = setuptools.command.easy_install:main" % sys.version[:3])
# specific command that is used to generate windows .exe files
class build_py(_build_py):
def build_package_data(self):
"""Copy data files into build directory"""
- lastdir = None
for package, src_dir, build_dir, filenames in self.data_files:
for filename in filenames:
target = os.path.join(build_dir, filename)
@@ -62,23 +68,17 @@ class test(_test):
_test.run(self)
return # even though _test.run will raise SystemExit
- f = open(entry_points)
-
- # running the test
- try:
+ # save the content
+ with open(entry_points) as f:
ep_content = f.read()
- finally:
- f.close()
+ # run the test
try:
_test.run(self)
finally:
- # restoring the file
- f = open(entry_points, 'w')
- try:
+ # restore the file
+ with open(entry_points, 'w') as f:
f.write(ep_content)
- finally:
- f.close()
readme_file = open('README.txt')
@@ -88,12 +88,16 @@ if os.path.exists('CHANGES (links).txt'):
else:
# but if the release script has not run, fall back to the source file
changes_file = open('CHANGES.txt')
-long_description = readme_file.read() + '\n' + changes_file.read()
-readme_file.close()
-changes_file.close()
+with readme_file:
+ with changes_file:
+ long_description = readme_file.read() + '\n' + changes_file.read()
package_data = {'setuptools': ['site-patch.py']}
-if sys.platform == 'win32' or os.environ.get("SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES") not in (None, "", "0"):
+force_windows_specific_files = (
+ os.environ.get("SETUPTOOLS_INSTALL_WINDOWS_SPECIFIC_FILES")
+ not in (None, "", "0")
+)
+if sys.platform == 'win32' or force_windows_specific_files:
package_data.setdefault('setuptools', []).extend(['*.exe'])
package_data.setdefault('setuptools.command', []).extend(['*.xml'])
@@ -169,8 +173,6 @@ setup_params = dict(
License :: OSI Approved :: Python Software Foundation License
License :: OSI Approved :: Zope Public License
Operating System :: OS Independent
- Programming Language :: Python :: 2.4
- Programming Language :: Python :: 2.5
Programming Language :: Python :: 2.6
Programming Language :: Python :: 2.7
Programming Language :: Python :: 3
@@ -184,17 +186,11 @@ setup_params = dict(
""").strip().splitlines(),
extras_require = {
"ssl:sys_platform=='win32'": "wincertstore==0.1",
- "ssl:sys_platform=='win32' and python_version=='2.4'": "ctypes==1.0.2",
- "ssl:python_version in '2.4, 2.5'":"ssl==1.16",
"certs": "certifi==0.0.8",
},
dependency_links = [
'https://pypi.python.org/packages/source/c/certifi/certifi-0.0.8.tar.gz#md5=dc5f5e7f0b5fc08d27654b17daa6ecec',
- 'https://pypi.python.org/packages/source/s/ssl/ssl-1.16.tar.gz#md5=fb12d335d56f3c8c7c1fefc1c06c4bfb',
'https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.1.zip#md5=2f9accbebe8f7b4c06ac7aa83879b81c',
- 'https://bitbucket.org/pypa/setuptools/downloads/ctypes-1.0.2.win32-py2.4.exe#md5=9092a0ad5a3d79fa2d980f1ddc5e9dbc',
- 'https://bitbucket.org/pypa/setuptools/downloads/ssl-1.16-py2.4-win32.egg#md5=3cfa2c526dc66e318e8520b6f1aadce5',
- 'https://bitbucket.org/pypa/setuptools/downloads/ssl-1.16-py2.5-win32.egg#md5=85ad1cda806d639743121c0bbcb5f39b',
],
scripts = [],
# tests_require = "setuptools[ssl]",
diff --git a/setuptools.egg-info/dependency_links.txt b/setuptools.egg-info/dependency_links.txt
index c688b7ea..b1c9a2c9 100644
--- a/setuptools.egg-info/dependency_links.txt
+++ b/setuptools.egg-info/dependency_links.txt
@@ -1,6 +1,2 @@
https://pypi.python.org/packages/source/c/certifi/certifi-0.0.8.tar.gz#md5=dc5f5e7f0b5fc08d27654b17daa6ecec
-https://pypi.python.org/packages/source/s/ssl/ssl-1.16.tar.gz#md5=fb12d335d56f3c8c7c1fefc1c06c4bfb
https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.1.zip#md5=2f9accbebe8f7b4c06ac7aa83879b81c
-https://bitbucket.org/pypa/setuptools/downloads/ctypes-1.0.2.win32-py2.4.exe#md5=9092a0ad5a3d79fa2d980f1ddc5e9dbc
-https://bitbucket.org/pypa/setuptools/downloads/ssl-1.16-py2.4-win32.egg#md5=3cfa2c526dc66e318e8520b6f1aadce5
-https://bitbucket.org/pypa/setuptools/downloads/ssl-1.16-py2.5-win32.egg#md5=85ad1cda806d639743121c0bbcb5f39b
diff --git a/setuptools.egg-info/entry_points.txt b/setuptools.egg-info/entry_points.txt
index f574d182..d423a67d 100644
--- a/setuptools.egg-info/entry_points.txt
+++ b/setuptools.egg-info/entry_points.txt
@@ -1,62 +1,62 @@
-[setuptools.installation]
-eggsecutable = setuptools.command.easy_install:bootstrap
-
[console_scripts]
-easy_install-3.3 = setuptools.command.easy_install:main
easy_install = setuptools.command.easy_install:main
+easy_install-3.3 = setuptools.command.easy_install:main
-[egg_info.writers]
-PKG-INFO = setuptools.command.egg_info:write_pkg_info
-top_level.txt = setuptools.command.egg_info:write_toplevel_names
-entry_points.txt = setuptools.command.egg_info:write_entries
-eager_resources.txt = setuptools.command.egg_info:overwrite_arg
-depends.txt = setuptools.command.egg_info:warn_depends_obsolete
-namespace_packages.txt = setuptools.command.egg_info:overwrite_arg
-requires.txt = setuptools.command.egg_info:write_requirements
-dependency_links.txt = setuptools.command.egg_info:overwrite_arg
-
-[distutils.commands]
-egg_info = setuptools.command.egg_info:egg_info
-saveopts = setuptools.command.saveopts:saveopts
-develop = setuptools.command.develop:develop
-test = setuptools.command.test:test
-rotate = setuptools.command.rotate:rotate
-build_py = setuptools.command.build_py:build_py
-easy_install = setuptools.command.easy_install:easy_install
-bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm
-install_scripts = setuptools.command.install_scripts:install_scripts
-bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst
-install = setuptools.command.install:install
-register = setuptools.command.register:register
-setopt = setuptools.command.setopt:setopt
-build_ext = setuptools.command.build_ext:build_ext
-upload_docs = setuptools.command.upload_docs:upload_docs
-install_egg_info = setuptools.command.install_egg_info:install_egg_info
-alias = setuptools.command.alias:alias
-sdist = setuptools.command.sdist:sdist
-bdist_egg = setuptools.command.bdist_egg:bdist_egg
-install_lib = setuptools.command.install_lib:install_lib
+[setuptools.installation]
+eggsecutable = setuptools.command.easy_install:bootstrap
[setuptools.file_finders]
svn_cvs = setuptools.command.sdist:_default_revctrl
[distutils.setup_keywords]
-zip_safe = setuptools.dist:assert_bool
-test_suite = setuptools.dist:check_test_suite
-use_2to3_exclude_fixers = setuptools.dist:assert_string_list
-test_loader = setuptools.dist:check_importable
-entry_points = setuptools.dist:check_entry_points
-tests_require = setuptools.dist:check_requirements
+use_2to3_fixers = setuptools.dist:assert_string_list
package_data = setuptools.dist:check_package_data
-dependency_links = setuptools.dist:assert_string_list
+use_2to3 = setuptools.dist:assert_bool
namespace_packages = setuptools.dist:check_nsp
-include_package_data = setuptools.dist:assert_bool
-extras_require = setuptools.dist:check_extras
-eager_resources = setuptools.dist:assert_string_list
+test_suite = setuptools.dist:check_test_suite
+use_2to3_exclude_fixers = setuptools.dist:assert_string_list
packages = setuptools.dist:check_packages
-convert_2to3_doctests = setuptools.dist:assert_string_list
-use_2to3 = setuptools.dist:assert_bool
exclude_package_data = setuptools.dist:check_package_data
-use_2to3_fixers = setuptools.dist:assert_string_list
+dependency_links = setuptools.dist:assert_string_list
+eager_resources = setuptools.dist:assert_string_list
install_requires = setuptools.dist:check_requirements
+include_package_data = setuptools.dist:assert_bool
+convert_2to3_doctests = setuptools.dist:assert_string_list
+entry_points = setuptools.dist:check_entry_points
+extras_require = setuptools.dist:check_extras
+test_loader = setuptools.dist:check_importable
+tests_require = setuptools.dist:check_requirements
+zip_safe = setuptools.dist:assert_bool
+
+[distutils.commands]
+bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst
+test = setuptools.command.test:test
+install = setuptools.command.install:install
+register = setuptools.command.register:register
+develop = setuptools.command.develop:develop
+bdist_egg = setuptools.command.bdist_egg:bdist_egg
+egg_info = setuptools.command.egg_info:egg_info
+build_ext = setuptools.command.build_ext:build_ext
+setopt = setuptools.command.setopt:setopt
+easy_install = setuptools.command.easy_install:easy_install
+upload_docs = setuptools.command.upload_docs:upload_docs
+bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm
+install_lib = setuptools.command.install_lib:install_lib
+rotate = setuptools.command.rotate:rotate
+sdist = setuptools.command.sdist:sdist
+alias = setuptools.command.alias:alias
+saveopts = setuptools.command.saveopts:saveopts
+build_py = setuptools.command.build_py:build_py
+install_egg_info = setuptools.command.install_egg_info:install_egg_info
+install_scripts = setuptools.command.install_scripts:install_scripts
+
+[egg_info.writers]
+PKG-INFO = setuptools.command.egg_info:write_pkg_info
+top_level.txt = setuptools.command.egg_info:write_toplevel_names
+namespace_packages.txt = setuptools.command.egg_info:overwrite_arg
+eager_resources.txt = setuptools.command.egg_info:overwrite_arg
+depends.txt = setuptools.command.egg_info:warn_depends_obsolete
+dependency_links.txt = setuptools.command.egg_info:overwrite_arg
+requires.txt = setuptools.command.egg_info:write_requirements
+entry_points.txt = setuptools.command.egg_info:write_entries
diff --git a/setuptools.egg-info/requires.txt b/setuptools.egg-info/requires.txt
index 256342f0..9a6bf437 100644
--- a/setuptools.egg-info/requires.txt
+++ b/setuptools.egg-info/requires.txt
@@ -1,13 +1,7 @@
-[ssl:sys_platform=='win32']
-wincertstore==0.1
-
[certs]
certifi==0.0.8
-[ssl:sys_platform=='win32' and python_version=='2.4']
-ctypes==1.0.2
-
-[ssl:python_version in '2.4, 2.5']
-ssl==1.16 \ No newline at end of file
+[ssl:sys_platform=='win32']
+wincertstore==0.1 \ No newline at end of file
diff --git a/setuptools/_backport/__init__.py b/setuptools/_backport/__init__.py
deleted file mode 100644
index e69de29b..00000000
--- a/setuptools/_backport/__init__.py
+++ /dev/null
diff --git a/setuptools/_backport/hashlib/__init__.py b/setuptools/_backport/hashlib/__init__.py
deleted file mode 100644
index 5aeab496..00000000
--- a/setuptools/_backport/hashlib/__init__.py
+++ /dev/null
@@ -1,146 +0,0 @@
-# $Id$
-#
-# Copyright (C) 2005 Gregory P. Smith (greg@krypto.org)
-# Licensed to PSF under a Contributor Agreement.
-#
-
-__doc__ = """hashlib module - A common interface to many hash functions.
-
-new(name, string='') - returns a new hash object implementing the
- given hash function; initializing the hash
- using the given string data.
-
-Named constructor functions are also available, these are much faster
-than using new():
-
-md5(), sha1(), sha224(), sha256(), sha384(), and sha512()
-
-More algorithms may be available on your platform but the above are
-guaranteed to exist.
-
-NOTE: If you want the adler32 or crc32 hash functions they are available in
-the zlib module.
-
-Choose your hash function wisely. Some have known collision weaknesses.
-sha384 and sha512 will be slow on 32 bit platforms.
-
-Hash objects have these methods:
- - update(arg): Update the hash object with the string arg. Repeated calls
- are equivalent to a single call with the concatenation of all
- the arguments.
- - digest(): Return the digest of the strings passed to the update() method
- so far. This may contain non-ASCII characters, including
- NUL bytes.
- - hexdigest(): Like digest() except the digest is returned as a string of
- double length, containing only hexadecimal digits.
- - copy(): Return a copy (clone) of the hash object. This can be used to
- efficiently compute the digests of strings that share a common
- initial substring.
-
-For example, to obtain the digest of the string 'Nobody inspects the
-spammish repetition':
-
- >>> import hashlib
- >>> m = hashlib.md5()
- >>> m.update("Nobody inspects")
- >>> m.update(" the spammish repetition")
- >>> m.digest()
- '\\xbbd\\x9c\\x83\\xdd\\x1e\\xa5\\xc9\\xd9\\xde\\xc9\\xa1\\x8d\\xf0\\xff\\xe9'
-
-More condensed:
-
- >>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest()
- 'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
-
-"""
-
-# This tuple and __get_builtin_constructor() must be modified if a new
-# always available algorithm is added.
-__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
-
-algorithms = __always_supported
-
-__all__ = __always_supported + ('new', 'algorithms')
-
-
-def __get_builtin_constructor(name):
- try:
- if name in ('SHA1', 'sha1'):
- import _sha
- return _sha.new
- elif name in ('MD5', 'md5'):
- import md5
- return md5.new
- elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'):
- import _sha256
- bs = name[3:]
- if bs == '256':
- return _sha256.sha256
- elif bs == '224':
- return _sha256.sha224
- elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'):
- import _sha512
- bs = name[3:]
- if bs == '512':
- return _sha512.sha512
- elif bs == '384':
- return _sha512.sha384
- except ImportError:
- pass # no extension module, this hash is unsupported.
-
- raise ValueError('unsupported hash type %s' % name)
-
-
-def __get_openssl_constructor(name):
- try:
- f = getattr(_hashlib, 'openssl_' + name)
- # Allow the C module to raise ValueError. The function will be
- # defined but the hash not actually available thanks to OpenSSL.
- f()
- # Use the C function directly (very fast)
- return f
- except (AttributeError, ValueError):
- return __get_builtin_constructor(name)
-
-
-def __py_new(name, string=''):
- """new(name, string='') - Return a new hashing object using the named algorithm;
- optionally initialized with a string.
- """
- return __get_builtin_constructor(name)(string)
-
-
-def __hash_new(name, string=''):
- """new(name, string='') - Return a new hashing object using the named algorithm;
- optionally initialized with a string.
- """
- try:
- return _hashlib.new(name, string)
- except ValueError:
- # If the _hashlib module (OpenSSL) doesn't support the named
- # hash, try using our builtin implementations.
- # This allows for SHA224/256 and SHA384/512 support even though
- # the OpenSSL library prior to 0.9.8 doesn't provide them.
- return __get_builtin_constructor(name)(string)
-
-
-try:
- import _hashlib
- new = __hash_new
- __get_hash = __get_openssl_constructor
-except ImportError:
- new = __py_new
- __get_hash = __get_builtin_constructor
-
-for __func_name in __always_supported:
- # try them all, some may not work due to the OpenSSL
- # version not supporting that algorithm.
- try:
- globals()[__func_name] = __get_hash(__func_name)
- except ValueError:
- import logging
- logging.exception('code for hash %s was not found.', __func_name)
-
-# Cleanup locals()
-del __always_supported, __func_name, __get_hash
-del __py_new, __hash_new, __get_openssl_constructor
diff --git a/setuptools/_backport/hashlib/_sha.py b/setuptools/_backport/hashlib/_sha.py
deleted file mode 100644
index d49993c8..00000000
--- a/setuptools/_backport/hashlib/_sha.py
+++ /dev/null
@@ -1,359 +0,0 @@
-# -*- coding: iso-8859-1 -*-
-"""A sample implementation of SHA-1 in pure Python.
-
- Framework adapted from Dinu Gherman's MD5 implementation by
- J. Hallén and L. Creighton. SHA-1 implementation based directly on
- the text of the NIST standard FIPS PUB 180-1.
-"""
-
-
-__date__ = '2004-11-17'
-__version__ = 0.91 # Modernised by J. Hallén and L. Creighton for Pypy
-
-
-import struct, copy
-
-
-# ======================================================================
-# Bit-Manipulation helpers
-#
-# _long2bytes() was contributed by Barry Warsaw
-# and is reused here with tiny modifications.
-# ======================================================================
-
-def _long2bytesBigEndian(n, blocksize=0):
- """Convert a long integer to a byte string.
-
- If optional blocksize is given and greater than zero, pad the front
- of the byte string with binary zeros so that the length is a multiple
- of blocksize.
- """
-
- # After much testing, this algorithm was deemed to be the fastest.
- s = ''
- pack = struct.pack
- while n > 0:
- s = pack('>I', n & 0xffffffff) + s
- n = n >> 32
-
- # Strip off leading zeros.
- for i in range(len(s)):
- if s[i] != '\000':
- break
- else:
- # Only happens when n == 0.
- s = '\000'
- i = 0
-
- s = s[i:]
-
- # Add back some pad bytes. This could be done more efficiently
- # w.r.t. the de-padding being done above, but sigh...
- if blocksize > 0 and len(s) % blocksize:
- s = (blocksize - len(s) % blocksize) * '\000' + s
-
- return s
-
-
-def _bytelist2longBigEndian(list):
- "Transform a list of characters into a list of longs."
-
- imax = len(list) // 4
- hl = [0] * imax
-
- j = 0
- i = 0
- while i < imax:
- b0 = ord(list[j]) << 24
- b1 = ord(list[j+1]) << 16
- b2 = ord(list[j+2]) << 8
- b3 = ord(list[j+3])
- hl[i] = b0 | b1 | b2 | b3
- i = i+1
- j = j+4
-
- return hl
-
-
-def _rotateLeft(x, n):
- "Rotate x (32 bit) left n bits circularly."
-
- return (x << n) | (x >> (32-n))
-
-
-# ======================================================================
-# The SHA transformation functions
-#
-# ======================================================================
-
-def f0_19(B, C, D):
- return (B & C) | ((~ B) & D)
-
-def f20_39(B, C, D):
- return B ^ C ^ D
-
-def f40_59(B, C, D):
- return (B & C) | (B & D) | (C & D)
-
-def f60_79(B, C, D):
- return B ^ C ^ D
-
-
-f = [f0_19, f20_39, f40_59, f60_79]
-
-# Constants to be used
-K = [
- 0x5A827999, # ( 0 <= t <= 19)
- 0x6ED9EBA1, # (20 <= t <= 39)
- 0x8F1BBCDC, # (40 <= t <= 59)
- 0xCA62C1D6 # (60 <= t <= 79)
- ]
-
-class sha:
- "An implementation of the MD5 hash function in pure Python."
-
- digest_size = digestsize = 20
- block_size = 1
-
- def __init__(self):
- "Initialisation."
-
- # Initial message length in bits(!).
- self.length = 0
- self.count = [0, 0]
-
- # Initial empty message as a sequence of bytes (8 bit characters).
- self.input = []
-
- # Call a separate init function, that can be used repeatedly
- # to start from scratch on the same object.
- self.init()
-
-
- def init(self):
- "Initialize the message-digest and set all fields to zero."
-
- self.length = 0
- self.input = []
-
- # Initial 160 bit message digest (5 times 32 bit).
- self.H0 = 0x67452301
- self.H1 = 0xEFCDAB89
- self.H2 = 0x98BADCFE
- self.H3 = 0x10325476
- self.H4 = 0xC3D2E1F0
-
- def _transform(self, W):
-
- for t in range(16, 80):
- W.append(_rotateLeft(
- W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16], 1) & 0xffffffff)
-
- A = self.H0
- B = self.H1
- C = self.H2
- D = self.H3
- E = self.H4
-
- """
- This loop was unrolled to gain about 10% in speed
- for t in range(0, 80):
- TEMP = _rotateLeft(A, 5) + f[t/20] + E + W[t] + K[t/20]
- E = D
- D = C
- C = _rotateLeft(B, 30) & 0xffffffff
- B = A
- A = TEMP & 0xffffffff
- """
-
- for t in range(0, 20):
- TEMP = _rotateLeft(A, 5) + ((B & C) | ((~ B) & D)) + E + W[t] + K[0]
- E = D
- D = C
- C = _rotateLeft(B, 30) & 0xffffffff
- B = A
- A = TEMP & 0xffffffff
-
- for t in range(20, 40):
- TEMP = _rotateLeft(A, 5) + (B ^ C ^ D) + E + W[t] + K[1]
- E = D
- D = C
- C = _rotateLeft(B, 30) & 0xffffffff
- B = A
- A = TEMP & 0xffffffff
-
- for t in range(40, 60):
- TEMP = _rotateLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]
- E = D
- D = C
- C = _rotateLeft(B, 30) & 0xffffffff
- B = A
- A = TEMP & 0xffffffff
-
- for t in range(60, 80):
- TEMP = _rotateLeft(A, 5) + (B ^ C ^ D) + E + W[t] + K[3]
- E = D
- D = C
- C = _rotateLeft(B, 30) & 0xffffffff
- B = A
- A = TEMP & 0xffffffff
-
-
- self.H0 = (self.H0 + A) & 0xffffffff
- self.H1 = (self.H1 + B) & 0xffffffff
- self.H2 = (self.H2 + C) & 0xffffffff
- self.H3 = (self.H3 + D) & 0xffffffff
- self.H4 = (self.H4 + E) & 0xffffffff
-
-
- # Down from here all methods follow the Python Standard Library
- # API of the sha module.
-
- def update(self, inBuf):
- """Add to the current message.
-
- Update the md5 object with the string arg. Repeated calls
- are equivalent to a single call with the concatenation of all
- the arguments, i.e. m.update(a); m.update(b) is equivalent
- to m.update(a+b).
-
- The hash is immediately calculated for all full blocks. The final
- calculation is made in digest(). It will calculate 1-2 blocks,
- depending on how much padding we have to add. This allows us to
- keep an intermediate value for the hash, so that we only need to
- make minimal recalculation if we call update() to add more data
- to the hashed string.
- """
-
- leninBuf = len(inBuf)
-
- # Compute number of bytes mod 64.
- index = (self.count[1] >> 3) & 0x3F
-
- # Update number of bits.
- self.count[1] = self.count[1] + (leninBuf << 3)
- if self.count[1] < (leninBuf << 3):
- self.count[0] = self.count[0] + 1
- self.count[0] = self.count[0] + (leninBuf >> 29)
-
- partLen = 64 - index
-
- if leninBuf >= partLen:
- self.input[index:] = list(inBuf[:partLen])
- self._transform(_bytelist2longBigEndian(self.input))
- i = partLen
- while i + 63 < leninBuf:
- self._transform(_bytelist2longBigEndian(list(inBuf[i:i+64])))
- i = i + 64
- else:
- self.input = list(inBuf[i:leninBuf])
- else:
- i = 0
- self.input = self.input + list(inBuf)
-
-
- def digest(self):
- """Terminate the message-digest computation and return digest.
-
- Return the digest of the strings passed to the update()
- method so far. This is a 16-byte string which may contain
- non-ASCII characters, including null bytes.
- """
-
- H0 = self.H0
- H1 = self.H1
- H2 = self.H2
- H3 = self.H3
- H4 = self.H4
- input = [] + self.input
- count = [] + self.count
-
- index = (self.count[1] >> 3) & 0x3f
-
- if index < 56:
- padLen = 56 - index
- else:
- padLen = 120 - index
-
- padding = ['\200'] + ['\000'] * 63
- self.update(padding[:padLen])
-
- # Append length (before padding).
- bits = _bytelist2longBigEndian(self.input[:56]) + count
-
- self._transform(bits)
-
- # Store state in digest.
- digest = _long2bytesBigEndian(self.H0, 4) + \
- _long2bytesBigEndian(self.H1, 4) + \
- _long2bytesBigEndian(self.H2, 4) + \
- _long2bytesBigEndian(self.H3, 4) + \
- _long2bytesBigEndian(self.H4, 4)
-
- self.H0 = H0
- self.H1 = H1
- self.H2 = H2
- self.H3 = H3
- self.H4 = H4
- self.input = input
- self.count = count
-
- return digest
-
-
- def hexdigest(self):
- """Terminate and return digest in HEX form.
-
- Like digest() except the digest is returned as a string of
- length 32, containing only hexadecimal digits. This may be
- used to exchange the value safely in email or other non-
- binary environments.
- """
- return ''.join(['%02x' % ord(c) for c in self.digest()])
-
- def copy(self):
- """Return a clone object.
-
- Return a copy ('clone') of the md5 object. This can be used
- to efficiently compute the digests of strings that share
- a common initial substring.
- """
-
- return copy.deepcopy(self)
-
-
-# ======================================================================
-# Mimic Python top-level functions from standard library API
-# for consistency with the _sha module of the standard library.
-# ======================================================================
-
-# These are mandatory variables in the module. They have constant values
-# in the SHA standard.
-
-digest_size = 20
-digestsize = 20
-blocksize = 1
-
-def new(arg=None):
- """Return a new sha crypto object.
-
- If arg is present, the method call update(arg) is made.
- """
-
- crypto = sha()
- if arg:
- crypto.update(arg)
-
- return crypto
-
-
-if __name__ == "__main__":
- a_str = "just a test string"
-
- assert 'da39a3ee5e6b4b0d3255bfef95601890afd80709' == new().hexdigest()
- assert '3f0cf2e3d9e5903e839417dfc47fed6bfa6457f6' == new(a_str).hexdigest()
- assert '0852b254078fe3772568a4aba37b917f3d4066ba' == new(a_str*7).hexdigest()
-
- s = new(a_str)
- s.update(a_str)
- assert '8862c1b50967f39d3db6bdc2877d9ccebd3102e5' == s.hexdigest()
diff --git a/setuptools/_backport/hashlib/_sha256.py b/setuptools/_backport/hashlib/_sha256.py
deleted file mode 100644
index 805dbd08..00000000
--- a/setuptools/_backport/hashlib/_sha256.py
+++ /dev/null
@@ -1,260 +0,0 @@
-import struct
-
-SHA_BLOCKSIZE = 64
-SHA_DIGESTSIZE = 32
-
-
-def new_shaobject():
- return {
- 'digest': [0]*8,
- 'count_lo': 0,
- 'count_hi': 0,
- 'data': [0]* SHA_BLOCKSIZE,
- 'local': 0,
- 'digestsize': 0
- }
-
-ROR = lambda x, y: (((x & 0xffffffff) >> (y & 31)) | (x << (32 - (y & 31)))) & 0xffffffff
-Ch = lambda x, y, z: (z ^ (x & (y ^ z)))
-Maj = lambda x, y, z: (((x | y) & z) | (x & y))
-S = lambda x, n: ROR(x, n)
-R = lambda x, n: (x & 0xffffffff) >> n
-Sigma0 = lambda x: (S(x, 2) ^ S(x, 13) ^ S(x, 22))
-Sigma1 = lambda x: (S(x, 6) ^ S(x, 11) ^ S(x, 25))
-Gamma0 = lambda x: (S(x, 7) ^ S(x, 18) ^ R(x, 3))
-Gamma1 = lambda x: (S(x, 17) ^ S(x, 19) ^ R(x, 10))
-
-def sha_transform(sha_info):
- W = []
-
- d = sha_info['data']
- for i in xrange(0,16):
- W.append( (d[4*i]<<24) + (d[4*i+1]<<16) + (d[4*i+2]<<8) + d[4*i+3])
-
- for i in xrange(16,64):
- W.append( (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffff )
-
- ss = sha_info['digest'][:]
-
- def RND(a,b,c,d,e,f,g,h,i,ki):
- t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i];
- t1 = Sigma0(a) + Maj(a, b, c);
- d += t0;
- h = t0 + t1;
- return d & 0xffffffff, h & 0xffffffff
-
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],0,0x428a2f98);
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],1,0x71374491);
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],2,0xb5c0fbcf);
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],3,0xe9b5dba5);
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],4,0x3956c25b);
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],5,0x59f111f1);
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],6,0x923f82a4);
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],7,0xab1c5ed5);
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],8,0xd807aa98);
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],9,0x12835b01);
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],10,0x243185be);
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],11,0x550c7dc3);
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],12,0x72be5d74);
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],13,0x80deb1fe);
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],14,0x9bdc06a7);
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],15,0xc19bf174);
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],16,0xe49b69c1);
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],17,0xefbe4786);
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],18,0x0fc19dc6);
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],19,0x240ca1cc);
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],20,0x2de92c6f);
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],21,0x4a7484aa);
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],22,0x5cb0a9dc);
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],23,0x76f988da);
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],24,0x983e5152);
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],25,0xa831c66d);
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],26,0xb00327c8);
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],27,0xbf597fc7);
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],28,0xc6e00bf3);
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],29,0xd5a79147);
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],30,0x06ca6351);
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],31,0x14292967);
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],32,0x27b70a85);
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],33,0x2e1b2138);
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],34,0x4d2c6dfc);
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],35,0x53380d13);
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],36,0x650a7354);
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],37,0x766a0abb);
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],38,0x81c2c92e);
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],39,0x92722c85);
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],40,0xa2bfe8a1);
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],41,0xa81a664b);
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],42,0xc24b8b70);
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],43,0xc76c51a3);
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],44,0xd192e819);
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],45,0xd6990624);
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],46,0xf40e3585);
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],47,0x106aa070);
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],48,0x19a4c116);
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],49,0x1e376c08);
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],50,0x2748774c);
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],51,0x34b0bcb5);
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],52,0x391c0cb3);
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],53,0x4ed8aa4a);
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],54,0x5b9cca4f);
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],55,0x682e6ff3);
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],56,0x748f82ee);
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],57,0x78a5636f);
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],58,0x84c87814);
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],59,0x8cc70208);
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],60,0x90befffa);
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],61,0xa4506ceb);
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],62,0xbef9a3f7);
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],63,0xc67178f2);
-
- dig = []
- for i, x in enumerate(sha_info['digest']):
- dig.append( (x + ss[i]) & 0xffffffff )
- sha_info['digest'] = dig
-
-def sha_init():
- sha_info = new_shaobject()
- sha_info['digest'] = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19]
- sha_info['count_lo'] = 0
- sha_info['count_hi'] = 0
- sha_info['local'] = 0
- sha_info['digestsize'] = 32
- return sha_info
-
-def sha224_init():
- sha_info = new_shaobject()
- sha_info['digest'] = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4]
- sha_info['count_lo'] = 0
- sha_info['count_hi'] = 0
- sha_info['local'] = 0
- sha_info['digestsize'] = 28
- return sha_info
-
-def getbuf(s):
- if isinstance(s, str):
- return s
- elif isinstance(s, unicode):
- return str(s)
- else:
- return buffer(s)
-
-def sha_update(sha_info, buffer):
- count = len(buffer)
- buffer_idx = 0
- clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff
- if clo < sha_info['count_lo']:
- sha_info['count_hi'] += 1
- sha_info['count_lo'] = clo
-
- sha_info['count_hi'] += (count >> 29)
-
- if sha_info['local']:
- i = SHA_BLOCKSIZE - sha_info['local']
- if i > count:
- i = count
-
- # copy buffer
- for x in enumerate(buffer[buffer_idx:buffer_idx+i]):
- sha_info['data'][sha_info['local']+x[0]] = struct.unpack('B', x[1])[0]
-
- count -= i
- buffer_idx += i
-
- sha_info['local'] += i
- if sha_info['local'] == SHA_BLOCKSIZE:
- sha_transform(sha_info)
- sha_info['local'] = 0
- else:
- return
-
- while count >= SHA_BLOCKSIZE:
- # copy buffer
- sha_info['data'] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE]]
- count -= SHA_BLOCKSIZE
- buffer_idx += SHA_BLOCKSIZE
- sha_transform(sha_info)
-
-
- # copy buffer
- pos = sha_info['local']
- sha_info['data'][pos:pos+count] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + count]]
- sha_info['local'] = count
-
-def sha_final(sha_info):
- lo_bit_count = sha_info['count_lo']
- hi_bit_count = sha_info['count_hi']
- count = (lo_bit_count >> 3) & 0x3f
- sha_info['data'][count] = 0x80;
- count += 1
- if count > SHA_BLOCKSIZE - 8:
- # zero the bytes in data after the count
- sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count))
- sha_transform(sha_info)
- # zero bytes in data
- sha_info['data'] = [0] * SHA_BLOCKSIZE
- else:
- sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count))
-
- sha_info['data'][56] = (hi_bit_count >> 24) & 0xff
- sha_info['data'][57] = (hi_bit_count >> 16) & 0xff
- sha_info['data'][58] = (hi_bit_count >> 8) & 0xff
- sha_info['data'][59] = (hi_bit_count >> 0) & 0xff
- sha_info['data'][60] = (lo_bit_count >> 24) & 0xff
- sha_info['data'][61] = (lo_bit_count >> 16) & 0xff
- sha_info['data'][62] = (lo_bit_count >> 8) & 0xff
- sha_info['data'][63] = (lo_bit_count >> 0) & 0xff
-
- sha_transform(sha_info)
-
- dig = []
- for i in sha_info['digest']:
- dig.extend([ ((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff) ])
- return ''.join([chr(i) for i in dig])
-
-class sha256(object):
- digest_size = digestsize = SHA_DIGESTSIZE
- block_size = SHA_BLOCKSIZE
-
- def __init__(self, s=None):
- self._sha = sha_init()
- if s:
- sha_update(self._sha, getbuf(s))
-
- def update(self, s):
- sha_update(self._sha, getbuf(s))
-
- def digest(self):
- return sha_final(self._sha.copy())[:self._sha['digestsize']]
-
- def hexdigest(self):
- return ''.join(['%.2x' % ord(i) for i in self.digest()])
-
- def copy(self):
- new = sha256.__new__(sha256)
- new._sha = self._sha.copy()
- return new
-
-class sha224(sha256):
- digest_size = digestsize = 28
-
- def __init__(self, s=None):
- self._sha = sha224_init()
- if s:
- sha_update(self._sha, getbuf(s))
-
- def copy(self):
- new = sha224.__new__(sha224)
- new._sha = self._sha.copy()
- return new
-
-if __name__ == "__main__":
- a_str = "just a test string"
-
- assert 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' == sha256().hexdigest()
- assert 'd7b553c6f09ac85d142415f857c5310f3bbbe7cdd787cce4b985acedd585266f' == sha256(a_str).hexdigest()
- assert '8113ebf33c97daa9998762aacafe750c7cefc2b2f173c90c59663a57fe626f21' == sha256(a_str*7).hexdigest()
-
- s = sha256(a_str)
- s.update(a_str)
- assert '03d9963e05a094593190b6fc794cb1a3e1ac7d7883f0b5855268afeccc70d461' == s.hexdigest()
diff --git a/setuptools/_backport/hashlib/_sha512.py b/setuptools/_backport/hashlib/_sha512.py
deleted file mode 100644
index 68ff46f3..00000000
--- a/setuptools/_backport/hashlib/_sha512.py
+++ /dev/null
@@ -1,288 +0,0 @@
-"""
-This code was Ported from CPython's sha512module.c
-"""
-
-import struct
-
-SHA_BLOCKSIZE = 128
-SHA_DIGESTSIZE = 64
-
-
-def new_shaobject():
- return {
- 'digest': [0]*8,
- 'count_lo': 0,
- 'count_hi': 0,
- 'data': [0]* SHA_BLOCKSIZE,
- 'local': 0,
- 'digestsize': 0
- }
-
-ROR64 = lambda x, y: (((x & 0xffffffffffffffff) >> (y & 63)) | (x << (64 - (y & 63)))) & 0xffffffffffffffff
-Ch = lambda x, y, z: (z ^ (x & (y ^ z)))
-Maj = lambda x, y, z: (((x | y) & z) | (x & y))
-S = lambda x, n: ROR64(x, n)
-R = lambda x, n: (x & 0xffffffffffffffff) >> n
-Sigma0 = lambda x: (S(x, 28) ^ S(x, 34) ^ S(x, 39))
-Sigma1 = lambda x: (S(x, 14) ^ S(x, 18) ^ S(x, 41))
-Gamma0 = lambda x: (S(x, 1) ^ S(x, 8) ^ R(x, 7))
-Gamma1 = lambda x: (S(x, 19) ^ S(x, 61) ^ R(x, 6))
-
-def sha_transform(sha_info):
- W = []
-
- d = sha_info['data']
- for i in xrange(0,16):
- W.append( (d[8*i]<<56) + (d[8*i+1]<<48) + (d[8*i+2]<<40) + (d[8*i+3]<<32) + (d[8*i+4]<<24) + (d[8*i+5]<<16) + (d[8*i+6]<<8) + d[8*i+7])
-
- for i in xrange(16,80):
- W.append( (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffffffffffff )
-
- ss = sha_info['digest'][:]
-
- def RND(a,b,c,d,e,f,g,h,i,ki):
- t0 = (h + Sigma1(e) + Ch(e, f, g) + ki + W[i]) & 0xffffffffffffffff
- t1 = (Sigma0(a) + Maj(a, b, c)) & 0xffffffffffffffff
- d = (d + t0) & 0xffffffffffffffff
- h = (t0 + t1) & 0xffffffffffffffff
- return d & 0xffffffffffffffff, h & 0xffffffffffffffff
-
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],0,0x428a2f98d728ae22)
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],1,0x7137449123ef65cd)
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],2,0xb5c0fbcfec4d3b2f)
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],3,0xe9b5dba58189dbbc)
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],4,0x3956c25bf348b538)
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],5,0x59f111f1b605d019)
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],6,0x923f82a4af194f9b)
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],7,0xab1c5ed5da6d8118)
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],8,0xd807aa98a3030242)
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],9,0x12835b0145706fbe)
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],10,0x243185be4ee4b28c)
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],11,0x550c7dc3d5ffb4e2)
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],12,0x72be5d74f27b896f)
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],13,0x80deb1fe3b1696b1)
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],14,0x9bdc06a725c71235)
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],15,0xc19bf174cf692694)
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],16,0xe49b69c19ef14ad2)
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],17,0xefbe4786384f25e3)
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],18,0x0fc19dc68b8cd5b5)
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],19,0x240ca1cc77ac9c65)
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],20,0x2de92c6f592b0275)
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],21,0x4a7484aa6ea6e483)
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],22,0x5cb0a9dcbd41fbd4)
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],23,0x76f988da831153b5)
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],24,0x983e5152ee66dfab)
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],25,0xa831c66d2db43210)
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],26,0xb00327c898fb213f)
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],27,0xbf597fc7beef0ee4)
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],28,0xc6e00bf33da88fc2)
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],29,0xd5a79147930aa725)
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],30,0x06ca6351e003826f)
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],31,0x142929670a0e6e70)
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],32,0x27b70a8546d22ffc)
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],33,0x2e1b21385c26c926)
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],34,0x4d2c6dfc5ac42aed)
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],35,0x53380d139d95b3df)
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],36,0x650a73548baf63de)
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],37,0x766a0abb3c77b2a8)
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],38,0x81c2c92e47edaee6)
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],39,0x92722c851482353b)
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],40,0xa2bfe8a14cf10364)
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],41,0xa81a664bbc423001)
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],42,0xc24b8b70d0f89791)
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],43,0xc76c51a30654be30)
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],44,0xd192e819d6ef5218)
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],45,0xd69906245565a910)
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],46,0xf40e35855771202a)
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],47,0x106aa07032bbd1b8)
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],48,0x19a4c116b8d2d0c8)
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],49,0x1e376c085141ab53)
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],50,0x2748774cdf8eeb99)
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],51,0x34b0bcb5e19b48a8)
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],52,0x391c0cb3c5c95a63)
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],53,0x4ed8aa4ae3418acb)
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],54,0x5b9cca4f7763e373)
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],55,0x682e6ff3d6b2b8a3)
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],56,0x748f82ee5defb2fc)
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],57,0x78a5636f43172f60)
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],58,0x84c87814a1f0ab72)
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],59,0x8cc702081a6439ec)
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],60,0x90befffa23631e28)
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],61,0xa4506cebde82bde9)
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],62,0xbef9a3f7b2c67915)
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],63,0xc67178f2e372532b)
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],64,0xca273eceea26619c)
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],65,0xd186b8c721c0c207)
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],66,0xeada7dd6cde0eb1e)
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],67,0xf57d4f7fee6ed178)
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],68,0x06f067aa72176fba)
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],69,0x0a637dc5a2c898a6)
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],70,0x113f9804bef90dae)
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],71,0x1b710b35131c471b)
- ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],72,0x28db77f523047d84)
- ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],73,0x32caab7b40c72493)
- ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],74,0x3c9ebe0a15c9bebc)
- ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],75,0x431d67c49c100d4c)
- ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],76,0x4cc5d4becb3e42b6)
- ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],77,0x597f299cfc657e2a)
- ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],78,0x5fcb6fab3ad6faec)
- ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],79,0x6c44198c4a475817)
-
- dig = []
- for i, x in enumerate(sha_info['digest']):
- dig.append( (x + ss[i]) & 0xffffffffffffffff )
- sha_info['digest'] = dig
-
-def sha_init():
- sha_info = new_shaobject()
- sha_info['digest'] = [ 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179]
- sha_info['count_lo'] = 0
- sha_info['count_hi'] = 0
- sha_info['local'] = 0
- sha_info['digestsize'] = 64
- return sha_info
-
-def sha384_init():
- sha_info = new_shaobject()
- sha_info['digest'] = [ 0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939, 0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4]
- sha_info['count_lo'] = 0
- sha_info['count_hi'] = 0
- sha_info['local'] = 0
- sha_info['digestsize'] = 48
- return sha_info
-
-def getbuf(s):
- if isinstance(s, str):
- return s
- elif isinstance(s, unicode):
- return str(s)
- else:
- return buffer(s)
-
-def sha_update(sha_info, buffer):
- count = len(buffer)
- buffer_idx = 0
- clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff
- if clo < sha_info['count_lo']:
- sha_info['count_hi'] += 1
- sha_info['count_lo'] = clo
-
- sha_info['count_hi'] += (count >> 29)
-
- if sha_info['local']:
- i = SHA_BLOCKSIZE - sha_info['local']
- if i > count:
- i = count
-
- # copy buffer
- for x in enumerate(buffer[buffer_idx:buffer_idx+i]):
- sha_info['data'][sha_info['local']+x[0]] = struct.unpack('B', x[1])[0]
-
- count -= i
- buffer_idx += i
-
- sha_info['local'] += i
- if sha_info['local'] == SHA_BLOCKSIZE:
- sha_transform(sha_info)
- sha_info['local'] = 0
- else:
- return
-
- while count >= SHA_BLOCKSIZE:
- # copy buffer
- sha_info['data'] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE]]
- count -= SHA_BLOCKSIZE
- buffer_idx += SHA_BLOCKSIZE
- sha_transform(sha_info)
-
- # copy buffer
- pos = sha_info['local']
- sha_info['data'][pos:pos+count] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + count]]
- sha_info['local'] = count
-
-def sha_final(sha_info):
- lo_bit_count = sha_info['count_lo']
- hi_bit_count = sha_info['count_hi']
- count = (lo_bit_count >> 3) & 0x7f
- sha_info['data'][count] = 0x80;
- count += 1
- if count > SHA_BLOCKSIZE - 16:
- # zero the bytes in data after the count
- sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count))
- sha_transform(sha_info)
- # zero bytes in data
- sha_info['data'] = [0] * SHA_BLOCKSIZE
- else:
- sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count))
-
- sha_info['data'][112] = 0;
- sha_info['data'][113] = 0;
- sha_info['data'][114] = 0;
- sha_info['data'][115] = 0;
- sha_info['data'][116] = 0;
- sha_info['data'][117] = 0;
- sha_info['data'][118] = 0;
- sha_info['data'][119] = 0;
-
- sha_info['data'][120] = (hi_bit_count >> 24) & 0xff
- sha_info['data'][121] = (hi_bit_count >> 16) & 0xff
- sha_info['data'][122] = (hi_bit_count >> 8) & 0xff
- sha_info['data'][123] = (hi_bit_count >> 0) & 0xff
- sha_info['data'][124] = (lo_bit_count >> 24) & 0xff
- sha_info['data'][125] = (lo_bit_count >> 16) & 0xff
- sha_info['data'][126] = (lo_bit_count >> 8) & 0xff
- sha_info['data'][127] = (lo_bit_count >> 0) & 0xff
-
- sha_transform(sha_info)
-
- dig = []
- for i in sha_info['digest']:
- dig.extend([ ((i>>56) & 0xff), ((i>>48) & 0xff), ((i>>40) & 0xff), ((i>>32) & 0xff), ((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff) ])
- return ''.join([chr(i) for i in dig])
-
-class sha512(object):
- digest_size = digestsize = SHA_DIGESTSIZE
- block_size = SHA_BLOCKSIZE
-
- def __init__(self, s=None):
- self._sha = sha_init()
- if s:
- sha_update(self._sha, getbuf(s))
-
- def update(self, s):
- sha_update(self._sha, getbuf(s))
-
- def digest(self):
- return sha_final(self._sha.copy())[:self._sha['digestsize']]
-
- def hexdigest(self):
- return ''.join(['%.2x' % ord(i) for i in self.digest()])
-
- def copy(self):
- new = sha512.__new__(sha512)
- new._sha = self._sha.copy()
- return new
-
-class sha384(sha512):
- digest_size = digestsize = 48
-
- def __init__(self, s=None):
- self._sha = sha384_init()
- if s:
- sha_update(self._sha, getbuf(s))
-
- def copy(self):
- new = sha384.__new__(sha384)
- new._sha = self._sha.copy()
- return new
-
-if __name__ == "__main__":
- a_str = "just a test string"
-
- assert sha512().hexdigest() == "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"
- assert sha512(a_str).hexdigest() == "68be4c6664af867dd1d01c8d77e963d87d77b702400c8fabae355a41b8927a5a5533a7f1c28509bbd65c5f3ac716f33be271fbda0ca018b71a84708c9fae8a53"
- assert sha512(a_str*7).hexdigest() == "3233acdbfcfff9bff9fc72401d31dbffa62bd24e9ec846f0578d647da73258d9f0879f7fde01fe2cc6516af3f343807fdef79e23d696c923d79931db46bf1819"
-
- s = sha512(a_str)
- s.update(a_str)
- assert s.hexdigest() == "341aeb668730bbb48127d5531115f3c39d12cb9586a6ca770898398aff2411087cfe0b570689adf328cddeb1f00803acce6737a19f310b53bbdb0320828f75bb"
diff --git a/setuptools/command/__init__.py b/setuptools/command/__init__.py
index b063fa19..29c9d75a 100644
--- a/setuptools/command/__init__.py
+++ b/setuptools/command/__init__.py
@@ -1,17 +1,13 @@
__all__ = [
'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop',
'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts',
- 'sdist', 'setopt', 'test', 'upload', 'install_egg_info', 'install_scripts',
+ 'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts',
'register', 'bdist_wininst', 'upload_docs',
]
from setuptools.command import install_scripts
import sys
-if sys.version>='2.5':
- # In Python 2.5 and above, distutils includes its own upload command
- __all__.remove('upload')
-
from distutils.command.bdist import bdist
if 'egg' not in bdist.format_commands:
diff --git a/setuptools/command/build_py.py b/setuptools/command/build_py.py
index 8751acd4..090b44d2 100644
--- a/setuptools/command/build_py.py
+++ b/setuptools/command/build_py.py
@@ -1,64 +1,17 @@
-import os.path, sys, fnmatch
+import os
+import sys
+import fnmatch
+import textwrap
from distutils.command.build_py import build_py as _build_py
from distutils.util import convert_path
from glob import glob
try:
- from distutils.util import Mixin2to3 as _Mixin2to3
- # add support for converting doctests that is missing in 3.1 distutils
- from distutils import log
- from lib2to3.refactor import RefactoringTool, get_fixers_from_package
- import setuptools
- class DistutilsRefactoringTool(RefactoringTool):
- def log_error(self, msg, *args, **kw):
- log.error(msg, *args)
-
- def log_message(self, msg, *args):
- log.info(msg, *args)
-
- def log_debug(self, msg, *args):
- log.debug(msg, *args)
-
- class Mixin2to3(_Mixin2to3):
- def run_2to3(self, files, doctests = False):
- # See of the distribution option has been set, otherwise check the
- # setuptools default.
- if self.distribution.use_2to3 is not True:
- return
- if not files:
- return
- log.info("Fixing "+" ".join(files))
- self.__build_fixer_names()
- self.__exclude_fixers()
- if doctests:
- if setuptools.run_2to3_on_doctests:
- r = DistutilsRefactoringTool(self.fixer_names)
- r.refactor(files, write=True, doctests_only=True)
- else:
- _Mixin2to3.run_2to3(self, files)
-
- def __build_fixer_names(self):
- if self.fixer_names: return
- self.fixer_names = []
- for p in setuptools.lib2to3_fixer_packages:
- self.fixer_names.extend(get_fixers_from_package(p))
- if self.distribution.use_2to3_fixers is not None:
- for p in self.distribution.use_2to3_fixers:
- self.fixer_names.extend(get_fixers_from_package(p))
-
- def __exclude_fixers(self):
- excluded_fixers = getattr(self, 'exclude_fixers', [])
- if self.distribution.use_2to3_exclude_fixers is not None:
- excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers)
- for fixer_name in excluded_fixers:
- if fixer_name in self.fixer_names:
- self.fixer_names.remove(fixer_name)
-
+ from setuptools.lib2to3_ex import Mixin2to3
except ImportError:
class Mixin2to3:
def run_2to3(self, files, doctests=True):
- # Nothing done in 2.x
- pass
+ "do nothing"
class build_py(_build_py, Mixin2to3):
"""Enhanced 'build_py' command that includes data files with packages
@@ -97,9 +50,10 @@ class build_py(_build_py, Mixin2to3):
# output files are.
self.byte_compile(_build_py.get_outputs(self, include_bytecode=0))
- def __getattr__(self,attr):
+ def __getattr__(self, attr):
if attr=='data_files': # lazily compute data files
- self.data_files = files = self._get_data_files(); return files
+ self.data_files = files = self._get_data_files()
+ return files
return _build_py.__getattr__(self,attr)
def build_module(self, module, module_file, package):
@@ -126,7 +80,7 @@ class build_py(_build_py, Mixin2to3):
filenames = [
file[plen:] for file in self.find_data_files(package, src_dir)
]
- data.append( (package, src_dir, build_dir, filenames) )
+ data.append((package, src_dir, build_dir, filenames))
return data
def find_data_files(self, package, src_dir):
@@ -141,7 +95,6 @@ class build_py(_build_py, Mixin2to3):
def build_package_data(self):
"""Copy data files into build directory"""
- lastdir = None
for package, src_dir, build_dir, filenames in self.data_files:
for filename in filenames:
target = os.path.join(build_dir, filename)
@@ -152,7 +105,6 @@ class build_py(_build_py, Mixin2to3):
if copied and srcfile in self.distribution.convert_2to3_doctests:
self.__doctests_2to3.append(outf)
-
def analyze_manifest(self):
self.manifest_files = mf = {}
if not self.distribution.include_package_data:
@@ -217,10 +169,10 @@ class build_py(_build_py, Mixin2to3):
if 'declare_namespace'.encode() not in f.read():
from distutils import log
log.warn(
- "WARNING: %s is a namespace package, but its __init__.py does\n"
- "not declare_namespace(); setuptools 0.7 will REQUIRE this!\n"
- '(See the setuptools manual under "Namespace Packages" for '
- "details.)\n", package
+ "WARNING: %s is a namespace package, but its __init__.py does\n"
+ "not declare_namespace(); setuptools 0.7 will REQUIRE this!\n"
+ '(See the setuptools manual under "Namespace Packages" for '
+ "details.)\n", package
)
f.close()
return init_py
@@ -229,14 +181,12 @@ class build_py(_build_py, Mixin2to3):
self.packages_checked={}
_build_py.initialize_options(self)
-
def get_package_dir(self, package):
res = _build_py.get_package_dir(self, package)
if self.distribution.src_root is not None:
return os.path.join(self.distribution.src_root, res)
return res
-
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('', [])
@@ -260,21 +210,12 @@ def assert_relative(path):
if not os.path.isabs(path):
return path
from distutils.errors import DistutilsSetupError
- raise DistutilsSetupError(
-"""Error: setup script specifies an absolute path:
-
- %s
-
-setup() arguments must *always* be /-separated paths relative to the
-setup.py directory, *never* absolute paths.
-""" % path
- )
-
-
-
-
-
-
-
+ msg = textwrap.dedent("""
+ Error: setup script specifies an absolute path:
+ %s
+ setup() arguments must *always* be /-separated paths relative to the
+ setup.py directory, *never* absolute paths.
+ """).lstrip() % path
+ raise DistutilsSetupError(msg)
diff --git a/setuptools/command/easy_install.py b/setuptools/command/easy_install.py
index d329f4cb..9775bffc 100755
--- a/setuptools/command/easy_install.py
+++ b/setuptools/command/easy_install.py
@@ -32,19 +32,7 @@ from distutils import log, dir_util
import pkg_resources
from setuptools import Command, _dont_write_bytecode
from setuptools.sandbox import run_setup
-try:
- # Python 2.7 or >=3.2
- from sysconfig import get_config_vars, get_path
- def _get_platlib():
- return get_path("platlib")
- def _get_purelib():
- return get_path("purelib")
-except ImportError:
- from distutils.sysconfig import get_config_vars, get_python_lib
- def _get_platlib():
- return get_python_lib(True)
- def _get_purelib():
- return get_python_lib(False)
+from setuptools.py31compat import get_path, get_config_vars
from distutils.util import get_platform
from distutils.util import convert_path, subst_vars
@@ -56,7 +44,7 @@ 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, xrange, basestring, unicode,
+from setuptools.compat import (iteritems, maxsize, basestring, unicode,
reraise)
from pkg_resources import (
yield_lines, normalize_path, resource_string, ensure_directory,
@@ -65,18 +53,14 @@ from pkg_resources import (
VersionConflict, DEVELOP_DIST,
)
-if '__VENV_LAUNCHER__' in os.environ:
- sys_executable = os.environ['__VENV_LAUNCHER__']
-else:
- sys_executable = os.path.normpath(sys.executable)
+sys_executable = os.environ.get('__VENV_LAUNCHER__',
+ os.path.normpath(sys.executable))
__all__ = [
'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg',
'main', 'get_exe_prefixes',
]
-HAS_USER_SITE = not sys.version < "2.6" and site.ENABLE_USER_SITE
-
def is_64bit():
return struct.calcsize("P") == 8
@@ -148,7 +132,7 @@ class easy_install(Command):
'no-deps', 'local-snapshots-ok', 'version'
]
- if HAS_USER_SITE:
+ if site.ENABLE_USER_SITE:
help_msg = "install in user site-package '%s'" % site.USER_SITE
user_options.append(('user', None, help_msg))
boolean_options.append('user')
@@ -157,7 +141,7 @@ class easy_install(Command):
create_index = PackageIndex
def initialize_options(self):
- if HAS_USER_SITE:
+ if site.ENABLE_USER_SITE:
whereami = os.path.abspath(__file__)
self.user = whereami.startswith(site.USER_SITE)
else:
@@ -182,7 +166,7 @@ class easy_install(Command):
self.install_data = None
self.install_base = None
self.install_platbase = None
- if HAS_USER_SITE:
+ if site.ENABLE_USER_SITE:
self.install_userbase = site.USER_BASE
self.install_usersite = site.USER_SITE
else:
@@ -240,13 +224,13 @@ class easy_install(Command):
'abiflags': getattr(sys, 'abiflags', ''),
}
- if HAS_USER_SITE:
+ if site.ENABLE_USER_SITE:
self.config_vars['userbase'] = self.install_userbase
self.config_vars['usersite'] = self.install_usersite
# fix the install_dir if "--user" was used
#XXX: duplicate of the code in the setup command
- if self.user and HAS_USER_SITE:
+ if self.user and site.ENABLE_USER_SITE:
self.create_home_path()
if self.install_userbase is None:
raise DistutilsPlatformError(
@@ -376,7 +360,7 @@ class easy_install(Command):
outputs = self.outputs
if self.root: # strip any package prefix
root_len = len(self.root)
- for counter in xrange(len(outputs)):
+ for counter in range(len(outputs)):
outputs[counter] = outputs[counter][root_len:]
from distutils import file_util
self.execute(
@@ -1288,10 +1272,11 @@ def get_site_dirs():
'Python',
sys.version[:3],
'site-packages'))
- for site_lib in (_get_purelib(), _get_platlib()):
+ lib_paths = get_path('purelib'), get_path('platlib')
+ for site_lib in lib_paths:
if site_lib not in sitedirs: sitedirs.append(site_lib)
- if HAS_USER_SITE:
+ if site.ENABLE_USER_SITE:
sitedirs.append(site.USER_SITE)
sitedirs = list(map(normalize_path, sitedirs))
diff --git a/setuptools/command/egg_info.py b/setuptools/command/egg_info.py
index a0ba5305..5953aad4 100755
--- a/setuptools/command/egg_info.py
+++ b/setuptools/command/egg_info.py
@@ -2,18 +2,20 @@
Create a distribution's .egg-info directory and contents"""
-# This module should be kept compatible with Python 2.3
-import os, re, sys
+import os
+import re
+import sys
+
from setuptools import Command
-from distutils.errors import *
+import distutils.errors
from distutils import log
from setuptools.command.sdist import sdist
from setuptools.compat import basestring
from setuptools import svn_utils
from distutils.util import convert_path
from distutils.filelist import FileList as _FileList
-from pkg_resources import parse_requirements, safe_name, parse_version, \
- safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename
+from pkg_resources import (parse_requirements, safe_name, parse_version,
+ safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename)
from setuptools.command.sdist import walk_revctrl
@@ -36,12 +38,6 @@ class egg_info(Command):
negative_opt = {'no-svn-revision': 'tag-svn-revision',
'no-date': 'tag-date'}
-
-
-
-
-
-
def initialize_options(self):
self.egg_name = None
self.egg_version = None
@@ -55,35 +51,16 @@ class egg_info(Command):
def save_version_info(self, filename):
from setuptools.command.setopt import edit_config
- edit_config(
- filename,
- {'egg_info':
- {'tag_svn_revision':0, 'tag_date': 0, 'tag_build': self.tags()}
- }
+ values = dict(
+ egg_info=dict(
+ tag_svn_revision=0,
+ tag_date=0,
+ tag_build=self.tags(),
+ )
)
+ edit_config(filename, values)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- def finalize_options (self):
+ def finalize_options(self):
self.egg_name = safe_name(self.distribution.get_name())
self.vtags = self.tags()
self.egg_version = self.tagged_version()
@@ -93,7 +70,7 @@ class egg_info(Command):
parse_requirements('%s==%s' % (self.egg_name,self.egg_version))
)
except ValueError:
- raise DistutilsOptionError(
+ raise distutils.errors.DistutilsOptionError(
"Invalid distribution name or version syntax: %s-%s" %
(self.egg_name,self.egg_version)
)
@@ -123,7 +100,6 @@ class egg_info(Command):
pd._parsed_version = parse_version(self.egg_version)
self.distribution._patched_dist = None
-
def write_or_delete_file(self, what, filename, data, force=False):
"""Write `data` to `filename` or delete if empty
@@ -194,34 +170,14 @@ class egg_info(Command):
os.path.exists('.svn') or os.path.exists('PKG-INFO')
): version += '-r%s' % self.get_svn_revision()
if self.tag_date:
- import time; version += time.strftime("-%Y%m%d")
+ import time
+ version += time.strftime("-%Y%m%d")
return version
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@staticmethod
def get_svn_revision():
return str(svn_utils.SvnInfo.load(os.curdir).get_revision())
-
-
-
-
-
def find_sources(self):
"""Generate SOURCES.txt manifest file"""
manifest_filename = os.path.join(self.egg_info,"SOURCES.txt")
@@ -269,17 +225,11 @@ class FileList(_FileList):
self.files.append(path)
-
-
-
-
-
-
class manifest_maker(sdist):
template = "MANIFEST.in"
- def initialize_options (self):
+ def initialize_options(self):
self.use_defaults = 1
self.prune = 1
self.manifest_only = 1
@@ -301,7 +251,7 @@ class manifest_maker(sdist):
self.filelist.remove_duplicates()
self.write_manifest()
- def write_manifest (self):
+ def write_manifest(self):
"""Write the file list in 'self.filelist' (presumably as filled in
by 'add_defaults()' and 'read_template()') to the manifest file
named by 'self.manifest'.
@@ -340,7 +290,7 @@ class manifest_maker(sdist):
ei_cmd = self.get_finalized_command('egg_info')
self.filelist.include_pattern("*", prefix=ei_cmd.egg_info)
- def prune_file_list (self):
+ def prune_file_list(self):
build = self.get_finalized_command('build')
base_dir = self.distribution.get_fullname()
self.filelist.exclude_pattern(None, prefix=build.build_base)
@@ -349,7 +299,7 @@ class manifest_maker(sdist):
self.filelist.exclude_pattern(sep+r'(RCS|CVS|\.svn)'+sep, is_regex=1)
-def write_file (filename, contents):
+def write_file(filename, contents):
"""Create a file with the specified name and write 'contents' (a
sequence of strings without line terminators) to it.
"""
@@ -360,24 +310,12 @@ def write_file (filename, contents):
f.write(contents)
f.close()
-
-
-
-
-
-
-
-
-
-
-
-
def write_pkg_info(cmd, basename, filename):
log.info("writing %s", filename)
if not cmd.dry_run:
metadata = cmd.distribution.metadata
metadata.version, oldver = cmd.egg_version, metadata.version
- metadata.name, oldname = cmd.egg_name, metadata.name
+ metadata.name, oldname = cmd.egg_name, metadata.name
try:
# write unescaped data to PKG-INFO, so older pkg_resources
# can still parse it
@@ -406,14 +344,14 @@ def write_requirements(cmd, basename, filename):
def write_toplevel_names(cmd, basename, filename):
pkgs = dict.fromkeys(
- [k.split('.',1)[0]
+ [
+ k.split('.',1)[0]
for k in cmd.distribution.iter_distribution_names()
]
)
cmd.write_file("top-level names", filename, '\n'.join(pkgs)+'\n')
-
def overwrite_arg(cmd, basename, filename):
write_arg(cmd, basename, filename, True)
@@ -452,7 +390,3 @@ def get_pkg_info_revision():
return int(match.group(1))
f.close()
return 0
-
-
-
-#
diff --git a/setuptools/command/upload.py b/setuptools/command/upload.py
deleted file mode 100755
index a6eff385..00000000
--- a/setuptools/command/upload.py
+++ /dev/null
@@ -1,183 +0,0 @@
-"""distutils.command.upload
-
-Implements the Distutils 'upload' subcommand (upload package to PyPI)."""
-
-from distutils import errors
-from distutils import log
-from distutils.core import Command
-from distutils.spawn import spawn
-try:
- from hashlib import md5
-except ImportError:
- from md5 import md5
-import os
-import sys
-import socket
-import platform
-import base64
-
-from setuptools.compat import urlparse, StringIO, httplib, ConfigParser
-
-class upload(Command):
-
- description = "upload binary package to PyPI"
-
- DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi'
-
- user_options = [
- ('repository=', 'r',
- "url of repository [default: %s]" % DEFAULT_REPOSITORY),
- ('show-response', None,
- 'display full response text from server'),
- ('sign', 's',
- 'sign files to upload using gpg'),
- ('identity=', 'i', 'GPG identity used to sign files'),
- ]
- boolean_options = ['show-response', 'sign']
-
- def initialize_options(self):
- self.username = ''
- self.password = ''
- self.repository = ''
- self.show_response = 0
- self.sign = False
- self.identity = None
-
- def finalize_options(self):
- if self.identity and not self.sign:
- raise errors.DistutilsOptionError(
- "Must use --sign for --identity to have meaning"
- )
- if 'HOME' in os.environ:
- rc = os.path.join(os.environ['HOME'], '.pypirc')
- if os.path.exists(rc):
- self.announce('Using PyPI login from %s' % rc)
- config = ConfigParser.ConfigParser({
- 'username':'',
- 'password':'',
- 'repository':''})
- config.read(rc)
- if not self.repository:
- self.repository = config.get('server-login', 'repository')
- if not self.username:
- self.username = config.get('server-login', 'username')
- if not self.password:
- self.password = config.get('server-login', 'password')
- if not self.repository:
- self.repository = self.DEFAULT_REPOSITORY
-
- def run(self):
- if not self.distribution.dist_files:
- raise errors.DistutilsOptionError("No dist file created in earlier command")
- for command, pyversion, filename in self.distribution.dist_files:
- self.upload_file(command, pyversion, filename)
-
- def upload_file(self, command, pyversion, filename):
- # Sign if requested
- if self.sign:
- gpg_args = ["gpg", "--detach-sign", "-a", filename]
- if self.identity:
- gpg_args[2:2] = ["--local-user", self.identity]
- spawn(gpg_args,
- dry_run=self.dry_run)
-
- # Fill in the data
- f = open(filename,'rb')
- content = f.read()
- f.close()
- basename = os.path.basename(filename)
- comment = ''
- if command=='bdist_egg' and self.distribution.has_ext_modules():
- comment = "built on %s" % platform.platform(terse=1)
- data = {
- ':action':'file_upload',
- 'protocol_version':'1',
- 'name':self.distribution.get_name(),
- 'version':self.distribution.get_version(),
- 'content':(basename,content),
- 'filetype':command,
- 'pyversion':pyversion,
- 'md5_digest':md5(content).hexdigest(),
- }
- if command == 'bdist_rpm':
- dist, version, id = platform.dist()
- if dist:
- comment = 'built for %s %s' % (dist, version)
- elif command == 'bdist_dumb':
- comment = 'built for %s' % platform.platform(terse=1)
- data['comment'] = comment
-
- if self.sign:
- asc_file = open(filename + ".asc")
- data['gpg_signature'] = (os.path.basename(filename) + ".asc", asc_file.read())
- asc_file.close()
-
- # set up the authentication
- auth = "Basic " + base64.encodestring(self.username + ":" + self.password).strip()
-
- # Build up the MIME payload for the POST data
- boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
- sep_boundary = '\n--' + boundary
- end_boundary = sep_boundary + '--'
- body = StringIO()
- for key, value in data.items():
- # handle multiple entries for the same name
- if not isinstance(value, list):
- value = [value]
- for value in value:
- if type(value) is tuple:
- fn = ';filename="%s"' % value[0]
- value = value[1]
- else:
- fn = ""
- value = str(value)
- body.write(sep_boundary)
- body.write('\nContent-Disposition: form-data; name="%s"'%key)
- body.write(fn)
- body.write("\n\n")
- body.write(value)
- if value and value[-1] == '\r':
- body.write('\n') # write an extra newline (lurve Macs)
- body.write(end_boundary)
- body.write("\n")
- body = body.getvalue()
-
- self.announce("Submitting %s to %s" % (filename, self.repository), log.INFO)
-
- # build the Request
- # 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)
- assert not params and not query and not fragments
- if schema == 'http':
- http = httplib.HTTPConnection(netloc)
- elif schema == 'https':
- http = httplib.HTTPSConnection(netloc)
- else:
- raise AssertionError("unsupported schema " + schema)
-
- data = ''
- try:
- http.connect()
- http.putrequest("POST", url)
- http.putheader('Content-type',
- 'multipart/form-data; boundary=%s'%boundary)
- http.putheader('Content-length', str(len(body)))
- http.putheader('Authorization', auth)
- http.endheaders()
- http.send(body)
- except socket.error:
- e = sys.exc_info()[1]
- self.announce(str(e), log.ERROR)
- return
-
- r = http.getresponse()
- if r.status == 200:
- self.announce('Server response (%s): %s' % (r.status, r.reason),
- log.INFO)
- else:
- self.announce('Upload failed (%s): %s' % (r.status, r.reason),
- log.ERROR)
- if self.show_response:
- print('-'*75, r.read(), '-'*75)
diff --git a/setuptools/command/upload_docs.py b/setuptools/command/upload_docs.py
index 12bc916b..8ee35cb0 100644
--- a/setuptools/command/upload_docs.py
+++ b/setuptools/command/upload_docs.py
@@ -17,20 +17,11 @@ from pkg_resources import iter_entry_points
from distutils import log
from distutils.errors import DistutilsOptionError
+from distutils.command.upload import upload
-try:
- from distutils.command.upload import upload
-except ImportError:
- from setuptools.command.upload import upload
+from setuptools.compat import httplib, urlparse, unicode, iteritems, PY3
-from setuptools.compat import httplib, urlparse, unicode, iteritems
-
-_IS_PYTHON3 = sys.version > '3'
-
-if _IS_PYTHON3:
- errors = 'surrogateescape'
-else:
- errors = 'strict'
+errors = 'surrogateescape' if PY3 else 'strict'
# This is not just a replacement for byte literals
@@ -124,7 +115,7 @@ class upload_docs(upload):
# set up the authentication
credentials = b(self.username + ':' + self.password)
credentials = standard_b64encode(credentials)
- if sys.version_info >= (3,):
+ if PY3:
credentials = credentials.decode('ascii')
auth = "Basic " + credentials
@@ -136,7 +127,7 @@ class upload_docs(upload):
for key, values in iteritems(data):
title = '\nContent-Disposition: form-data; name="%s"' % key
# handle multiple entries for the same name
- if type(values) != type([]):
+ if isinstance(values, list):
values = [values]
for value in values:
if type(value) is tuple:
@@ -171,12 +162,11 @@ class upload_docs(upload):
raise AssertionError("unsupported schema "+schema)
data = ''
- loglevel = log.INFO
try:
conn.connect()
conn.putrequest("POST", url)
- conn.putheader('Content-type',
- 'multipart/form-data; boundary=%s'%boundary)
+ content_type = 'multipart/form-data; boundary=%s' % boundary
+ conn.putheader('Content-type', content_type)
conn.putheader('Content-length', str(len(body)))
conn.putheader('Authorization', auth)
conn.endheaders()
diff --git a/setuptools/compat.py b/setuptools/compat.py
index 9a191465..7b824ba2 100644
--- a/setuptools/compat.py
+++ b/setuptools/compat.py
@@ -23,7 +23,6 @@ if sys.version_info[0] < 3:
maxsize = sys.maxint
next = lambda o: o.next()
numeric_types = (int, long, float)
- reduce = reduce
unichr = unichr
unicode = unicode
bytes = str
@@ -31,21 +30,9 @@ if sys.version_info[0] < 3:
import urllib2
from urllib2 import urlopen, HTTPError, URLError, unquote, splituser
from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit
- xrange = xrange
filterfalse = itertools.ifilterfalse
- def exec_(code, globs=None, locs=None):
- if globs is None:
- frame = sys._getframe(1)
- globs = frame.f_globals
- if locs is None:
- locs = frame.f_locals
- del frame
- elif locs is None:
- locs = globs
- exec("""exec code in globs, locs""")
-
- exec_("""def reraise(tp, value, tb=None):
+ exec("""def reraise(tp, value, tb=None):
raise tp, value, tb""")
else:
PY3 = True
@@ -53,7 +40,6 @@ else:
basestring = str
import builtins
import configparser as ConfigParser
- exec_ = eval('exec')
from io import StringIO, BytesIO
func_code = lambda o: o.__code__
func_globals = lambda o: o.__globals__
@@ -67,7 +53,6 @@ else:
maxsize = sys.maxsize
next = next
numeric_types = (int, float)
- from functools import reduce
unichr = chr
unicode = str
bytes = bytes
@@ -78,7 +63,6 @@ else:
urlparse, urlunparse, unquote, splituser, urljoin, urlsplit,
urlunsplit, splittag,
)
- xrange = range
filterfalse = itertools.filterfalse
def execfile(fn, globs=None, locs=None):
@@ -91,7 +75,7 @@ else:
source = f.read()
finally:
f.close()
- exec_(compile(source, fn, 'exec'), globs, locs)
+ exec(compile(source, fn, 'exec'), globs, locs)
def reraise(tp, value, tb=None):
if value.__traceback__ is not tb:
diff --git a/setuptools/lib2to3_ex.py b/setuptools/lib2to3_ex.py
new file mode 100644
index 00000000..feef591a
--- /dev/null
+++ b/setuptools/lib2to3_ex.py
@@ -0,0 +1,58 @@
+"""
+Customized Mixin2to3 support:
+
+ - adds support for converting doctests
+
+
+This module raises an ImportError on Python 2.
+"""
+
+from distutils.util import Mixin2to3 as _Mixin2to3
+from distutils import log
+from lib2to3.refactor import RefactoringTool, get_fixers_from_package
+import setuptools
+
+class DistutilsRefactoringTool(RefactoringTool):
+ def log_error(self, msg, *args, **kw):
+ log.error(msg, *args)
+
+ def log_message(self, msg, *args):
+ log.info(msg, *args)
+
+ def log_debug(self, msg, *args):
+ log.debug(msg, *args)
+
+class Mixin2to3(_Mixin2to3):
+ def run_2to3(self, files, doctests = False):
+ # See of the distribution option has been set, otherwise check the
+ # setuptools default.
+ if self.distribution.use_2to3 is not True:
+ return
+ if not files:
+ return
+ log.info("Fixing "+" ".join(files))
+ self.__build_fixer_names()
+ self.__exclude_fixers()
+ if doctests:
+ if setuptools.run_2to3_on_doctests:
+ r = DistutilsRefactoringTool(self.fixer_names)
+ r.refactor(files, write=True, doctests_only=True)
+ else:
+ _Mixin2to3.run_2to3(self, files)
+
+ def __build_fixer_names(self):
+ if self.fixer_names: return
+ self.fixer_names = []
+ for p in setuptools.lib2to3_fixer_packages:
+ self.fixer_names.extend(get_fixers_from_package(p))
+ if self.distribution.use_2to3_fixers is not None:
+ for p in self.distribution.use_2to3_fixers:
+ self.fixer_names.extend(get_fixers_from_package(p))
+
+ def __exclude_fixers(self):
+ excluded_fixers = getattr(self, 'exclude_fixers', [])
+ if self.distribution.use_2to3_exclude_fixers is not None:
+ excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers)
+ for fixer_name in excluded_fixers:
+ if fixer_name in self.fixer_names:
+ self.fixer_names.remove(fixer_name)
diff --git a/setuptools/package_index.py b/setuptools/package_index.py
index ef247cf3..0e51b72c 100755
--- a/setuptools/package_index.py
+++ b/setuptools/package_index.py
@@ -5,6 +5,8 @@ import re
import shutil
import socket
import base64
+import hashlib
+from functools import wraps
from pkg_resources import (
CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST,
@@ -21,8 +23,6 @@ from setuptools.compat import (urllib2, httplib, StringIO, HTTPError,
ConfigParser)
from setuptools.compat import filterfalse
from fnmatch import translate
-from setuptools.py24compat import hashlib
-from setuptools.py24compat import wraps
from setuptools.py26compat import strip_fragment
from setuptools.py27compat import get_all_headers
diff --git a/setuptools/py24compat.py b/setuptools/py24compat.py
deleted file mode 100644
index 40e9ae0f..00000000
--- a/setuptools/py24compat.py
+++ /dev/null
@@ -1,17 +0,0 @@
-"""
-Forward-compatibility support for Python 2.4 and earlier
-"""
-
-# from jaraco.compat 1.2
-try:
- from functools import wraps
-except ImportError:
- def wraps(func):
- "Just return the function unwrapped"
- return lambda x: x
-
-
-try:
- import hashlib
-except ImportError:
- from setuptools._backport import hashlib
diff --git a/setuptools/py31compat.py b/setuptools/py31compat.py
new file mode 100644
index 00000000..dbb324b0
--- /dev/null
+++ b/setuptools/py31compat.py
@@ -0,0 +1,11 @@
+__all__ = ['get_config_vars', 'get_path']
+
+try:
+ # Python 2.7 or >=3.2
+ from sysconfig import get_config_vars, get_path
+except ImportError:
+ from distutils.sysconfig import get_config_vars, get_python_lib
+ def get_path(name):
+ if name not in ('platlib', 'purelib'):
+ raise ValueError("Name must be purelib or platlib")
+ return get_python_lib(name=='platlib')
diff --git a/setuptools/sandbox.py b/setuptools/sandbox.py
index 29fc07b8..6dd1ca07 100755
--- a/setuptools/sandbox.py
+++ b/setuptools/sandbox.py
@@ -1,4 +1,11 @@
-import os, sys, tempfile, operator, pkg_resources
+import os
+import sys
+import tempfile
+import operator
+import functools
+
+import pkg_resources
+
if os.name == "java":
import org.python.modules.posix.PosixModule as _os
else:
@@ -11,40 +18,12 @@ _open = open
from distutils.errors import DistutilsError
from pkg_resources import working_set
-from setuptools.compat import builtins, execfile, reduce
+from setuptools.compat import builtins, execfile
__all__ = [
"AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup",
]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
def run_setup(setup_script, args):
"""Run a distutils setup script, sandboxed in its directory"""
old_dir = os.getcwd()
@@ -93,7 +72,6 @@ def run_setup(setup_script, args):
tempfile.tempdir = save_tmp
-
class AbstractSandbox:
"""Wrap 'os' module and 'open()' builtin for virtualizing setup scripts"""
@@ -136,7 +114,6 @@ class AbstractSandbox:
for name in ["rename", "link", "symlink"]:
if hasattr(_os,name): locals()[name] = _mk_dual_path_wrapper(name)
-
def _mk_single_path_wrapper(name, original=None):
original = original or getattr(_os,name)
def wrap(self,path,*args,**kw):
@@ -249,7 +226,7 @@ class DirectorySandbox(AbstractSandbox):
self._active = False
realpath = os.path.normcase(os.path.realpath(path))
if (self._exempted(realpath) or realpath == self._sandbox
- or realpath.startswith(self._prefix)):
+ or realpath.startswith(self._prefix)):
return True
finally:
self._active = active
@@ -276,7 +253,7 @@ class DirectorySandbox(AbstractSandbox):
self._violation("os.open", file, flags, mode, *args, **kw)
return _os.open(file,flags,mode, *args, **kw)
-WRITE_FLAGS = reduce(
+WRITE_FLAGS = functools.reduce(
operator.or_, [getattr(_os, a, 0) for a in
"O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()]
)
diff --git a/setuptools/ssl_support.py b/setuptools/ssl_support.py
index 346188f2..7b5f429f 100644
--- a/setuptools/ssl_support.py
+++ b/setuptools/ssl_support.py
@@ -1,4 +1,8 @@
-import sys, os, socket, atexit, re
+import os
+import socket
+import atexit
+import re
+
import pkg_resources
from pkg_resources import ResolutionError, ExtractionError
from setuptools.compat import urllib2
@@ -38,51 +42,6 @@ for what, where in (
is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection)
-
-
-
-try:
- from socket import create_connection
-except ImportError:
- from socket import error
- _GLOBAL_DEFAULT_TIMEOUT = getattr(socket, '_GLOBAL_DEFAULT_TIMEOUT', object())
- def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT,
- source_address=None):
- """Connect to *address* and return the socket object.
-
- Convenience function. Connect to *address* (a 2-tuple ``(host,
- port)``) and return the socket object. Passing the optional
- *timeout* parameter will set the timeout on the socket instance
- before attempting to connect. If no *timeout* is supplied, the
- global default timeout setting returned by :func:`getdefaulttimeout`
- is used. If *source_address* is set it must be a tuple of (host, port)
- for the socket to bind as a source address before making the connection.
- An host of '' or port 0 tells the OS to use the default.
- """
- host, port = address
- err = None
- for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
- af, socktype, proto, canonname, sa = res
- sock = None
- try:
- sock = socket.socket(af, socktype, proto)
- if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
- sock.settimeout(timeout)
- if source_address:
- sock.bind(source_address)
- sock.connect(sa)
- return sock
-
- except error:
- err = True
- if sock is not None:
- sock.close()
- if err:
- raise
- else:
- raise error("getaddrinfo returns an empty list")
-
-
try:
from ssl import CertificateError, match_hostname
except ImportError:
@@ -191,28 +150,6 @@ if not match_hostname:
"subjectAltName fields were found")
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
class VerifyingHTTPSHandler(HTTPSHandler):
"""Simple verifying handler: no auth, subclasses, timeouts, etc."""
@@ -233,8 +170,8 @@ class VerifyingHTTPSConn(HTTPSConnection):
self.ca_bundle = ca_bundle
def connect(self):
- sock = create_connection(
- (self.host, self.port), getattr(self,'source_address',None)
+ sock = socket.create_connection(
+ (self.host, self.port), getattr(self, 'source_address', None)
)
# Handle the socket if a (proxy) tunnel is present
@@ -259,7 +196,6 @@ def opener_for(ca_bundle=None):
).open
-
_wincerts = None
def get_win_certfile():
@@ -296,8 +232,3 @@ def find_ca_bundle():
return pkg_resources.resource_filename('certifi', 'cacert.pem')
except (ImportError, ResolutionError, ExtractionError):
return None
-
-
-
-
-
diff --git a/setuptools/svn_utils.py b/setuptools/svn_utils.py
index 0d65bd30..a9bdc5c3 100644
--- a/setuptools/svn_utils.py
+++ b/setuptools/svn_utils.py
@@ -8,7 +8,7 @@ import locale
import codecs
import unicodedata
import warnings
-from setuptools.compat import unicode, bytes
+from setuptools.compat import unicode
from xml.sax.saxutils import unescape
try:
@@ -38,7 +38,7 @@ def _run_command(args, stdout=_PIPE, stderr=_PIPE, encoding=None, stream=0):
except OSError:
return 1, ''
- #doubled checked and
+ #doubled checked and
data = decode_as_string(data, encoding)
#communciate calls wait()
@@ -77,19 +77,19 @@ def determine_console_encoding():
try:
#try for the preferred encoding
encoding = locale.getpreferredencoding()
-
+
#see if the locale.getdefaultlocale returns null
#some versions of python\platforms return US-ASCII
#when it cannot determine an encoding
if not encoding or encoding == "US-ASCII":
encoding = locale.getdefaultlocale()[1]
-
+
if encoding:
codecs.lookup(encoding) # make sure a lookup error is not made
-
+
except (locale.Error, LookupError):
encoding = None
-
+
is_osx = sys.platform == "darwin"
if not encoding:
return ["US-ASCII", "utf-8"][is_osx]
@@ -99,30 +99,30 @@ def determine_console_encoding():
return "utf-8"
else:
return encoding
-
+
_console_encoding = determine_console_encoding()
def decode_as_string(text, encoding=None):
"""
Decode the console or file output explicitly using getpreferredencoding.
The text paraemeter should be a encoded string, if not no decode occurs
- If no encoding is given, getpreferredencoding is used. If encoding is
- specified, that is used instead. This would be needed for SVN --xml
+ If no encoding is given, getpreferredencoding is used. If encoding is
+ specified, that is used instead. This would be needed for SVN --xml
output. Unicode is explicitly put in composed NFC form.
-
- --xml should be UTF-8 (SVN Issue 2938) the discussion on the Subversion
+
+ --xml should be UTF-8 (SVN Issue 2938) the discussion on the Subversion
DEV List from 2007 seems to indicate the same.
"""
- #text should be a byte string
+ #text should be a byte string
if encoding is None:
encoding = _console_encoding
if not isinstance(text, unicode):
text = text.decode(encoding)
-
+
text = unicodedata.normalize('NFC', text)
-
+
return text
@@ -158,7 +158,7 @@ def parse_externals_xml(decoded_str, prefix=''):
path = path[len(prefix)+1:]
data = _get_target_property(node)
- #data should be decoded already
+ #data should be decoded already
for external in parse_external_prop(data):
externals.append(joinpath(path, external))
@@ -262,17 +262,18 @@ class SvnInfo(object):
except ValueError:
base_svn_version = tuple()
- if has_svn and (code or not base_svn_version
- or base_svn_version < (1, 3)):
+ if not has_svn:
+ return SvnInfo(dirname)
+
+ if code or not base_svn_version or base_svn_version < (1, 3):
warnings.warn(("No SVN 1.3+ command found: falling back "
"on pre 1.7 .svn parsing"), DeprecationWarning)
return SvnFileInfo(dirname)
- elif not has_svn:
- return SvnInfo(dirname)
- elif base_svn_version < (1, 5):
+
+ if base_svn_version < (1, 5):
return Svn13Info(dirname)
- else:
- return Svn15Info(dirname)
+
+ return Svn15Info(dirname)
def __init__(self, path=''):
self.path = path
diff --git a/setuptools/tests/doctest.py b/setuptools/tests/doctest.py
index 35d588d0..47293c3c 100644
--- a/setuptools/tests/doctest.py
+++ b/setuptools/tests/doctest.py
@@ -109,7 +109,7 @@ import __future__
import sys, traceback, inspect, linecache, os, re, types
import unittest, difflib, pdb, tempfile
import warnings
-from setuptools.compat import StringIO, execfile, exec_, func_code, im_func
+from setuptools.compat import StringIO, execfile, func_code, im_func
# Don't whine about the deprecated is_private function in this
# module's tests.
@@ -1250,7 +1250,7 @@ class DocTestRunner:
# keyboard interrupts.)
try:
# Don't blink! This is where the user's code gets run.
- exec_(compile(example.source, filename, "single",
+ exec(compile(example.source, filename, "single",
compileflags, 1), test.globs)
self.debugger.set_continue() # ==== Example Finished ====
exception = None
diff --git a/setuptools/tests/test_easy_install.py b/setuptools/tests/test_easy_install.py
index 189e3d55..a90ae23f 100644
--- a/setuptools/tests/test_easy_install.py
+++ b/setuptools/tests/test_easy_install.py
@@ -6,32 +6,22 @@ import shutil
import tempfile
import unittest
import site
-from setuptools.compat import StringIO, BytesIO, next
-from setuptools.compat import urlparse
+import contextlib
import textwrap
import tarfile
+import logging
import distutils.core
from setuptools.compat import StringIO, BytesIO, next, urlparse
from setuptools.sandbox import run_setup, SandboxViolation
-from setuptools.command.easy_install import easy_install, fix_jython_executable, get_script_args, nt_quote_arg
-from setuptools.command.easy_install import PthDistributions
+from setuptools.command.easy_install import (
+ easy_install, fix_jython_executable, get_script_args, nt_quote_arg)
+from setuptools.command.easy_install import PthDistributions
from setuptools.command import easy_install as easy_install_pkg
from setuptools.dist import Distribution
from pkg_resources import Distribution as PRDistribution
import setuptools.tests.server
-try:
- # import multiprocessing solely for the purpose of testing its existence
- __import__('multiprocessing')
- import logging
- _LOG = logging.getLogger('test_easy_install')
- logging.basicConfig(level=logging.INFO, stream=sys.stderr)
- _MULTIPROC = True
-except ImportError:
- _MULTIPROC = False
- _LOG = None
-
class FakeDist(object):
def get_entry_map(self, group):
if group != 'console_scripts':
@@ -140,31 +130,29 @@ class TestUserInstallTest(unittest.TestCase):
f.close()
self.old_cwd = os.getcwd()
os.chdir(self.dir)
- if sys.version >= "2.6":
- self.old_has_site = easy_install_pkg.HAS_USER_SITE
- self.old_file = easy_install_pkg.__file__
- self.old_base = site.USER_BASE
- site.USER_BASE = tempfile.mkdtemp()
- self.old_site = site.USER_SITE
- site.USER_SITE = tempfile.mkdtemp()
- easy_install_pkg.__file__ = site.USER_SITE
+
+ self.old_enable_site = site.ENABLE_USER_SITE
+ self.old_file = easy_install_pkg.__file__
+ self.old_base = site.USER_BASE
+ site.USER_BASE = tempfile.mkdtemp()
+ self.old_site = site.USER_SITE
+ site.USER_SITE = tempfile.mkdtemp()
+ easy_install_pkg.__file__ = site.USER_SITE
def tearDown(self):
os.chdir(self.old_cwd)
shutil.rmtree(self.dir)
- if sys.version >= "2.6":
- shutil.rmtree(site.USER_BASE)
- shutil.rmtree(site.USER_SITE)
- site.USER_BASE = self.old_base
- site.USER_SITE = self.old_site
- easy_install_pkg.HAS_USER_SITE = self.old_has_site
- easy_install_pkg.__file__ = self.old_file
+
+ shutil.rmtree(site.USER_BASE)
+ shutil.rmtree(site.USER_SITE)
+ site.USER_BASE = self.old_base
+ site.USER_SITE = self.old_site
+ site.ENABLE_USER_SITE = self.old_enable_site
+ easy_install_pkg.__file__ = self.old_file
def test_user_install_implied(self):
- easy_install_pkg.HAS_USER_SITE = True # disabled sometimes
+ site.ENABLE_USER_SITE = True # disabled sometimes
#XXX: replace with something meaningfull
- if sys.version < "2.6":
- return #SKIP
dist = Distribution()
dist.script_name = 'setup.py'
cmd = easy_install(dist)
@@ -173,15 +161,19 @@ class TestUserInstallTest(unittest.TestCase):
self.assertTrue(cmd.user, 'user should be implied')
def test_multiproc_atexit(self):
- if not _MULTIPROC:
+ try:
+ __import__('multiprocessing')
+ except ImportError:
+ # skip the test if multiprocessing is not available
return
- _LOG.info('this should not break')
+
+ log = logging.getLogger('test_easy_install')
+ logging.basicConfig(level=logging.INFO, stream=sys.stderr)
+ log.info('this should not break')
def test_user_install_not_implied_without_usersite_enabled(self):
- easy_install_pkg.HAS_USER_SITE = False # usually enabled
+ site.ENABLE_USER_SITE = False # usually enabled
#XXX: replace with something meaningfull
- if sys.version < "2.6":
- return #SKIP
dist = Distribution()
dist.script_name = 'setup.py'
cmd = easy_install(dist)
@@ -246,7 +238,6 @@ class TestUserInstallTest(unittest.TestCase):
test_pkg = os.path.join(self.dir, 'test_pkg')
test_setup_py = os.path.join(test_pkg, 'setup.py')
- test_setup_cfg = os.path.join(test_pkg, 'setup.cfg')
os.mkdir(test_pkg)
f = open(test_setup_py, 'w')
@@ -273,9 +264,8 @@ class TestUserInstallTest(unittest.TestCase):
sys.stderr = StringIO()
try:
try:
- reset_setup_stop_context(
- lambda: run_setup(test_setup_py, ['install'])
- )
+ with reset_setup_stop_context():
+ run_setup(test_setup_py, ['install'])
except SandboxViolation:
self.fail('Installation caused SandboxViolation')
finally:
@@ -300,45 +290,33 @@ class TestSetupRequires(unittest.TestCase):
# Some platforms (Jython) don't find a port to which to bind,
# so skip this test for them.
return
-
- # I realize this is all-but-impossible to read, because it was
- # ported from some well-factored, safe code using 'with'. If you
- # need to maintain this code, consider making the changes in
- # the parent revision (of this comment) and then port the changes
- # back for Python 2.4 (or deprecate Python 2.4).
-
- def install(dist_file):
- def install_at(temp_install_dir):
- def install_env():
+ # create an sdist that has a build-time dependency.
+ with TestSetupRequires.create_sdist() as dist_file:
+ with tempdir_context() as temp_install_dir:
+ with environment_context(PYTHONPATH=temp_install_dir):
ei_params = ['--index-url', p_index.url,
'--allow-hosts', p_index_loc,
'--exclude-scripts', '--install-dir', temp_install_dir,
dist_file]
- def install_clean_reset():
- def install_clean_argv():
+ with reset_setup_stop_context():
+ with argv_context(['easy_install']):
# attempt to install the dist. It should fail because
# it doesn't exist.
self.assertRaises(SystemExit,
easy_install_pkg.main, ei_params)
- argv_context(install_clean_argv, ['easy_install'])
- reset_setup_stop_context(install_clean_reset)
- environment_context(install_env, PYTHONPATH=temp_install_dir)
- tempdir_context(install_at)
-
- # create an sdist that has a build-time dependency.
- self.create_sdist(install)
-
# there should have been two or three requests to the server
# (three happens on Python 3.3a)
self.assertTrue(2 <= len(p_index.requests) <= 3)
self.assertEqual(p_index.requests[0].path, '/does-not-exist/')
- def create_sdist(self, installer):
+ @staticmethod
+ @contextlib.contextmanager
+ def create_sdist():
"""
- Create an sdist with a setup_requires dependency (of something that
- doesn't exist) and invoke installer on it.
+ Return an sdist with a setup_requires dependency (of something that
+ doesn't exist)
"""
- def build_sdist(dir):
+ with tempdir_context() as dir:
dist_path = os.path.join(dir, 'setuptools-test-fetcher-1.0.tar.gz')
make_trivial_sdist(
dist_path,
@@ -350,8 +328,7 @@ class TestSetupRequires(unittest.TestCase):
setup_requires = ['does-not-exist'],
)
""").lstrip())
- installer(dist_path)
- tempdir_context(build_sdist)
+ yield dist_path
def make_trivial_sdist(dist_path, setup_py):
@@ -374,44 +351,37 @@ def make_trivial_sdist(dist_path, setup_py):
dist.close()
-def tempdir_context(f, cd=lambda dir:None):
- """
- Invoke f in the context
- """
+@contextlib.contextmanager
+def tempdir_context(cd=lambda dir:None):
temp_dir = tempfile.mkdtemp()
orig_dir = os.getcwd()
try:
cd(temp_dir)
- f(temp_dir)
+ yield temp_dir
finally:
cd(orig_dir)
shutil.rmtree(temp_dir)
-def environment_context(f, **updates):
- """
- Invoke f in the context
- """
+@contextlib.contextmanager
+def environment_context(**updates):
old_env = os.environ.copy()
os.environ.update(updates)
try:
- f()
+ yield
finally:
for key in updates:
del os.environ[key]
os.environ.update(old_env)
-def argv_context(f, repl):
- """
- Invoke f in the context
- """
+@contextlib.contextmanager
+def argv_context(repl):
old_argv = sys.argv[:]
sys.argv[:] = repl
- try:
- f()
- finally:
- sys.argv[:] = old_argv
+ yield
+ sys.argv[:] = old_argv
-def reset_setup_stop_context(f):
+@contextlib.contextmanager
+def reset_setup_stop_context():
"""
When the setuptools tests are run using setup.py test, and then
one wants to invoke another setup() command (such as easy_install)
@@ -420,7 +390,5 @@ def reset_setup_stop_context(f):
"""
setup_stop_after = distutils.core._setup_stop_after
distutils.core._setup_stop_after = None
- try:
- f()
- finally:
- distutils.core._setup_stop_after = setup_stop_after
+ yield
+ distutils.core._setup_stop_after = setup_stop_after
diff --git a/setuptools/version.py b/setuptools/version.py
index 4e7c72a5..3b3dacb9 100644
--- a/setuptools/version.py
+++ b/setuptools/version.py
@@ -1 +1 @@
-__version__ = '1.4.3'
+__version__ = '2.0'