A few updates to the spell command, and some tests.

This commit is contained in:
Jeremy Fincher 2003-08-17 19:15:37 +00:00
parent 99a7386c02
commit 2b79b6501f
2 changed files with 75 additions and 18 deletions

View File

@ -100,18 +100,20 @@ class Unix(callbacks.Privmsg):
callbacks.Privmsg.__init__(self) callbacks.Privmsg.__init__(self)
# Initialize a file descriptor for the spell module. # Initialize a file descriptor for the spell module.
cmdLine = getSpellBinary() cmdLine = getSpellBinary()
(self._spellRead, self._spellWrite, self._spellErr) = \ (self._spellRead, self._spellWrite) = popen2.popen4(cmdLine + ' -a', 0)
popen2.popen3(cmdLine + ' -a', 0)
# Ignore the banner # Ignore the banner
self._spellRead.readline() self._spellRead.readline()
def __del__(self): def die(self):
# close up the filehandles # close the filehandles
for h in (self._spellRead, self._spellWrite, self._spellErr): for h in (self._spellRead, self._spellWrite):
h.close() h.close()
def errno(self, irc, msg, args): def errno(self, irc, msg, args):
"<error number or code>" """<error number or code>
Returns the number of an errno code, or the errno code of a number.
"""
s = privmsgs.getArgs(args) s = privmsgs.getArgs(args)
try: try:
i = int(s) i = int(s)
@ -128,12 +130,19 @@ class Unix(callbacks.Privmsg):
irc.reply(msg, '%s (#%s): %s' % (name, i, os.strerror(i))) irc.reply(msg, '%s (#%s): %s' % (name, i, os.strerror(i)))
def progstats(self, irc, msg, args): def progstats(self, irc, msg, args):
"takes no arguments" """takes no arguments
Returns various unix-y information on the running supybot process.
"""
irc.reply(msg, progstats()) irc.reply(msg, progstats())
_cryptre = re.compile(r'[./0-9A-Za-z]') _cryptre = re.compile(r'[./0-9A-Za-z]')
def crypt(self, irc, msg, args): def crypt(self, irc, msg, args):
"<password> [<salt>]" """<password> [<salt>]
Returns the resulting of doing a crypt() on <password> If <salt> is
not given, uses a random salt.
"""
def makeSalt(): def makeSalt():
s = '\x00' s = '\x00'
while self._cryptre.sub('', s) != '': while self._cryptre.sub('', s) != '':
@ -145,10 +154,17 @@ class Unix(callbacks.Privmsg):
irc.reply(msg, crypt.crypt(password, salt)) irc.reply(msg, crypt.crypt(password, salt))
def spell(self, irc, msg, args): def spell(self, irc, msg, args):
"<word>" """<word>
Returns the result of passing <word> to aspell/ispell.
"""
# We are only checking the first word # We are only checking the first word
word = privmsgs.getArgs(args).split()[0] word = privmsgs.getArgs(args)
self._spellWrite.write(word + '\n') if ' ' in word:
irc.error(msg, 'Aspell/ispell can\'t handle spaces in words.')
return
self._spellWrite.write(word)
self._spellWrite.write('\n')
line = self._spellRead.readline() line = self._spellRead.readline()
# aspell puts extra whitespace, ignore it # aspell puts extra whitespace, ignore it
@ -157,17 +173,16 @@ class Unix(callbacks.Privmsg):
# parse the output # parse the output
if line[0] in '*+': if line[0] in '*+':
resp = '\'%s\' may be spelled correctly.' % word resp = '"%s" may be spelled correctly.' % word
elif line[0] == '#': elif line[0] == '#':
resp = 'Could not find an alternate spelling for \'%s\'' % word resp = 'Could not find an alternate spelling for "%s"' % word
elif line[0] == '&': elif line[0] == '&':
matches = line.split(':')[1].strip() matches = line.split(':')[1].strip()
match_list = matches.split(',') match_list = matches.split(', ')
ircutils.shrinkList(match_list, ', ', 400) s = ircutils.privmsgPayload(match_list, ', ', 400)
resp = 'Possible spellings for \'%s\': %s' % \ resp = 'Possible spellings for "%s": %s.' % (word, s)
(word, ','.join(match_list))
else: else:
resp = 'Something unexpected was seen in the *spell output.' resp = 'Something unexpected was seen in the [ai]spell output.'
irc.reply(msg, resp) irc.reply(msg, resp)

42
test/test_Unix.py Normal file
View File

@ -0,0 +1,42 @@
#!/usr/bin/env python
###
# Copyright (c) 2002, Jeremiah Fincher
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the author of this software nor the name of
# contributors to this software may be used to endorse or promote products
# derived from this software without specific prior written consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###
from test import *
class UnixTestCase(PluginTestCase):
plugins = ('Unix',)
def testSpell(self):
self.assertRegexp('spell Strike', 'correctly')
self.assertRegexp('spell asdlkfjasdlfkjsdalfkjasdflkasjdflskdfjlsd',
'not find')
self.assertNotError('spell Strizzike')
self.assertError('spell foo bar baz')