diff --git a/plugins/Sourceforge.py b/plugins/Sourceforge.py
index fa723b307..75f347c72 100644
--- a/plugins/Sourceforge.py
+++ b/plugins/Sourceforge.py
@@ -61,7 +61,7 @@ def configure(onStart, afterConnect, advanced):
print 'supybot sees such a URL, he will parse the web page for'
print 'information and reply with the results.\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 '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':
project = anything('Project name:')
if project:
- onStart.append('Sourceforge defaultproject %s' % project)
+ onStart.append('Sourceforge config defaultproject %s' % project)
class TrackerError(Exception):
pass
-class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
+class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Configurable):
"""
Module for Sourceforge stuff. Currently contains commands to query a
project's most recent bugs and rfes.
@@ -97,14 +97,16 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
_status = re.compile(r'(Status): (.+?)', _reopts)
_res =(_resolution, _assigned, _submitted, _priority, _status)
- toggles = plugins.ToggleDictionary({'tracker' : True})
- project = None
+ configurables = plugins.ConfigurableDictionary(
+ [('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/'
- def __init__(self):
- callbacks.PrivmsgCommandAndRegexp.__init__(self)
- plugins.Toggleable.__init__(self)
-
def _formatResp(self, text, num=''):
"""
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)):
yield (item[0], utils.htmlToText(item[2]))
- def defaultproject(self, irc, msg, args):
- """[]
-
- 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):
try:
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.
"""
project = privmsgs.getArgs(args, needed=0, optional=1)
- project = project or self.project
if not project:
- raise callbacks.ArgumentError
+ project = self.configurables.get('default-project', msg.args[0])
+ if not project:
+ raise callbacks.ArgumentError
try:
url = self._getTrackerURL(project, self._bugLink)
except TrackerError:
@@ -210,8 +202,11 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
int(project)
except ValueError:
irc.error(msg, '"%s" is not a proper bugnumber.' % project)
+ return
bugnum = project
- project = self.project
+ project = self.configurables.get('default-project', msg.args[0])
+ if not project:
+ raise callbacks.ArgumentError
try:
url = self._getTrackerURL(project, self._bugLink)
except TrackerError:
@@ -227,9 +222,10 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
Defaults to searching for RFEs in the project set by defaultproject.
"""
project = privmsgs.getArgs(args, needed=0, optional=1)
- project = project or self.project
if not project:
- raise callbacks.ArgumentError
+ project = self.configurables.get('default-project', msg.args[0])
+ if not project:
+ raise callbacks.ArgumentError
try:
url = self._getTrackerURL(project, self._rfeLink)
except TrackerError, e:
@@ -250,8 +246,11 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
int(project)
except ValueError:
irc.error(msg, '"%s" is not a proper rfenumber.' % project)
- rfenum = str(int(project))
- project = self.project
+ return
+ rfenum = project
+ project = self.configurables.get('default-project', msg.args[0])
+ if not project:
+ raise callbacks.ArgumentError
try:
url = self._getTrackerURL(project, self._rfeLink)
except TrackerError:
@@ -265,7 +264,7 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
def sfSnarfer(self, irc, msg, match):
r"https?://(?:www\.)?(?:sourceforge|sf)\.net/tracker/" \
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
try:
url = match.group(0)
@@ -293,6 +292,7 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp, plugins.Toggleable):
ircutils.bold(num), '; '.join(resp)), prefixName = False)
except urllib2.HTTPError, e:
debug.msg(e.msg())
+ sfSnarfer = privmsgs.urlSnarfer(sfSnarfer)
Class = Sourceforge
diff --git a/test/test_Sourceforge.py b/test/test_Sourceforge.py
index 0acbffa2d..791b738d9 100644
--- a/test/test_Sourceforge.py
+++ b/test/test_Sourceforge.py
@@ -44,11 +44,11 @@ class SourceforgeTest(ChannelPluginTestCase, PluginDocumentation):
def testBugs(self):
self.assertHelp('bugs')
- self.assertNotError('defaultproject supybot')
+ self.assertNotError('config defaultproject supybot')
self.assertNotError('bugs')
self.assertError('bugs alkjfi83fa8')
self.assertNotError('bugs gaim')
- self.assertNotError('defaultproject')
+ self.assertNotError('config defaultproject')
def testRfe(self):
m = self.getMsg('rfes gaim')
@@ -58,22 +58,22 @@ class SourceforgeTest(ChannelPluginTestCase, PluginDocumentation):
def testRfes(self):
self.assertHelp('rfes')
- self.assertNotError('defaultproject gaim')
+ self.assertNotError('config defaultproject gaim')
self.assertNotError('rfes')
self.assertError('rfes alkjfi83hfa8')
self.assertNotError('rfes gaim')
- self.assertNotError('defaultproject')
+ self.assertNotError('config defaultproject')
def testDefaultproject(self):
self.assertHelp('bugs')
- self.assertNotError('defaultproject supybot')
+ self.assertNotError('config defaultproject supybot')
self.assertNotError('bugs')
m = self.getMsg('bugs')
n = re.search('#(\d+)', m.args[1]).group(1)
self.assertNotError('bug supybot %s' % n)
# This should have the same effect as calling 'bug supybot %s'
self.assertNotError('bug %s' % n)
- self.assertNotError('defaultproject')
+ self.assertNotError('config defaultproject ""')
def testSnarfer(self):
s = r'.*Status.*: \w+'
@@ -106,17 +106,6 @@ class SourceforgeTest(ChannelPluginTestCase, PluginDocumentation):
self.assertNoResponse('https://sourceforge.net/tracker/?'\
'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: