supybotconfig - fix __init__ order
Ignore-this: 684574bdf546a62ee97c3fbd8ac5f637 - This fixes a problem where writer_map was not properly being read from the supybot config system. It was caused by __init__ in the Config class not being able to get data from the supybot config proxy. - This patch rebinds __init__ to use the supybot config proxy __getattr__ scheme. - As part of fixing this, I had to add code to rebind descriptors/properties to use the config proxy, too. darcs-hash:20101210055924-82ea9-e10c282c4803cb987f6dd423838b474b686d9c50.gz
This commit is contained in:
parent
1e84fdf2cc
commit
9fe9ab8376
@ -77,15 +77,20 @@ class SupybotConfigProxy(object):
|
|||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
"""Do the regular default configuration, and sta"""
|
"""Do the regular default configuration, and sta"""
|
||||||
OriginalConfig = self.__OriginalConfig
|
OriginalConfig = self.__OriginalConfig
|
||||||
self.__C = OriginalConfig(*args, **kwargs)
|
self.__C = OriginalConfig.__new__(OriginalConfig, *args, **kwargs)
|
||||||
|
# We need to call the __init__ *after* we have rebound the
|
||||||
|
# method to get variables from the config proxy.
|
||||||
|
old_init = self.__C.__init__
|
||||||
|
new_init = types.MethodType(old_init.im_func, self, old_init.im_class)
|
||||||
|
new_init(*args, **kwargs)
|
||||||
|
|
||||||
def __getattr__(self, attrname):
|
def __getattr__(self, attrname):
|
||||||
"""Try to get the value from the supybot registry. If it's in
|
"""Try to get the value from the supybot registry. If it's in
|
||||||
the registry, return it. If it's not, then proxy it to th.
|
the registry, return it. If it's not, then proxy it to th.
|
||||||
"""
|
"""
|
||||||
if attrname in settable_attributes:
|
if attrname in settable_attributes:
|
||||||
value = self.__C.M._registryValue(attrname,
|
M = self.M
|
||||||
channel=self.__C.M.channel)
|
value = M._registryValue(attrname, channel=M.channel)
|
||||||
if not isinstance(value, (str, unicode)):
|
if not isinstance(value, (str, unicode)):
|
||||||
return value
|
return value
|
||||||
# '.' is used to mean "this is not set, use the default
|
# '.' is used to mean "this is not set, use the default
|
||||||
@ -93,6 +98,19 @@ class SupybotConfigProxy(object):
|
|||||||
if value != '.':
|
if value != '.':
|
||||||
value = value.replace('\\n', '\n')
|
value = value.replace('\\n', '\n')
|
||||||
return value
|
return value
|
||||||
|
# If the attribute is a _property_, we need to rebind the
|
||||||
|
# "fget" method to the proxy class.
|
||||||
|
# See http://docs.python.org/library/functions.html#property
|
||||||
|
# http://docs.python.org/reference/datamodel.html#descriptors
|
||||||
|
C = self.__C
|
||||||
|
# is this a class attribute AND does it have a fget ?
|
||||||
|
if hasattr(C.__class__, attrname) and \
|
||||||
|
hasattr(getattr(C.__class__, attrname), 'fget'):
|
||||||
|
# Get the 'fget' descriptor, rebind it to self, return its
|
||||||
|
# value.
|
||||||
|
fget = getattr(C.__class__, attrname).fget
|
||||||
|
fget = types.MethodType(fget, self, C.__class__)
|
||||||
|
return fget()
|
||||||
# We don't have this value in the registry. So, proxy it to
|
# We don't have this value in the registry. So, proxy it to
|
||||||
# the normal config object. This is also the path that all
|
# the normal config object. This is also the path that all
|
||||||
# functions take.
|
# functions take.
|
||||||
|
@ -460,8 +460,6 @@ class Meeting(MeetingCommands, object):
|
|||||||
setTopic=None, sendReply=None, getRegistryValue=None,
|
setTopic=None, sendReply=None, getRegistryValue=None,
|
||||||
safeMode=False, channelNicks=None,
|
safeMode=False, channelNicks=None,
|
||||||
extraConfig={}, network='nonetwork'):
|
extraConfig={}, network='nonetwork'):
|
||||||
self.config = Config(self, writeRawLog=writeRawLog, safeMode=safeMode,
|
|
||||||
extraConfig=extraConfig)
|
|
||||||
if getRegistryValue is not None:
|
if getRegistryValue is not None:
|
||||||
self._registryValue = getRegistryValue
|
self._registryValue = getRegistryValue
|
||||||
if sendReply is not None:
|
if sendReply is not None:
|
||||||
@ -472,6 +470,8 @@ class Meeting(MeetingCommands, object):
|
|||||||
self.channel = channel
|
self.channel = channel
|
||||||
self.network = network
|
self.network = network
|
||||||
self.currenttopic = ""
|
self.currenttopic = ""
|
||||||
|
self.config = Config(self, writeRawLog=writeRawLog, safeMode=safeMode,
|
||||||
|
extraConfig=extraConfig)
|
||||||
if oldtopic:
|
if oldtopic:
|
||||||
self.oldtopic = self.config.dec(oldtopic)
|
self.oldtopic = self.config.dec(oldtopic)
|
||||||
else:
|
else:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user