Hopefully fixed bugs in Unix.spell once and for all.

This commit is contained in:
Jeremy Fincher 2003-11-08 07:29:45 +00:00
parent 4711e227f4
commit 5fb5533e49
2 changed files with 22 additions and 9 deletions

View File

@ -97,6 +97,17 @@ def progstats():
sys.version.translate(string.ascii, '\r\n')) sys.version.translate(string.ascii, '\r\n'))
return response return response
class TimeoutError(Exception):
pass
def pipeReadline(fd, timeout=0.5):
(r, _, _) = select.select([fd], [], [], timeout)
if r:
return r[0].readline()
else:
raise TimeoutError
class Unix(callbacks.Privmsg): class Unix(callbacks.Privmsg):
def __init__(self): def __init__(self):
@ -170,22 +181,22 @@ class Unix(callbacks.Privmsg):
""" """
# We are only checking the first word # We are only checking the first word
word = privmsgs.getArgs(args) word = privmsgs.getArgs(args)
if word and word[0] in '.?*&@+-~#!%^': if word and not word[0].isalpha():
irc.error(msg, 'Initial spell metacharacters aren\'t allowed.') irc.error(msg, '<word> must begin with an alphabet character.')
return return
if ' ' in word: if ' ' in word:
irc.error(msg, 'Spaces aren\'t allowed in the word.') irc.error(msg, 'Spaces aren\'t allowed in the word.')
return return
self._spellWrite.write(word) self._spellWrite.write(word)
self._spellWrite.write('\n') self._spellWrite.write('\n')
(r, _, _) = select.select([self._spellRead], [], [], 0.1) try:
if not r: line = pipeReadline(self._spellRead)
irc.error(msg, 'The spell command did not respond to %r' % word) # aspell puts extra whitespace, ignore it
while line == '\n':
line = pipeReadline(self._spellRead)
except TimeoutError:
irc.error(msg, 'The spell command didn\'t return usefully.')
return return
line = self._spellRead.readline()
# aspell puts extra whitespace, ignore it
while line == '\n':
line = self._spellRead.readline()
# 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

View File

@ -43,6 +43,8 @@ if os.name == 'posix':
self.assertNotError('spell Strizzike') self.assertNotError('spell Strizzike')
self.assertError('spell foo bar baz') self.assertError('spell foo bar baz')
self.assertError('spell -') self.assertError('spell -')
self.assertError('spell .')
self.assertError('spell ?')
def testErrno(self): def testErrno(self):
self.assertRegexp('errno 12', '^ENOMEM') self.assertRegexp('errno 12', '^ENOMEM')