Persistent renames.

This commit is contained in:
Jeremy Fincher 2004-09-11 16:16:16 +00:00
parent dd7b02fb54
commit e525e04a42
2 changed files with 62 additions and 12 deletions

View File

@ -121,6 +121,13 @@ def loadPluginClass(irc, module, register=None):
public = cb.public public = cb.public
conf.registerPlugin(name, register, public) conf.registerPlugin(name, register, public)
assert not irc.getCallback(name) assert not irc.getCallback(name)
try:
renames = conf.supybot.commands.renames.get(name)
for (name, v) in renames.getValues(fullNames=False):
newName = v()
renameCommand(cb, name, newName)
except registry.NonExistentRegistryEntry, e:
pass # The plugin isn't there.
irc.addCallback(cb) irc.addCallback(cb)
return cb return cb
@ -133,10 +140,10 @@ conf.supybot.plugins.Owner.register('public', registry.Boolean(True,
### ###
conf.registerGroup(conf.supybot.commands, 'defaultPlugins', conf.registerGroup(conf.supybot.commands, 'defaultPlugins',
orderAlphabetically=True) orderAlphabetically=True, help=utils.normalizeWhitespace("""Determines
conf.supybot.commands.defaultPlugins.help = utils.normalizeWhitespace(""" what commands have default plugins set, and which plugins are set to
Determines what commands have default plugins set, and which plugins are set to be the default for each of those commands."""))
be the default for each of those commands.""".strip()) conf.registerGroup(conf.supybot.commands, 'renames', orderAlphabetically=True)
def registerDefaultPlugin(command, plugin): def registerDefaultPlugin(command, plugin):
command = callbacks.canonicalName(command) command = callbacks.canonicalName(command)
@ -145,14 +152,30 @@ def registerDefaultPlugin(command, plugin):
# This must be set, or the quotes won't be removed. # This must be set, or the quotes won't be removed.
conf.supybot.commands.defaultPlugins.get(command).set(plugin) conf.supybot.commands.defaultPlugins.get(command).set(plugin)
registerDefaultPlugin('ignore', 'Admin') def registerRename(plugin, command, newName):
registerDefaultPlugin('unignore', 'Admin') g = conf.registerGroup(conf.supybot.commands.renames, plugin)
registerDefaultPlugin('addcapability', 'Admin') v = conf.registerGlobalValue(g, command, registry.String(newName, ''))
registerDefaultPlugin('removecapability', 'Admin') v.setValue(newName) # In case it was already registered.
return v
def renameCommand(cb, name, newName):
assert not hasattr(cb, newName), 'Cannot rename over existing attributes.'
assert newName == callbacks.canonicalName(newName), \
'newName must already be canonicalized.'
if name != newName:
method = getattr(cb.__class__, name)
setattr(cb.__class__, newName, method)
delattr(cb.__class__, name)
registerDefaultPlugin('list', 'Misc') registerDefaultPlugin('list', 'Misc')
registerDefaultPlugin('help', 'Misc') registerDefaultPlugin('help', 'Misc')
registerDefaultPlugin('ignore', 'Admin')
registerDefaultPlugin('reload', 'Owner') registerDefaultPlugin('reload', 'Owner')
registerDefaultPlugin('unignore', 'Admin')
registerDefaultPlugin('capabilities', 'User') registerDefaultPlugin('capabilities', 'User')
registerDefaultPlugin('addcapability', 'Admin')
registerDefaultPlugin('removecapability', 'Admin')
class holder(object): class holder(object):
pass pass
@ -778,16 +801,29 @@ class Owner(privmsgs.CapabilityCheckingPrivmsg):
if cb is None: if cb is None:
irc.errorInvalid('plugin', plugin, Raise=True) irc.errorInvalid('plugin', plugin, Raise=True)
if not cb.isCommand(command): if not cb.isCommand(command):
irc.errorInvalid('command in the %s plugin'%plugin,name,Raise=True) what = 'command in the %s plugin' % plugin
irc.errorInvalid(what, name, Raise=True)
if hasattr(cb, name): if hasattr(cb, name):
irc.error('The %s plugin already has an attribute named %s.' % irc.error('The %s plugin already has an attribute named %s.' %
(plugin, name)) (plugin, name))
return return
method = getattr(cb.__class__, command) registerRename(cb.name(), command, name)
setattr(cb.__class__, name, method) renameCommand(cb, command, newName)
delattr(cb.__class__, command)
irc.replySuccess() irc.replySuccess()
def unrename(self, irc, msg, args):
"""<plugin>
Removes all renames in <plugin>. The plugin will be reloaded after
this command is run.
"""
plugin = privmsgs.getArgs(args)
try:
conf.supybot.commands.renames.unregister(plugin)
except registry.NonExistentRegistryEntry:
irc.errorInvalid('plugin', plugin, Raise=True)
self.reload(irc, msg, args) # This makes the replySuccess.
def _connect(self, network, serverPort=None): def _connect(self, network, serverPort=None):
try: try:
group = conf.supybot.networks.get(network) group = conf.supybot.networks.get(network)

View File

@ -107,6 +107,20 @@ class OwnerTestCase(PluginTestCase, PluginDocumentation):
self.assertNotError('disable Foo') self.assertNotError('disable Foo')
self.assertNotError('enable foo') self.assertNotError('enable foo')
def testRename(self):
self.assertError('rename admin ignore IGNORE')
self.assertError('rename admin ignore ig-nore')
self.assertNotError('rename admin removecapability rmcap')
self.assertNotRegexp('list admin', 'removecapability')
self.assertRegexp('list admin', 'rmcap')
self.assertNotError('reload admin')
self.assertNotRegexp('list admin', 'removecapability')
self.assertRegexp('list admin', 'rmcap')
self.assertNotError('unrename admin')
self.assertRegexp('list admin', 'removecapability')
self.assertNotRegexp('list admin', 'rmcap')
class FunctionsTestCase(SupyTestCase): class FunctionsTestCase(SupyTestCase):
def testLoadPluginModule(self): def testLoadPluginModule(self):