Skip to content

Commit

Permalink
Merge with issue-889. Ref #889.
Browse files Browse the repository at this point in the history
  • Loading branch information
jaraco committed Dec 24, 2016
2 parents 3bc56c2 + e2acd39 commit c3a257a
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 1 deletion.
6 changes: 6 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
v32.3.0
-------

* #889: Backport proposed fix for disabling interpolation in
distutils.Distribution.parse_config_files.

v32.2.0
-------

Expand Down
3 changes: 2 additions & 1 deletion setuptools/dist.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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
Expand Down
82 changes: 82 additions & 0 deletions setuptools/py36compat.py
Original file line number Diff line number Diff line change
@@ -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(interpolation=None)
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

0 comments on commit c3a257a

Please sign in to comment.