diff --git a/plugins/Sourceforge.py b/plugins/Sourceforge.py
index b5563091c..c51ce8a10 100644
--- a/plugins/Sourceforge.py
+++ b/plugins/Sourceforge.py
@@ -96,6 +96,11 @@ conf.registerChannelValue(conf.supybot.plugins.Sourceforge, 'trackerSnarfer',
conf.registerChannelValue(conf.supybot.plugins.Sourceforge, 'defaultProject',
registry.String('', """Sets the default project to use in the case that no
explicit project is given."""))
+#conf.registerGlobalValue(conf.supybot.plugins.Sourceforge,
+# 'enableSeparateTrackersCommands',
+# registry.Boolean(True, """Determines whether the bot will recognize the
+# tracker types as commands. For example, "@bugs supybot" would be the same
+# as calling "@trackers bugs supybot"."""))
class Sourceforge(callbacks.PrivmsgCommandAndRegexp):
"""
@@ -107,7 +112,7 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp):
_reopts = re.I
_infoRe = re.compile(r'
(\d+) | ([^<]+)', re.I)
+ r'"([^"]+)">([^<]+)', _reopts)
_hrefOpts = '&set=custom&_assigned_to=0&_status=%s&_category=100' \
'&_group=100&order=artifact_id&sort=DESC'
_resolution=re.compile(r'(Resolution): (.+?) | ',_reopts)
@@ -124,9 +129,19 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp):
_projectURL = 'http://sourceforge.net/projects/'
_trackerURL = 'http://sourceforge.net/support/tracker.php?aid='
def __init__(self):
- callbacks.PrivmsgCommandAndRegexp.__init__(self)
+ super(Sourceforge, self).__init__()
self.__class__.sf = self.__class__.sourceforge
+# def isCommand(self, methodName):
+# if hasattr(self, methodName):
+# return True
+# if methodName not in ('bugs', 'rfes', 'patches'):
+# return False
+# elif self.registryValue('enableSeparateTrackersCommands'):
+# return True
+# else:
+# return False
+
def _formatResp(self, text, num=''):
"""
Parses the Sourceforge query to return a list of tuples that
@@ -212,37 +227,47 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp):
except TrackerError, e:
irc.error(str(e))
- _bugLink = re.compile(r'"([^"]+)">Bugs')
- def bugs(self, irc, msg, args):
- """[--{any,open,closed,deleted,pending}] []
+ _trackerLink = {'bugs': re.compile(r'"([^"]+)">Bugs'),
+ 'rfes': re.compile(r'"([^"]+)">RFE'),
+ 'patches': re.compile(r'"([^"]+)">Patches'),
+ }
+ def trackers(self, irc, msg, args):
+ """[--{any,open,closed,deleted,pending}] {bugs,patches,rfes}
+ []
- Returns a list of the most recent bugs filed against .
+ Returns a list of the most recent trackers filed against .
is not needed if there is a default project set. Search
- defaults to open bugs.
+ defaults to open trackers.
"""
(optlist, rest) = getopt.getopt(args, '', self._statusOpt.keys())
- project = privmsgs.getArgs(rest, required=0, optional=1)
+ (tracker, project) = privmsgs.getArgs(rest, optional=1)
status = 'open'
for (option, _) in optlist:
option = option.lstrip('-').lower()
if option in self._statusOpt:
status = option
try:
- int(project)
- # They want the bug command, they're giving us an id#.
- s = 'Use the bug command to get information about a specific bug.'
+ int(tracker)
+ # They want the tracker command, they're giving us an id#.
+ s = 'Use the tracker command (e.g., tracker %s) for info about a'\
+ ' specific tracker.' % tracker
irc.error(s)
return
except ValueError:
pass
+ tracker = tracker.lower()
+ if tracker not in self._trackerLink:
+ raise callbacks.ArgumentError
if not project:
project = self.registryValue('defaultProject', msg.args[0])
if not project:
raise callbacks.ArgumentError
try:
- url = self._getTrackerURL(project, self._bugLink, status)
+ url = self._getTrackerURL(project, self._trackerLink[tracker],
+ status)
except TrackerError, e:
- irc.error('%s. I can\'t find the Bugs link.' % e)
+ irc.error('%s. I can\'t find the %s link.' %
+ (e, tracker.capitalize()))
return
irc.reply(self._getTrackerList(url))
@@ -265,8 +290,6 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp):
else:
return ''
- # TODO: consolidate total* into one command which takes options for all
- # the viable statistics that can be snarfed from the project page
def total(self, irc, msg, args):
"""[bugs|rfes] []
@@ -282,7 +305,7 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp):
self._totalrfes(irc, msg, args)
else:
raise callbacks.ArgumentError
-
+
def _totalbugs(self, irc, msg, args):
"""[]
@@ -315,40 +338,6 @@ class Sourceforge(callbacks.PrivmsgCommandAndRegexp):
else:
irc.error('Could not find RFE statistics.')
- _rfeLink = re.compile(r'"([^"]+)">RFE')
- def rfes(self, irc, msg, args):
- """[--{any,open,closed,deleted,pending}] []
-
- Returns a list of the most recent Requests For Enhancement (RFEs)
- filed against . is not needed if there is a
- default project set. Search defaults to open RFEs.
- """
- (optlist, rest) = getopt.getopt(args, '', self._statusOpt.keys())
- project = privmsgs.getArgs(rest, required=0, optional=1)
- status = 'open'
- for (option, _) in optlist:
- option = option.lstrip('-').lower()
- if option in self._statusOpt:
- status = option
- try:
- int(project)
- # They want a specific RFE, they gave us its id#.
- s = 'Use the rfe command to get information about a specific rfe.'
- irc.error(s)
- return
- except ValueError:
- pass
- if not project:
- project = self.registryValue('defaultProject', msg.args[0])
- if not project:
- raise callbacks.ArgumentError
- try:
- url = self._getTrackerURL(project, self._rfeLink, status)
- except TrackerError, e:
- irc.error('%s. I can\'t find the RFEs link.' % e)
- return
- irc.reply(self._getTrackerList(url))
-
def fight(self, irc, msg, args):
"""[--{bugs,rfes}] [--{open,closed}]
diff --git a/test/test_Sourceforge.py b/test/test_Sourceforge.py
index 63cf65bbf..35aafd615 100644
--- a/test/test_Sourceforge.py
+++ b/test/test_Sourceforge.py
@@ -33,82 +33,73 @@ import re
from testsupport import *
-if network:
- class SourceforgeTest(ChannelPluginTestCase):
- plugins = ('Sourceforge',)
+import supybot.plugins.Sourceforge
+Sf = conf.supybot.plugins.Sourceforge
+
+class SourceforgeTest(ChannelPluginTestCase):
+ plugins = ('Sourceforge',)
+ if network:
def testAny(self):
- m = self.getMsg('bugs --any gaim')
+ m = self.getMsg('trackers --any bugs gaim')
self.failUnless(m, 'No response from Sourceforge.')
n = re.search('#(\d+)', m.args[1]).group(1)
self.assertNotError('tracker %s' % n)
- m = self.getMsg('rfes --any gaim')
+ m = self.getMsg('trackers --any rfes gaim')
self.failUnless(m, 'No response from Sourceforge.')
n = re.search('#(\d+)', m.args[1]).group(1)
self.assertNotError('tracker %s' % n)
def testClosed(self):
- m = self.getMsg('bugs --closed gaim')
+ m = self.getMsg('trackers --closed bugs gaim')
self.failUnless(m, 'No response from Sourceforge.')
n = re.search('#(\d+)', m.args[1]).group(1)
self.assertNotError('tracker %s' % n)
- m = self.getMsg('rfes --closed gaim')
+ m = self.getMsg('trackers --closed patches gaim')
self.failUnless(m, 'No response from Sourceforge.')
n = re.search('#(\d+)', m.args[1]).group(1)
self.assertNotError('tracker %s' % n)
def testDeleted(self):
- m = self.getMsg('bugs --deleted gaim')
+ m = self.getMsg('trackers --deleted bugs gaim')
self.failUnless(m, 'No response from Sourceforge.')
n = re.search('#(\d+)', m.args[1]).group(1)
self.assertNotError('tracker %s' % n)
- m = self.getMsg('rfes --deleted gaim')
+ m = self.getMsg('trackers --deleted rfes gaim')
self.failUnless(m, 'No response from Sourceforge.')
n = re.search('#(\d+)', m.args[1]).group(1)
self.assertNotError('tracker %s' % n)
def testOpen(self):
- m = self.getMsg('bugs --open gaim')
+ m = self.getMsg('trackers --open bugs gaim')
self.failUnless(m, 'No response from Sourceforge.')
n = re.search('#(\d+)', m.args[1]).group(1)
self.assertNotError('tracker %s' % n)
- m = self.getMsg('rfes --open gaim')
+ m = self.getMsg('trackers --open rfes gaim')
self.failUnless(m, 'No response from Sourceforge.')
n = re.search('#(\d+)', m.args[1]).group(1)
self.assertNotError('tracker %s' % n)
- def testBugs(self):
- self.assertHelp('bugs')
- self.assertRegexp('bugs 83423', 'Use the bug command')
+ def testTrackers(self):
+ self.assertHelp('trackers bugs')
+ self.assertRegexp('trackers bugs 83423', 'find the Bug')
try:
- original = conf.supybot.plugins.Sourceforge.defaultProject()
- conf.supybot.plugins.Sourceforge.defaultProject.set('supybot')
- self.assertRegexp('bugs alkjfi83fa8', 'find the Bugs')
- self.assertNotError('bugs gaim')
- self.assertNotError('bugs')
+ original = Sf.defaultProject()
+ Sf.defaultProject.set('supybot')
+ self.assertRegexp('trackers bugs alkjfi83fa8', 'find the Bugs')
+ self.assertNotError('trackers rfes gaim')
+ self.assertNotError('trackers patches')
finally:
- conf.supybot.plugins.Sourceforge.defaultProject.set(original)
-
- def testRfes(self):
- self.assertHelp('rfes')
- self.assertRegexp('rfes 83423', 'Use the rfe command')
- try:
- original = conf.supybot.plugins.Sourceforge.defaultProject()
- conf.supybot.plugins.Sourceforge.defaultProject.set('gaim')
- self.assertNotError('rfes')
- self.assertRegexp('rfes alkjfi83hfa8', 'find the RFEs')
- self.assertNotError('rfes gaim')
- finally:
- conf.supybot.plugins.Sourceforge.defaultProject.set(original)
+ Sf.defaultProject.set(original)
def testDefaultproject(self):
try:
- original = conf.supybot.plugins.Sourceforge.defaultProject()
- conf.supybot.plugins.Sourceforge.defaultProject.setValue('supybot')
- self.assertNotError('bugs')
- conf.supybot.plugins.Sourceforge.defaultProject.setValue('')
- self.assertHelp('bugs')
+ original = Sf.defaultProject()
+ Sf.defaultProject.setValue('supybot')
+ self.assertNotError('trackers bugs')
+ Sf.defaultProject.setValue('')
+ self.assertHelp('trackers bugs')
finally:
- conf.supybot.plugins.Sourceforge.defaultProject.set(original)
+ Sf.defaultProject.set(original)
def testTracker(self):
bug = r'Bug.*Status.*: \w+'
@@ -121,8 +112,8 @@ if network:
def testSnarfer(self):
s = r'.*Status.*: \w+'
try:
- original = conf.supybot.plugins.Sourceforge.trackerSnarfer()
- conf.supybot.plugins.Sourceforge.trackerSnarfer.setValue(True)
+ original = Sf.trackerSnarfer()
+ Sf.trackerSnarfer.setValue(True)
self.assertSnarfRegexp('http://sourceforge.net/tracker/index.'
'php?func=detail&aid=589953&group_id='
'58965&atid=489447',
@@ -166,8 +157,7 @@ if network:
self.assertSnarfNoResponse('https://sourceforge.net/tracker/?'
'group_id=58965&atid=489447')
finally:
- conf.supybot.plugins.Sourceforge.trackerSnarfer.setValue(
- original)
+ Sf.trackerSnarfer.setValue(original)
def testTotal(self):
self.assertRegexp('total bugs gaim', r'\d+ open / \d+ total')