d98e70c13eff followup: only do type conversion of confoverrides if the values are strings and add a test

This commit is contained in:
Georg Brandl 2014-01-10 22:10:29 +01:00
parent 1356aff6d7
commit 8fdcb803cf
3 changed files with 31 additions and 23 deletions

View File

@ -214,8 +214,11 @@ class Config(object):
self.overrides = overrides self.overrides = overrides
self.values = Config.config_values.copy() self.values = Config.config_values.copy()
config = {} config = {}
if "extensions" in overrides: if 'extensions' in overrides:
config["extensions"] = overrides["extensions"] if isinstance(overrides['extensions'], (str, unicode)):
config['extensions'] = overrides.pop('extensions').split(',')
else:
config['extensions'] = overrides.pop('extensions')
if dirname is not None: if dirname is not None:
config_file = path.join(dirname, filename) config_file = path.join(dirname, filename)
config['__file__'] = config_file config['__file__'] = config_file
@ -259,22 +262,25 @@ class Config(object):
warn('unknown config value %r in override, ignoring' % valname) warn('unknown config value %r in override, ignoring' % valname)
continue continue
defvalue = self.values[valname][0] defvalue = self.values[valname][0]
if isinstance(defvalue, dict): if isinstance(value, (str, unicode)):
warn('cannot override dictionary config setting %r, ' if isinstance(defvalue, dict):
'ignoring (use %r to set individual elements)' % warn('cannot override dictionary config setting %r, '
(valname, valname + '.key=value')) 'ignoring (use %r to set individual elements)' %
continue (valname, valname + '.key=value'))
elif isinstance(defvalue, list): continue
config[valname] = value.split(',') elif isinstance(defvalue, list):
elif isinstance(defvalue, (int, long)): config[valname] = value.split(',')
try: elif isinstance(defvalue, (int, long)):
config[valname] = int(value) try:
except ValueError: config[valname] = int(value)
warn('invalid number %r for config value %r, ignoring' except ValueError:
% (value, valname)) warn('invalid number %r for config value %r, ignoring'
elif not isinstance(defvalue, (str, unicode)): % (value, valname))
warn('cannot override config setting %r with unsupported type, ' elif defvalue is not None and not isinstance(defvalue, (str, unicode)):
'ignoring' % valname) warn('cannot override config setting %r with unsupported type, '
'ignoring' % valname)
else:
config[valname] = value
else: else:
config[valname] = value config[valname] = value
for name in config: for name in config:

View File

@ -19,7 +19,8 @@ from sphinx.util.pycompat import b
@with_app(confoverrides={'master_doc': 'master', 'nonexisting_value': 'True', @with_app(confoverrides={'master_doc': 'master', 'nonexisting_value': 'True',
'latex_elements.docclass': 'scrartcl'}) 'latex_elements.docclass': 'scrartcl',
'modindex_common_prefix': 'path1,path2'})
def test_core_config(app): def test_core_config(app):
cfg = app.config cfg = app.config
@ -31,6 +32,7 @@ def test_core_config(app):
# overrides # overrides
assert cfg.master_doc == 'master' assert cfg.master_doc == 'master'
assert cfg.latex_elements['docclass'] == 'scrartcl' assert cfg.latex_elements['docclass'] == 'scrartcl'
assert cfg.modindex_common_prefix == ['path1', 'path2']
# simple default values # simple default values
assert 'locale_dirs' not in cfg.__dict__ assert 'locale_dirs' not in cfg.__dict__
@ -92,7 +94,7 @@ def test_errors_warnings(dir):
write_file(dir / 'conf.py', u'# -*- coding: utf-8\n\n' write_file(dir / 'conf.py', u'# -*- coding: utf-8\n\n'
u'project = u"Jägermeister"\n', 'utf-8') u'project = u"Jägermeister"\n', 'utf-8')
cfg = Config(dir, 'conf.py', {}, None) cfg = Config(dir, 'conf.py', {}, None)
cfg.init_values() cfg.init_values(lambda warning: 1/0)
assert cfg.project == u'Jägermeister' assert cfg.project == u'Jägermeister'
# test the warning for bytestrings with non-ascii content # test the warning for bytestrings with non-ascii content
@ -122,5 +124,5 @@ def test_config_eol(tmpdir):
for eol in ('\n', '\r\n'): for eol in ('\n', '\r\n'):
configfile.write_bytes(b('project = "spam"' + eol)) configfile.write_bytes(b('project = "spam"' + eol))
cfg = Config(tmpdir, 'conf.py', {}, None) cfg = Config(tmpdir, 'conf.py', {}, None)
cfg.init_values() cfg.init_values(lambda warning: 1/0)
assert cfg.project == u'spam' assert cfg.project == u'spam'

View File

@ -81,7 +81,7 @@ def test_read_inventory_v2():
'/util/glossary.html#term-a-term' '/util/glossary.html#term-a-term'
@with_app(confoverrides={'extensions': 'sphinx.ext.intersphinx'}) @with_app()
@with_tempdir @with_tempdir
def test_missing_reference(tempdir, app): def test_missing_reference(tempdir, app):
inv_file = tempdir / 'inventory' inv_file = tempdir / 'inventory'
@ -157,7 +157,7 @@ def test_missing_reference(tempdir, app):
assert contnode[0].astext() == 'py3k:unknown' assert contnode[0].astext() == 'py3k:unknown'
@with_app(confoverrides={'extensions': 'sphinx.ext.intersphinx'}) @with_app()
@with_tempdir @with_tempdir
def test_load_mappings_warnings(tempdir, app): def test_load_mappings_warnings(tempdir, app):
""" """