mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-10-06 11:28:45 +02:00
Fixed some bugs, added a test for ConfigurableDictionary.
This commit is contained in:
parent
248312fe05
commit
362ca56305
@ -205,33 +205,45 @@ class ConfigurableDictionary(object):
|
|||||||
def __init__(self, seq):
|
def __init__(self, seq):
|
||||||
self.helps = {}
|
self.helps = {}
|
||||||
self.types = {}
|
self.types = {}
|
||||||
self.channels = {None: {}}
|
self.defaults = {}
|
||||||
|
self.originalNames = []
|
||||||
|
self.channels = ircutils.IrcDict()
|
||||||
for (name, type, default, help) in seq:
|
for (name, type, default, help) in seq:
|
||||||
self.helps[name] = help
|
self.originalNames.append(name)
|
||||||
|
name = callbacks.canonicalName(name)
|
||||||
|
self.helps[name] = utils.normalizeWhitespace(help)
|
||||||
self.types[name] = type
|
self.types[name] = type
|
||||||
self.channels[None][name] = default
|
self.defaults[name] = default
|
||||||
|
self.originalNames.sort()
|
||||||
|
|
||||||
def get(self, name, channel=None):
|
def get(self, name, channel=None):
|
||||||
try:
|
name = callbacks.canonicalName(name)
|
||||||
|
if channel is not None:
|
||||||
return self.channels[channel][name]
|
return self.channels[channel][name]
|
||||||
except KeyError:
|
else:
|
||||||
return self.channels[None][name]
|
return self.defaults[name]
|
||||||
|
|
||||||
def set(self, name, value, channel=None):
|
def set(self, name, value, channel=None):
|
||||||
|
name = callbacks.canonicalName(name)
|
||||||
|
if channel is not None:
|
||||||
d = self.channels.setdefault(channel, {})
|
d = self.channels.setdefault(channel, {})
|
||||||
d[name] = self.types[name](value)
|
d[name] = self.types[name](value)
|
||||||
|
else:
|
||||||
|
self.defaults[name] = self.types[name](value)
|
||||||
|
|
||||||
def help(self, name):
|
def help(self, name):
|
||||||
|
name = callbacks.canonicalName(name)
|
||||||
return self.helps[name]
|
return self.helps[name]
|
||||||
|
|
||||||
def names(self):
|
def names(self):
|
||||||
L = self.helps.keys()
|
return self.originalNames
|
||||||
L.sort()
|
|
||||||
return L
|
|
||||||
|
|
||||||
# XXX: Make persistent.
|
# XXX: Make persistent.
|
||||||
|
|
||||||
class ConfigurableTypes(object):
|
class ConfigurableTypeError(TypeError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class _ConfigurableTypes(object):
|
||||||
def bool(self, s):
|
def bool(self, s):
|
||||||
s = s.lower()
|
s = s.lower()
|
||||||
if s in ('true', 'enable', 'on'):
|
if s in ('true', 'enable', 'on'):
|
||||||
@ -240,8 +252,8 @@ class ConfigurableTypes(object):
|
|||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
s = 'Value must be one of on/off/true/false/enable/disable.'
|
s = 'Value must be one of on/off/true/false/enable/disable.'
|
||||||
raise ValueError, s
|
raise ConfigurableTypeError, s
|
||||||
|
ConfigurableTypes = _ConfigurableTypes()
|
||||||
|
|
||||||
class Configurable(object):
|
class Configurable(object):
|
||||||
"""A mixin class to provide a "config" command that can be consistent
|
"""A mixin class to provide a "config" command that can be consistent
|
||||||
@ -266,8 +278,15 @@ class Configurable(object):
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
channel = privmsgs.getChannel(msg, args)
|
channel = privmsgs.getChannel(msg, args)
|
||||||
|
capability = ircdb.makeChannelCapability(channel, 'op')
|
||||||
except callbacks.ArgumentError:
|
except callbacks.ArgumentError:
|
||||||
|
raise
|
||||||
|
except callbacks.Error:
|
||||||
channel = None
|
channel = None
|
||||||
|
capability = 'admin'
|
||||||
|
if not ircdb.checkCapability(msg.prefix, capability):
|
||||||
|
irc.error(msg, conf.replyNoCapability % capability)
|
||||||
|
return
|
||||||
(name, value) = privmsgs.getArgs(args, needed=0, optional=2)
|
(name, value) = privmsgs.getArgs(args, needed=0, optional=2)
|
||||||
if not name:
|
if not name:
|
||||||
irc.reply(msg, utils.commaAndify(self.configurables.names()))
|
irc.reply(msg, utils.commaAndify(self.configurables.names()))
|
||||||
@ -280,8 +299,8 @@ class Configurable(object):
|
|||||||
try:
|
try:
|
||||||
self.configurables.set(name, value, channel)
|
self.configurables.set(name, value, channel)
|
||||||
irc.reply(msg, conf.replySuccess)
|
irc.reply(msg, conf.replySuccess)
|
||||||
except Exception, e:
|
except ConfigurableTypeError, e:
|
||||||
irc.error(msg, debug.exnToString(e))
|
irc.error(msg, str(e))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,6 +36,21 @@ import sets
|
|||||||
import irclib
|
import irclib
|
||||||
import plugins
|
import plugins
|
||||||
|
|
||||||
|
class ConfigurableDictionaryTestCase(unittest.TestCase):
|
||||||
|
def test(self):
|
||||||
|
t = plugins.ConfigurableDictionary([('foo', bool, False, 'bar')])
|
||||||
|
self.assertEqual(t.help('foo'), 'bar')
|
||||||
|
self.assertRaises(KeyError, t.help, 'bar')
|
||||||
|
self.assertEqual(t.get('foo'), False)
|
||||||
|
t.set('foo', True)
|
||||||
|
self.assertEqual(t.get('foo'), True)
|
||||||
|
t.set('foo', False, '#foo')
|
||||||
|
self.assertEqual(t.get('foo', '#foo'), False)
|
||||||
|
self.assertEqual(t.get('foo'), True)
|
||||||
|
self.assertRaises(KeyError, t.set, 'bar', True)
|
||||||
|
self.assertRaises(KeyError, t.set, 'bar', True, '#foo')
|
||||||
|
|
||||||
|
|
||||||
class ToggleDictionaryTestCase(unittest.TestCase):
|
class ToggleDictionaryTestCase(unittest.TestCase):
|
||||||
def test(self):
|
def test(self):
|
||||||
t = plugins.ToggleDictionary({'foo': True})
|
t = plugins.ToggleDictionary({'foo': True})
|
||||||
|
Loading…
Reference in New Issue
Block a user