Updated to use Configurable.

This commit is contained in:
Jeremy Fincher 2003-11-08 09:02:30 +00:00
parent f2d3e99346
commit c434925798
2 changed files with 34 additions and 45 deletions

View File

@ -61,7 +61,7 @@ def configure(onStart, afterConnect, advanced):
print 'supybot sees such a URL, he will parse the web page for' print 'supybot sees such a URL, he will parse the web page for'
print 'information and reply with the results.\n' print 'information and reply with the results.\n'
if yn('Do you want the Sourceforge snarfer enabled by default?') =='n': if yn('Do you want the Sourceforge snarfer enabled by default?') =='n':
onStart.append('Sourceforge toggle tracker off') onStart.append('Sourceforge config tracker-snarfer off')
print 'The bugs and rfes commands of the Sourceforge plugin can be set' print 'The bugs and rfes commands of the Sourceforge plugin can be set'
print 'to query a default project when no project is specified. If this' print 'to query a default project when no project is specified. If this'
@ -72,12 +72,12 @@ def configure(onStart, afterConnect, advanced):
if yn('Do you want to specify a default project?') == 'y': if yn('Do you want to specify a default project?') == 'y':
project = anything('Project name:') project = anything('Project name:')
if project: if project:
onStart.append('Sourceforge defaultproject %s' % project) onStart.append('Sourceforge config defaultproject %s' % project)
class TrackerError(Exception): class TrackerError(Exception):
pass pass
class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable): class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Configurable):
""" """
Module for Sourceforge stuff. Currently contains commands to query a Module for Sourceforge stuff. Currently contains commands to query a
project's most recent bugs and rfes. project's most recent bugs and rfes.
@ -97,14 +97,16 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
_status = re.compile(r'<b>(Status):</b> <a.+?<br>(.+?)</td>', _reopts) _status = re.compile(r'<b>(Status):</b> <a.+?<br>(.+?)</td>', _reopts)
_res =(_resolution, _assigned, _submitted, _priority, _status) _res =(_resolution, _assigned, _submitted, _priority, _status)
toggles = plugins.ToggleDictionary({'tracker' : True}) configurables = plugins.ConfigurableDictionary(
project = None [('tracker-snarfer', plugins.ConfigurableTypes.bool, True,
"""Determines whether the bot will reply to SF.net Tracker URLs in
the channel with a nice summary of the tracker item."""),
('default-project', plugins.ConfigurableTypes.str, '',
"""Sets the default project (used by the bugs/rfes commands in the
case that no explicit project is given).""")]
)
_projectURL = 'http://sourceforge.net/projects/' _projectURL = 'http://sourceforge.net/projects/'
def __init__(self):
callbacks.PrivmsgCommandAndRegexp.__init__(self)
plugins.Toggleable.__init__(self)
def _formatResp(self, text, num=''): def _formatResp(self, text, num=''):
""" """
Parses the Sourceforge query to return a list of tuples that Parses the Sourceforge query to return a list of tuples that
@ -119,17 +121,6 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
for item in ifilter(None, self._infoRe.findall(text)): for item in ifilter(None, self._infoRe.findall(text)):
yield (item[0], utils.htmlToText(item[2])) yield (item[0], utils.htmlToText(item[2]))
def defaultproject(self, irc, msg, args):
"""[<project>]
Sets the default project to be used with bugs and rfes. If a project
is not specified, clears the default project.
"""
project = privmsgs.getArgs(args, needed=0, optional=1)
self.project = project
irc.reply(msg, conf.replySuccess)
defaultproject = privmsgs.checkCapability(defaultproject, 'admin')
def _getTrackerURL(self, project, regex): def _getTrackerURL(self, project, regex):
try: try:
fd = urllib2.urlopen('%s%s' % (self._projectURL, project)) fd = urllib2.urlopen('%s%s' % (self._projectURL, project))
@ -187,9 +178,10 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
Defaults to searching for bugs in the project set by defaultproject. Defaults to searching for bugs in the project set by defaultproject.
""" """
project = privmsgs.getArgs(args, needed=0, optional=1) project = privmsgs.getArgs(args, needed=0, optional=1)
project = project or self.project
if not project: if not project:
raise callbacks.ArgumentError project = self.configurables.get('default-project', msg.args[0])
if not project:
raise callbacks.ArgumentError
try: try:
url = self._getTrackerURL(project, self._bugLink) url = self._getTrackerURL(project, self._bugLink)
except TrackerError: except TrackerError:
@ -210,8 +202,11 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
int(project) int(project)
except ValueError: except ValueError:
irc.error(msg, '"%s" is not a proper bugnumber.' % project) irc.error(msg, '"%s" is not a proper bugnumber.' % project)
return
bugnum = project bugnum = project
project = self.project project = self.configurables.get('default-project', msg.args[0])
if not project:
raise callbacks.ArgumentError
try: try:
url = self._getTrackerURL(project, self._bugLink) url = self._getTrackerURL(project, self._bugLink)
except TrackerError: except TrackerError:
@ -227,9 +222,10 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
Defaults to searching for RFEs in the project set by defaultproject. Defaults to searching for RFEs in the project set by defaultproject.
""" """
project = privmsgs.getArgs(args, needed=0, optional=1) project = privmsgs.getArgs(args, needed=0, optional=1)
project = project or self.project
if not project: if not project:
raise callbacks.ArgumentError project = self.configurables.get('default-project', msg.args[0])
if not project:
raise callbacks.ArgumentError
try: try:
url = self._getTrackerURL(project, self._rfeLink) url = self._getTrackerURL(project, self._rfeLink)
except TrackerError, e: except TrackerError, e:
@ -250,8 +246,11 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
int(project) int(project)
except ValueError: except ValueError:
irc.error(msg, '"%s" is not a proper rfenumber.' % project) irc.error(msg, '"%s" is not a proper rfenumber.' % project)
rfenum = str(int(project)) return
project = self.project rfenum = project
project = self.configurables.get('default-project', msg.args[0])
if not project:
raise callbacks.ArgumentError
try: try:
url = self._getTrackerURL(project, self._rfeLink) url = self._getTrackerURL(project, self._rfeLink)
except TrackerError: except TrackerError:
@ -265,7 +264,7 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
def sfSnarfer(self, irc, msg, match): def sfSnarfer(self, irc, msg, match):
r"https?://(?:www\.)?(?:sourceforge|sf)\.net/tracker/" \ r"https?://(?:www\.)?(?:sourceforge|sf)\.net/tracker/" \
r".*\?(?:&?func=detail|&?aid=\d+|&?group_id=\d+|&?atid=\d+){4}" r".*\?(?:&?func=detail|&?aid=\d+|&?group_id=\d+|&?atid=\d+){4}"
if not self.toggles.get('tracker', channel=msg.args[0]): if not self.configurables.get('tracker-snarfer', channel=msg.args[0]):
return return
try: try:
url = match.group(0) url = match.group(0)
@ -293,6 +292,7 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
ircutils.bold(num), '; '.join(resp)), prefixName = False) ircutils.bold(num), '; '.join(resp)), prefixName = False)
except urllib2.HTTPError, e: except urllib2.HTTPError, e:
debug.msg(e.msg()) debug.msg(e.msg())
sfSnarfer = privmsgs.urlSnarfer(sfSnarfer)
Class = Sourceforge Class = Sourceforge

