aboutsummaryrefslogtreecommitdiffstats
path: root/setuptools/command
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2017-01-07 13:37:37 -0500
committerJason R. Coombs <jaraco@jaraco.com>2017-01-07 13:37:37 -0500
commita0d35d47761a8bd7394cb9f2738169b07be3a005 (patch)
tree375334a5e61eb137b5411f92942b510f6024cea3 /setuptools/command
parentbbf6ac250a05fd51aa2a44ed3196837491bc9d60 (diff)
parent3c182f9f1eea89040fbfc88d1ccbed31ece6a00b (diff)
downloadexternal_python_setuptools-issue-97.tar.gz
external_python_setuptools-issue-97.tar.bz2
external_python_setuptools-issue-97.zip
Merge branch 'master' into issue-97issue-97
Diffstat (limited to 'setuptools/command')
-rw-r--r--setuptools/command/build_ext.py14
-rw-r--r--setuptools/command/build_py.py2
-rwxr-xr-xsetuptools/command/develop.py6
-rwxr-xr-xsetuptools/command/easy_install.py17
-rwxr-xr-xsetuptools/command/egg_info.py53
-rwxr-xr-xsetuptools/command/install_egg_info.py61
-rwxr-xr-xsetuptools/command/sdist.py10
-rw-r--r--setuptools/command/test.py11
8 files changed, 71 insertions, 103 deletions
diff --git a/setuptools/command/build_ext.py b/setuptools/command/build_ext.py
index 12dc88cd..36f53f0d 100644
--- a/setuptools/command/build_ext.py
+++ b/setuptools/command/build_ext.py
@@ -62,7 +62,7 @@ if_dl = lambda s: s if have_rtld else ''
def get_abi3_suffix():
"""Return the file extension for an abi3-compliant Extension()"""
for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION):
- if '.abi3' in suffix: # Unix
+ if '.abi3' in suffix: # Unix
return suffix
elif suffix == '.pyd': # Windows
return suffix
@@ -109,7 +109,7 @@ class build_ext(_build_ext):
and get_abi3_suffix()
)
if use_abi3:
- so_ext = get_config_var('EXT_SUFFIX')
+ so_ext = _get_config_var_837('EXT_SUFFIX')
filename = filename[:-len(so_ext)]
filename = filename + get_abi3_suffix()
if isinstance(ext, Library):
@@ -316,3 +316,13 @@ else:
self.create_static_lib(
objects, basename, output_dir, debug, target_lang
)
+
+
+def _get_config_var_837(name):
+ """
+ In https://github.com/pypa/setuptools/pull/837, we discovered
+ Python 3.3.0 exposes the extension suffix under the name 'SO'.
+ """
+ if sys.version_info < (3, 3, 1):
+ name = 'SO'
+ return get_config_var(name)
diff --git a/setuptools/command/build_py.py b/setuptools/command/build_py.py
index 289e6fb8..b0314fd4 100644
--- a/setuptools/command/build_py.py
+++ b/setuptools/command/build_py.py
@@ -219,7 +219,7 @@ class build_py(orig.build_py, Mixin2to3):
@staticmethod
def _get_platform_patterns(spec, package, src_dir):
"""
- yield platfrom-specific path patterns (suitable for glob
+ yield platform-specific path patterns (suitable for glob
or fn_match) from a glob-based spec (such as
self.package_data or self.exclude_package_data)
matching package in src_dir.
diff --git a/setuptools/command/develop.py b/setuptools/command/develop.py
index 3eb86120..aa82f959 100755
--- a/setuptools/command/develop.py
+++ b/setuptools/command/develop.py
@@ -9,10 +9,11 @@ from setuptools.extern import six
from pkg_resources import Distribution, PathMetadata, normalize_path
from setuptools.command.easy_install import easy_install
+from setuptools import namespaces
import setuptools
-class develop(easy_install):
+class develop(namespaces.DevelopInstaller, easy_install):
"""Set up package for development"""
description = "install package in 'development mode'"
@@ -30,6 +31,7 @@ class develop(easy_install):
if self.uninstall:
self.multi_version = True
self.uninstall_link()
+ self.uninstall_namespaces()
else:
self.install_for_development()
self.warn_deprecated_options()
@@ -123,6 +125,8 @@ class develop(easy_install):
self.easy_install(setuptools.bootstrap_install_from)
setuptools.bootstrap_install_from = None
+ self.install_namespaces()
+
# create an .egg-link in the installation dir, pointing to our egg
log.info("Creating %s (link to %s)", self.egg_link, self.egg_base)
if not self.dry_run:
diff --git a/setuptools/command/easy_install.py b/setuptools/command/easy_install.py
index 03dd6768..36e7f359 100755
--- a/setuptools/command/easy_install.py
+++ b/setuptools/command/easy_install.py
@@ -46,6 +46,7 @@ from setuptools.extern.six.moves import configparser, map
from setuptools import Command
from setuptools.sandbox import run_setup
from setuptools.py31compat import get_path, get_config_vars
+from setuptools.py27compat import rmtree_safe
from setuptools.command import setopt
from setuptools.archive_util import unpack_archive
from setuptools.package_index import (
@@ -627,12 +628,20 @@ class easy_install(Command):
(spec.key, self.build_directory)
)
+ @contextlib.contextmanager
+ def _tmpdir(self):
+ tmpdir = tempfile.mkdtemp(prefix=six.u("easy_install-"))
+ try:
+ # cast to str as workaround for #709 and #710 and #712
+ yield str(tmpdir)
+ finally:
+ os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir))
+
def easy_install(self, spec, deps=False):
- tmpdir = tempfile.mkdtemp(prefix="easy_install-")
if not self.editable:
self.install_site_py()
- try:
+ with self._tmpdir() as tmpdir:
if not isinstance(spec, Requirement):
if URL_SCHEME(spec):
# It's a url, download it to tmpdir and process
@@ -664,10 +673,6 @@ class easy_install(Command):
else:
return self.install_item(spec, dist.location, tmpdir, deps)
- finally:
- if os.path.exists(tmpdir):
- rmtree(tmpdir)
-
def install_item(self, spec, download, tmpdir, deps, install_needed=False):
# Installation is also needed if file in tmpdir or is not an egg
diff --git a/setuptools/command/egg_info.py b/setuptools/command/egg_info.py
index 6cc8f4c4..ca6a4348 100755
--- a/setuptools/command/egg_info.py
+++ b/setuptools/command/egg_info.py
@@ -32,11 +32,6 @@ from setuptools.glob import glob
from pkg_resources.extern import packaging
-try:
- from setuptools_svn import svn_utils
-except ImportError:
- pass
-
def translate_pattern(glob):
"""
@@ -126,18 +121,13 @@ class egg_info(Command):
user_options = [
('egg-base=', 'e', "directory containing .egg-info directories"
" (default: top of the source tree)"),
- ('tag-svn-revision', 'r',
- "Add subversion revision ID to version number"),
('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"),
('tag-build=', 'b', "Specify explicit tag to add to version number"),
- ('no-svn-revision', 'R',
- "Don't add subversion revision ID [default]"),
('no-date', 'D', "Don't include date stamp [default]"),
]
- boolean_options = ['tag-date', 'tag-svn-revision']
+ boolean_options = ['tag-date']
negative_opt = {
- 'no-svn-revision': 'tag-svn-revision',
'no-date': 'tag-date',
}
@@ -147,15 +137,26 @@ class egg_info(Command):
self.egg_base = None
self.egg_info = None
self.tag_build = None
- self.tag_svn_revision = 0
self.tag_date = 0
self.broken_egg_info = False
self.vtags = None
+ ####################################
+ # allow the 'tag_svn_revision' to be detected and
+ # set, supporting sdists built on older Setuptools.
+ @property
+ def tag_svn_revision(self):
+ pass
+
+ @tag_svn_revision.setter
+ def tag_svn_revision(self, value):
+ pass
+ ####################################
+
def save_version_info(self, filename):
"""
- Materialize the values of svn_revision and date into the
- build tag. Install these keys in a deterministic order
+ Materialize the value of date into the
+ build tag. Install build keys in a deterministic order
to avoid arbitrary reordering on subsequent builds.
"""
# python 2.6 compatibility
@@ -165,7 +166,6 @@ class egg_info(Command):
# when PYTHONHASHSEED=0
egg_info['tag_build'] = self.tags()
egg_info['tag_date'] = 0
- egg_info['tag_svn_revision'] = 0
edit_config(filename, dict(egg_info=egg_info))
def finalize_options(self):
@@ -282,22 +282,10 @@ class egg_info(Command):
version = ''
if self.tag_build:
version += self.tag_build
- if self.tag_svn_revision:
- warnings.warn(
- "tag_svn_revision is deprecated and will not be honored "
- "in a future release"
- )
- version += '-r%s' % self.get_svn_revision()
if self.tag_date:
version += time.strftime("-%Y%m%d")
return version
- @staticmethod
- def get_svn_revision():
- if 'svn_utils' not in globals():
- return "0"
- 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")
@@ -554,10 +542,17 @@ class manifest_maker(sdist):
msg = "writing manifest file '%s'" % self.manifest
self.execute(write_file, (self.manifest, files), msg)
- def warn(self, msg): # suppress missing-file warnings from sdist
- if not msg.startswith("standard file not found:"):
+ def warn(self, msg):
+ if not self._should_suppress_warning(msg):
sdist.warn(self, msg)
+ @staticmethod
+ def _should_suppress_warning(msg):
+ """
+ suppress missing-file warnings from sdist
+ """
+ return re.match(r"standard file .*not found", msg)
+
def add_defaults(self):
sdist.add_defaults(self)
self.filelist.append(self.template)
diff --git a/setuptools/command/install_egg_info.py b/setuptools/command/install_egg_info.py
index 7834e107..edc4718b 100755
--- a/setuptools/command/install_egg_info.py
+++ b/setuptools/command/install_egg_info.py
@@ -1,14 +1,13 @@
from distutils import log, dir_util
import os
-from setuptools.extern.six.moves import map
-
from setuptools import Command
+from setuptools import namespaces
from setuptools.archive_util import unpack_archive
import pkg_resources
-class install_egg_info(Command):
+class install_egg_info(namespaces.Installer, Command):
"""Install an .egg-info directory for the package"""
description = "Install an .egg-info directory for the package"
@@ -61,59 +60,3 @@ class install_egg_info(Command):
return dst
unpack_archive(self.source, self.target, skimmer)
-
- def install_namespaces(self):
- nsp = self._get_all_ns_packages()
- if not nsp:
- return
- filename, ext = os.path.splitext(self.target)
- filename += '-nspkg.pth'
- self.outputs.append(filename)
- log.info("Installing %s", filename)
- lines = map(self._gen_nspkg_line, nsp)
-
- if self.dry_run:
- # always generate the lines, even in dry run
- list(lines)
- return
-
- with open(filename, 'wt') as f:
- f.writelines(lines)
-
- _nspkg_tmpl = (
- "import sys, types, os",
- "pep420 = sys.version_info > (3, 3)",
- "p = os.path.join(sys._getframe(1).f_locals['sitedir'], *%(pth)r)",
- "ie = os.path.exists(os.path.join(p,'__init__.py'))",
- "m = not ie and not pep420 and "
- "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))",
- "mp = (m or []) and m.__dict__.setdefault('__path__',[])",
- "(p not in mp) and mp.append(p)",
- )
- "lines for the namespace installer"
-
- _nspkg_tmpl_multi = (
- 'm and setattr(sys.modules[%(parent)r], %(child)r, m)',
- )
- "additional line(s) when a parent package is indicated"
-
- @classmethod
- def _gen_nspkg_line(cls, pkg):
- # ensure pkg is not a unicode string under Python 2.7
- pkg = str(pkg)
- pth = tuple(pkg.split('.'))
- tmpl_lines = cls._nspkg_tmpl
- parent, sep, child = pkg.rpartition('.')
- if parent:
- tmpl_lines += cls._nspkg_tmpl_multi
- return ';'.join(tmpl_lines) % locals() + '\n'
-
- def _get_all_ns_packages(self):
- """Return sorted list of all package namespaces"""
- nsp = set()
- for pkg in self.distribution.namespace_packages or []:
- pkg = pkg.split('.')
- while pkg:
- nsp.add('.'.join(pkg))
- pkg.pop()
- return sorted(nsp)
diff --git a/setuptools/command/sdist.py b/setuptools/command/sdist.py
index 9975753d..84e29a1b 100755
--- a/setuptools/command/sdist.py
+++ b/setuptools/command/sdist.py
@@ -142,9 +142,13 @@ class sdist(sdist_add_defaults, orig.sdist):
for filename in filenames])
def _add_defaults_data_files(self):
- """
- Don't add any data files, but why?
- """
+ try:
+ if six.PY2:
+ sdist_add_defaults._add_defaults_data_files(self)
+ else:
+ super()._add_defaults_data_files()
+ except TypeError:
+ log.warn("data_files contains unexpected objects")
def check_readme(self):
for f in self.READMES:
diff --git a/setuptools/command/test.py b/setuptools/command/test.py
index 270674e2..ef0af12f 100644
--- a/setuptools/command/test.py
+++ b/setuptools/command/test.py
@@ -3,7 +3,8 @@ import operator
import sys
import contextlib
import itertools
-from distutils.errors import DistutilsOptionError
+from distutils.errors import DistutilsError, DistutilsOptionError
+from distutils import log
from unittest import TestLoader
from setuptools.extern import six
@@ -225,11 +226,17 @@ class test(Command):
del_modules.append(name)
list(map(sys.modules.__delitem__, del_modules))
- unittest_main(
+ exit_kwarg = {} if sys.version_info < (2, 7) else {"exit": False}
+ test = unittest_main(
None, None, self._argv,
testLoader=self._resolve_as_ep(self.test_loader),
testRunner=self._resolve_as_ep(self.test_runner),
+ **exit_kwarg
)
+ if not test.result.wasSuccessful():
+ msg = 'Test failed: %s' % test.result
+ self.announce(msg, log.ERROR)
+ raise DistutilsError(msg)
@property
def _argv(self):