Fix the handling of extensions' config values.

This commit is contained in:
Georg Brandl 2008-06-04 20:25:27 +00:00
parent 5cb01d68dc
commit 7e80f60412
3 changed files with 25 additions and 22 deletions

View File

@ -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:

View File

@ -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

View File

@ -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