aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason R. Coombs <jaraco@jaraco.com>2016-12-14 10:47:11 -0500
committerJason R. Coombs <jaraco@jaraco.com>2016-12-14 10:47:11 -0500
commite066c97f828ec5ab8be4dde6e340dbfdcd312ec0 (patch)
treee61319da68cd1f280d38bbe2bef1b1600618f2e8
parent5c5d40c367a1d32fdb0379e5961abd659f67a01f (diff)
downloadexternal_python_setuptools-e066c97f828ec5ab8be4dde6e340dbfdcd312ec0.tar.gz
external_python_setuptools-e066c97f828ec5ab8be4dde6e340dbfdcd312ec0.tar.bz2
external_python_setuptools-e066c97f828ec5ab8be4dde6e340dbfdcd312ec0.zip
Backport config file parsing behavior from Python 3.7. Ref #889.
-rw-r--r--setuptools/dist.py3
-rw-r--r--setuptools/py36compat.py82
2 files changed, 84 insertions, 1 deletions
diff --git a/setuptools/dist.py b/setuptools/dist.py
index c04e6426..159464be 100644
--- a/setuptools/dist.py
+++ b/setuptools/dist.py
@@ -21,6 +21,7 @@ from setuptools import windows_support
from setuptools.monkey import get_unpatched
from setuptools.config import parse_configuration
import pkg_resources
+from .py36compat import Distribution_parse_config_files
def _get_unpatched(cls):
@@ -213,7 +214,7 @@ def check_packages(dist, attr, value):
_Distribution = get_unpatched(distutils.core.Distribution)
-class Distribution(_Distribution):
+class Distribution(Distribution_parse_config_files, _Distribution):
"""Distribution with support for features, tests, and package data
This is an enhanced version of 'distutils.dist.Distribution' that
diff --git a/setuptools/py36compat.py b/setuptools/py36compat.py
new file mode 100644
index 00000000..5bad9630
--- /dev/null
+++ b/setuptools/py36compat.py
@@ -0,0 +1,82 @@
+import sys
+from distutils.errors import DistutilsOptionError
+from distutils.util import strtobool
+from distutils.debug import DEBUG
+
+
+class Distribution_parse_config_files:
+ """
+ Mix-in providing forward-compatibility for functionality to be
+ included by default on Python 3.7.
+
+ Do not edit the code in this class except to update functionality
+ as implemented in distutils.
+ """
+ def parse_config_files(self, filenames=None):
+ from configparser import ConfigParser
+
+ # Ignore install directory options if we have a venv
+ if sys.prefix != sys.base_prefix:
+ ignore_options = [
+ 'install-base', 'install-platbase', 'install-lib',
+ 'install-platlib', 'install-purelib', 'install-headers',
+ 'install-scripts', 'install-data', 'prefix', 'exec-prefix',
+ 'home', 'user', 'root']
+ else:
+ ignore_options = []
+
+ ignore_options = frozenset(ignore_options)
+
+ if filenames is None:
+ filenames = self.find_config_files()
+
+ if DEBUG:
+ self.announce("Distribution.parse_config_files():")
+
+ parser = ConfigParser()
+ for filename in filenames:
+ if DEBUG:
+ self.announce(" reading %s" % filename)
+ parser.read(filename)
+ for section in parser.sections():
+ options = parser.options(section)
+ opt_dict = self.get_option_dict(section)
+
+ for opt in options:
+ if opt != '__name__' and opt not in ignore_options:
+ val = parser.get(section,opt)
+ opt = opt.replace('-', '_')
+ opt_dict[opt] = (filename, val)
+
+ # Make the ConfigParser forget everything (so we retain
+ # the original filenames that options come from)
+ parser.__init__()
+
+ # If there was a "global" section in the config file, use it
+ # to set Distribution options.
+
+ if 'global' in self.command_options:
+ for (opt, (src, val)) in self.command_options['global'].items():
+ alias = self.negative_opt.get(opt)
+ try:
+ if alias:
+ setattr(self, alias, not strtobool(val))
+ elif opt in ('verbose', 'dry_run'): # ugh!
+ setattr(self, opt, strtobool(val))
+ else:
+ setattr(self, opt, val)
+ except ValueError as msg:
+ raise DistutilsOptionError(msg)
+
+
+if sys.version_info < (3,):
+ # Python 2 behavior is sufficient
+ class Distribution_parse_config_files:
+ pass
+
+
+if False:
+ # When updated behavior is available upstream,
+ # disable override here.
+ class Distribution_parse_config_files:
+ pass