View File

@ -44,11 +44,11 @@ class SourceforgeTest(ChannelPluginTestCase, PluginDocumentation):
def testBugs(self): def testBugs(self):
self.assertHelp('bugs') self.assertHelp('bugs')
self.assertNotError('defaultproject supybot') self.assertNotError('config defaultproject supybot')
self.assertNotError('bugs') self.assertNotError('bugs')
self.assertError('bugs alkjfi83fa8') self.assertError('bugs alkjfi83fa8')
self.assertNotError('bugs gaim') self.assertNotError('bugs gaim')
self.assertNotError('defaultproject') self.assertNotError('config defaultproject')
def testRfe(self): def testRfe(self):
m = self.getMsg('rfes gaim') m = self.getMsg('rfes gaim')
@ -58,22 +58,22 @@ class SourceforgeTest(ChannelPluginTestCase, PluginDocumentation):
def testRfes(self): def testRfes(self):
self.assertHelp('rfes') self.assertHelp('rfes')
self.assertNotError('defaultproject gaim') self.assertNotError('config defaultproject gaim')
self.assertNotError('rfes') self.assertNotError('rfes')
self.assertError('rfes alkjfi83hfa8') self.assertError('rfes alkjfi83hfa8')
self.assertNotError('rfes gaim') self.assertNotError('rfes gaim')
self.assertNotError('defaultproject') self.assertNotError('config defaultproject')
def testDefaultproject(self): def testDefaultproject(self):
self.assertHelp('bugs') self.assertHelp('bugs')
self.assertNotError('defaultproject supybot') self.assertNotError('config defaultproject supybot')
self.assertNotError('bugs') self.assertNotError('bugs')
m = self.getMsg('bugs') m = self.getMsg('bugs')
n = re.search('#(\d+)', m.args[1]).group(1) n = re.search('#(\d+)', m.args[1]).group(1)
self.assertNotError('bug supybot %s' % n) self.assertNotError('bug supybot %s' % n)
# This should have the same effect as calling 'bug supybot %s' # This should have the same effect as calling 'bug supybot %s'
self.assertNotError('bug %s' % n) self.assertNotError('bug %s' % n)
self.assertNotError('defaultproject') self.assertNotError('config defaultproject ""')
def testSnarfer(self): def testSnarfer(self):
s = r'.*Status.*: \w+' s = r'.*Status.*: \w+'
@ -106,17 +106,6 @@ class SourceforgeTest(ChannelPluginTestCase, PluginDocumentation):
self.assertNoResponse('https://sourceforge.net/tracker/?'\ self.assertNoResponse('https://sourceforge.net/tracker/?'\
'group_id=58965&atid=489447') 'group_id=58965&atid=489447')
def testToggle(self):
s = r'Status.*: \w+'
self.assertRegexp('http://sourceforge.net/tracker/index.php?'\
'func=detail&aid=540223&group_id=235&atid=300235', s)
self.assertNotError('Sourceforge toggle tracker off')
self.failIf(self.irc.takeMsg())
self.assertNoResponse('http://sourceforge.net/tracker/index.php?'\
'func=detail&aid=540223&group_id=235&atid=300235')
self.assertNotError('Sourceforge toggle tracker on')
self.assertRegexp('http://sourceforge.net/tracker/index.php?'\
'func=detail&aid=540223&group_id=235&atid=300235', s)
# vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: # vim:set shiftwidth=4 tabstop=8 expandtab textwidth=78: