Fix for bug #1031800, uncaught exceptions in Config commands.

This commit is contained in:
James Vega 2004-09-21 14:21:57 +00:00
parent f3d0670175
commit 3ee4223bda
2 changed files with 26 additions and 31 deletions

View File

@ -54,8 +54,8 @@ import supybot.callbacks as callbacks
# Now, to setup the registry. # Now, to setup the registry.
### ###
class InvalidRegistryName(callbacks.Error): #class InvalidRegistryName(callbacks.Error):
pass # pass
def getWrapper(name): def getWrapper(name):
parts = registry.split(name) parts = registry.split(name)
@ -65,8 +65,11 @@ def getWrapper(name):
while parts: while parts:
try: try:
group = group.get(parts.pop(0)) group = group.get(parts.pop(0))
except registry.NonExistentRegistryEntry: # We'll catch registry.InvalidRegistryName and re-raise it here so
raise InvalidRegistryName, name # that we have a useful error message for the user.
except (registry.NonExistentRegistryEntry,
registry.InvalidRegistryName):
raise registry.InvalidRegistryName, name
return group return group
def getCapability(name): def getCapability(name):
@ -97,12 +100,13 @@ if os.name == 'posix':
class Config(callbacks.Privmsg): class Config(callbacks.Privmsg):
def callCommand(self, name, irc, msg, *L, **kwargs): def callCommand(self, name, irc, msg, *L, **kwargs):
#XXX For some reason, that confuses jamessan, InvalidRegistryName #XXX For some reason, that confuses jamessan, InvalidRegistryName
# is not really being caught here, but it is caught if we # is not really being caught here, but registry.InvalidRegistryName
# attempt to catch it in the individual command methods. # is. So, we'll just re-raise registry.InvalidRegsitryName instead
# of using Config.InvalidRegistryName
try: try:
super(Config, self).callCommand(name, irc, msg, *L, **kwargs) super(Config, self).callCommand(name, irc, msg, *L, **kwargs)
except InvalidRegistryName, e: except registry.InvalidRegistryName, e:
irc.errorInvalid('configuration variable', e.args[0]) irc.errorInvalid('configuration variable', str(e))
except registry.InvalidRegistryValue, e: except registry.InvalidRegistryValue, e:
irc.error(str(e)) irc.error(str(e))
@ -133,10 +137,7 @@ class Config(callbacks.Privmsg):
configuration <group>. Subgroups are indicated by a preceding @. configuration <group>. Subgroups are indicated by a preceding @.
""" """
name = privmsgs.getArgs(args) name = privmsgs.getArgs(args)
try: L = self._list(name)
L = self._list(name)
except InvalidRegistryName, e:
irc.errorInvalid('configuration variable', e.args[0], Raise=True)
if L: if L:
irc.reply(utils.commaAndify(L)) irc.reply(utils.commaAndify(L))
else: else:
@ -167,13 +168,10 @@ class Config(callbacks.Privmsg):
returns the current value of <name>. You may omit the leading returns the current value of <name>. You may omit the leading
"supybot." in the name if you so choose. "supybot." in the name if you so choose.
""" """
try: if len(args) >= 2:
if len(args) >= 2: self._set(irc, msg, args)
self._set(irc, msg, args) else:
else: self._get(irc, msg, args)
self._get(irc, msg, args)
except InvalidRegistryName, e:
irc.errorInvalid('configuration variable', e.args[0], Raise=True)
def channel(self, irc, msg, args): def channel(self, irc, msg, args):
"""[<channel>] <name> [<value>] """[<channel>] <name> [<value>]
@ -186,10 +184,7 @@ class Config(callbacks.Privmsg):
if not args: if not args:
raise callbacks.ArgumentError raise callbacks.ArgumentError
args[0] = self._canonicalizeName(args[0]) args[0] = self._canonicalizeName(args[0])
try: wrapper = getWrapper(args[0])
wrapper = getWrapper(args[0])
except InvalidRegistryName, e:
irc.errorInvalid('configuration variable', e.args[0], Raise=True)
if not wrapper.channelValue: if not wrapper.channelValue:
irc.error('That configuration variable is not a channel-specific ' irc.error('That configuration variable is not a channel-specific '
'configuration variable.') 'configuration variable.')
@ -243,10 +238,7 @@ class Config(callbacks.Privmsg):
""" """
name = privmsgs.getArgs(args) name = privmsgs.getArgs(args)
name = self._canonicalizeName(name) name = self._canonicalizeName(name)
try: wrapper = getWrapper(name)
wrapper = getWrapper(name)
except InvalidRegistryName, e:
irc.errorInvalid('configuration variable', e.args[0], Raise=True)
if hasattr(wrapper, 'help'): if hasattr(wrapper, 'help'):
s = wrapper.help s = wrapper.help
if hasattr(wrapper, 'value') and not wrapper._private: if hasattr(wrapper, 'value') and not wrapper._private:
@ -262,10 +254,7 @@ class Config(callbacks.Privmsg):
""" """
name = privmsgs.getArgs(args) name = privmsgs.getArgs(args)
name = self._canonicalizeName(name) name = self._canonicalizeName(name)
try: wrapper = getWrapper(name)
wrapper = getWrapper(name)
except InvalidRegistryName, e:
irc.errorInvalid('configuration variable', e.args[0], Raise=True)
v = wrapper.__class__(wrapper._default, '') v = wrapper.__class__(wrapper._default, '')
irc.reply(str(v)) irc.reply(str(v))

View File

@ -66,6 +66,12 @@ class ConfigTestCase(ChannelPluginTestCase):
self.assertNotError('config default ' self.assertNotError('config default '
'supybot.replies.genericNoCapability') 'supybot.replies.genericNoCapability')
def testConfigErrors(self):
self.assertRegexp('config supybot.replies.', 'not a valid')
self.assertRegexp('config supybot.repl', 'not a valid')
self.assertRegexp('config supybot.reply.withNickPrefix 123',
'True or False')
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: