mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Fix the handling of extensions' config values.
This commit is contained in:
parent
5cb01d68dc
commit
7e80f60412
@ -74,10 +74,7 @@ class Sphinx(object):
|
|||||||
self._events = events.copy()
|
self._events = events.copy()
|
||||||
|
|
||||||
# read config
|
# read config
|
||||||
self.config = Config(confdir, 'conf.py')
|
self.config = Config(confdir, 'conf.py', confoverrides)
|
||||||
if confoverrides:
|
|
||||||
for key, val in confoverrides.items():
|
|
||||||
setattr(self.config, key, val)
|
|
||||||
|
|
||||||
# load all extension modules
|
# load all extension modules
|
||||||
for extension in self.config.extensions:
|
for extension in self.config.extensions:
|
||||||
@ -86,6 +83,9 @@ class Sphinx(object):
|
|||||||
if self.config.setup:
|
if self.config.setup:
|
||||||
self.config.setup(self)
|
self.config.setup(self)
|
||||||
|
|
||||||
|
# now that we know all config values, collect them from conf.py
|
||||||
|
self.config.init_values()
|
||||||
|
|
||||||
if buildername is None:
|
if buildername is None:
|
||||||
print >>status, 'No builder selected, using default: html'
|
print >>status, 'No builder selected, using default: html'
|
||||||
buildername = 'html'
|
buildername = 'html'
|
||||||
@ -176,10 +176,9 @@ class Sphinx(object):
|
|||||||
self.builderclasses[builder.name] = builder
|
self.builderclasses[builder.name] = builder
|
||||||
|
|
||||||
def add_config_value(self, name, default, rebuild_env):
|
def add_config_value(self, name, default, rebuild_env):
|
||||||
if name in self.config.valuenames:
|
if name in self.config.config_values:
|
||||||
raise ExtensionError('Config value %r already present' % name)
|
raise ExtensionError('Config value %r already present' % name)
|
||||||
self.config.valuenames.add(name)
|
self.config.config_values[name] = (default, rebuild_env)
|
||||||
self.config.__class__.config_values[name] = (default, rebuild_env)
|
|
||||||
|
|
||||||
def add_event(self, name):
|
def add_event(self, name):
|
||||||
if name in self._events:
|
if name in self._events:
|
||||||
|
@ -30,11 +30,7 @@ class Config(object):
|
|||||||
today = ('', True),
|
today = ('', True),
|
||||||
today_fmt = ('%B %d, %Y', True),
|
today_fmt = ('%B %d, %Y', True),
|
||||||
|
|
||||||
# extensibility
|
# general options
|
||||||
templates_path = ([], False),
|
|
||||||
extensions = ([], True),
|
|
||||||
|
|
||||||
# general reading options
|
|
||||||
master_doc = ('contents', True),
|
master_doc = ('contents', True),
|
||||||
source_suffix = ('.rst', True),
|
source_suffix = ('.rst', True),
|
||||||
unused_docs = ([], True),
|
unused_docs = ([], True),
|
||||||
@ -44,6 +40,7 @@ class Config(object):
|
|||||||
add_module_names = (True, True),
|
add_module_names = (True, True),
|
||||||
show_authors = (False, True),
|
show_authors = (False, True),
|
||||||
pygments_style = ('sphinx', False),
|
pygments_style = ('sphinx', False),
|
||||||
|
templates_path = ([], False),
|
||||||
template_bridge = (None, False),
|
template_bridge = (None, False),
|
||||||
|
|
||||||
# HTML options
|
# HTML options
|
||||||
@ -80,8 +77,8 @@ class Config(object):
|
|||||||
latex_use_modindex = (True, False),
|
latex_use_modindex = (True, False),
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, dirname, filename):
|
def __init__(self, dirname, filename, overrides):
|
||||||
self.valuenames = set(self.config_values.keys())
|
self.overrides = overrides
|
||||||
config = {'__file__': path.join(dirname, filename)}
|
config = {'__file__': path.join(dirname, filename)}
|
||||||
olddir = os.getcwd()
|
olddir = os.getcwd()
|
||||||
try:
|
try:
|
||||||
@ -89,15 +86,24 @@ class Config(object):
|
|||||||
execfile(config['__file__'], config)
|
execfile(config['__file__'], config)
|
||||||
finally:
|
finally:
|
||||||
os.chdir(olddir)
|
os.chdir(olddir)
|
||||||
for name in config:
|
self._raw_config = config
|
||||||
if name in self.valuenames:
|
# these two must be preinitialized because extensions can add their
|
||||||
self.__dict__[name] = config[name]
|
# own config values
|
||||||
self.setup = config.get('setup', None)
|
self.setup = config.get('setup', None)
|
||||||
|
self.extensions = config.get('extensions', [])
|
||||||
|
|
||||||
|
def init_values(self):
|
||||||
|
config = self._raw_config
|
||||||
|
config.update(self.overrides)
|
||||||
|
for name in self._raw_config:
|
||||||
|
if name in self.config_values:
|
||||||
|
self.__dict__[name] = config[name]
|
||||||
|
del self._raw_config
|
||||||
|
|
||||||
def __getattr__(self, name):
|
def __getattr__(self, name):
|
||||||
if name.startswith('_'):
|
if name.startswith('_'):
|
||||||
raise AttributeError(name)
|
raise AttributeError(name)
|
||||||
if name not in self.valuenames:
|
if name not in self.config_values:
|
||||||
raise AttributeError('No such config value: %s' % name)
|
raise AttributeError('No such config value: %s' % name)
|
||||||
default = self.config_values[name][0]
|
default = self.config_values[name][0]
|
||||||
if callable(default):
|
if callable(default):
|
||||||
@ -114,4 +120,4 @@ class Config(object):
|
|||||||
delattr(self, name)
|
delattr(self, name)
|
||||||
|
|
||||||
def __contains__(self, name):
|
def __contains__(self, name):
|
||||||
return name in self.valuenames
|
return name in self.config_values
|
||||||
|
@ -397,9 +397,7 @@ class BuildEnvironment:
|
|||||||
for key, descr in config.config_values.iteritems():
|
for key, descr in config.config_values.iteritems():
|
||||||
if not descr[1]:
|
if not descr[1]:
|
||||||
continue
|
continue
|
||||||
if not hasattr(self.config, key) or \
|
if self.config[key] != config[key]:
|
||||||
self.config[key] != config[key]:
|
|
||||||
|
|
||||||
msg = '[config changed] '
|
msg = '[config changed] '
|
||||||
config_changed = True
|
config_changed = True
|
||||||
break
|
break
|
||||||
|
Loading…
Reference in New Issue
Block a user