From e066c97f828ec5ab8be4dde6e340dbfdcd312ec0 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Wed, 14 Dec 2016 10:47:11 -0500 Subject: [PATCH 1/3] Backport config file parsing behavior from Python 3.7. Ref #889. --- setuptools/dist.py | 3 +- setuptools/py36compat.py | 82 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 setuptools/py36compat.py diff --git a/setuptools/dist.py b/setuptools/dist.py index c04e64268b..159464be23 100644 --- a/setuptools/dist.py +++ b/setuptools/dist.py @@ -21,6 +21,7 @@ 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 0000000000..5bad963025 --- /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 From 1802d1322ccffcd0b79c63aa7ce9d22e0106015c Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Wed, 14 Dec 2016 11:00:45 -0500 Subject: [PATCH 2/3] Apply patch, disabling interpolation. Fixes #889. --- setuptools/py36compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setuptools/py36compat.py b/setuptools/py36compat.py index 5bad963025..f527969645 100644 --- a/setuptools/py36compat.py +++ b/setuptools/py36compat.py @@ -33,7 +33,7 @@ def parse_config_files(self, filenames=None): if DEBUG: self.announce("Distribution.parse_config_files():") - parser = ConfigParser() + parser = ConfigParser(interpolation=None) for filename in filenames: if DEBUG: self.announce(" reading %s" % filename) From e2acd39745b32fb34ca4832377839448bcaa260b Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Wed, 14 Dec 2016 11:03:06 -0500 Subject: [PATCH 3/3] Update changelog. Ref #889. --- CHANGES.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 7d6386c2f2..852947fd71 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,9 @@ +v31.1.0 +------- + +* #889: Backport proposed fix for disabling interpolation in + distutils.Distribution.parse_config_files. + v31.0.1 -------