From fb60da149bd7e58c7f455a3cc7f778a88c94ada1 Mon Sep 17 00:00:00 2001 From: Jeremy Fincher Date: Sat, 13 Sep 2003 13:30:33 +0000 Subject: [PATCH] Added ability to specify optional arguments in aliases with @\d+. --- plugins/Alias.py | 30 ++++++++++++++++++++---------- test/test_Alias.py | 9 +++++++-- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/plugins/Alias.py b/plugins/Alias.py index f22babe9f..7f4d936fd 100644 --- a/plugins/Alias.py +++ b/plugins/Alias.py @@ -108,31 +108,41 @@ def findBiggestDollar(alias): if dollars: return dollars[-1] else: - return None + return 0 + +atRe = re.compile(r'@(\d+)') +def findBiggestAt(alias): + ats = atRe.findall(alias) + ats = map(int, ats) + ats.sort() + if ats: + return ats[-1] + else: + return 0 def makeNewAlias(name, alias): if findAliasCommand(name, alias): raise RecursiveAlias doChannel = '$channel' in alias biggestDollar = findBiggestDollar(alias) - doDollars = bool(biggestDollar) - if biggestDollar is not None: - biggestDollar = int(biggestDollar) - else: - biggestDollar = 0 + biggestAt = findBiggestAt(alias) def f(self, irc, msg, args): alias_ = alias if doChannel: channel = privmsgs.getChannel(msg, args) alias_ = alias.replace('$channel', channel) - if doDollars: - args = privmsgs.getArgs(args, needed=biggestDollar) - if biggestDollar == 1: + if biggestDollar or biggestAt: + args = privmsgs.getArgs(args, needed=biggestDollar, + optional=biggestAt) + # Gotta have a tuple. + if biggestDollar + biggestAt == 1: args = (args,) def replace(m): idx = int(m.group(1)) - return args[idx-1] + return utils.dqrepr(args[idx-1]) alias_ = dollarRe.sub(replace, alias_) + args = args[biggestDollar:] + alias_ = atRe.sub(replace, alias_) self.Proxy(irc.irc, msg, callbacks.tokenize(alias_)) f.__doc__ ='\n\nAlias for %r' % \ (utils.nItems(biggestDollar, 'argument'), alias) diff --git a/test/test_Alias.py b/test/test_Alias.py index 72d022baa..c934e82e1 100644 --- a/test/test_Alias.py +++ b/test/test_Alias.py @@ -51,8 +51,8 @@ class FunctionsTest(unittest.TestCase): self.failUnless(Alias.findAliasCommand(s, 'foo |%s' % s)) def testFindBiggestDollar(self): - self.assertEqual(Alias.findBiggestDollar(''), None) - self.assertEqual(Alias.findBiggestDollar('foo'), None) + self.assertEqual(Alias.findBiggestDollar(''), 0) + self.assertEqual(Alias.findBiggestDollar('foo'), 0) self.assertEqual(Alias.findBiggestDollar('$0'), 0) self.assertEqual(Alias.findBiggestDollar('$1'), 1) self.assertEqual(Alias.findBiggestDollar('$2'), 2) @@ -109,6 +109,11 @@ class AliasTestCase(PluginTestCase, PluginDocumentation): self.assertRaises(Alias.AliasError, cb.removeAlias, 'foobar') cb.removeAlias('foobar', evenIfFrozen=True) self.assertNoResponse('foobar', 2) + + def testOptionalArgs(self): + self.assertNotError('alias myrepr "repr @1"') + self.assertResponse('myrepr foo', '"foo"') + self.assertResponse('myrepr ""', '""')