Plugin: accept author name in 'contributors' command

This commit is contained in:
James Lu 2019-11-11 11:53:30 -08:00
parent 7854db7135
commit a4701b258c
4 changed files with 33 additions and 19 deletions

View File

@ -139,26 +139,19 @@ class Plugin(callbacks.Plugin):
@internationalizeDocstring @internationalizeDocstring
def contributors(self, irc, msg, args, cb, nick): def contributors(self, irc, msg, args, cb, nick):
"""<plugin> [<nick>] """<plugin> [<name>]
Replies with a list of people who made contributions to a given plugin. Replies with a list of people who made contributions to a given plugin.
If <nick> is specified, that person's specific contributions will If <name> is specified, that person's specific contributions will
be listed. Note: The <nick> is the part inside of the parentheses be listed. You can specify a person's name by their full name or their nick,
in the people listing. which is shown inside brackets if available.
""" """
def getShortName(authorInfo):
"""
Take an Authors object, and return only the name and nick values
in the format 'First Last (nick)'.
"""
return '%(name)s (%(nick)s)' % authorInfo.__dict__
def buildContributorsString(longList): def buildContributorsString(longList):
""" """
Take a list of long names and turn it into : Take a list of long names and turn it into :
shortname[, shortname and shortname]. shortname[, shortname and shortname].
""" """
L = [getShortName(n) for n in longList] L = [authorInfo.format(short=True) for authorInfo in longList]
return format('%L', L) return format('%L', L)
def buildPeopleString(module): def buildPeopleString(module):
@ -187,12 +180,18 @@ class Plugin(callbacks.Plugin):
for the requested plugin. for the requested plugin.
""" """
contributors = getattr(module, '__contributors__', {}) contributors = getattr(module, '__contributors__', {})
# Make a mapping of nicks to author instances # Make a mapping of nicks and names to author instances
contributorNicks = dict((author.nick.lower(), author) for author in contributors.keys()) contributorNicks = {}
for contributor in contributors.keys():
if contributor.nick:
contributorNicks[contributor.nick.lower()] = contributor
if contributor.name:
contributorNicks[contributor.name.lower()] = contributor
lnick = nick.lower() lnick = nick.lower()
author = getattr(module, '__author__', supybot.authors.unknown) author = getattr(module, '__author__', supybot.authors.unknown)
if author != supybot.authors.unknown and lnick == author.nick.lower(): if author != supybot.authors.unknown and \
(lnick == (author.name or '').lower() or lnick == (author.nick or '').lower()):
# Special case for the plugin author. We remove legacy handling of the case where # Special case for the plugin author. We remove legacy handling of the case where
# someone is listed both as author and contributor, which should never really happen? # someone is listed both as author and contributor, which should never really happen?
return _('%s wrote the %s plugin.') % (author, cb.name()) return _('%s wrote the %s plugin.') % (author, cb.name())
@ -201,7 +200,7 @@ class Plugin(callbacks.Plugin):
authorInfo = contributorNicks[lnick] authorInfo = contributorNicks[lnick]
contributions = contributors[authorInfo] contributions = contributors[authorInfo]
fullName = getShortName(authorInfo) fullName = authorInfo.format(short=True)
if contributions: if contributions:
return format(_('%s contributed the following to %s: %s'), return format(_('%s contributed the following to %s: %s'),
@ -217,7 +216,7 @@ class Plugin(callbacks.Plugin):
else: else:
nick = ircutils.toLower(nick) nick = ircutils.toLower(nick)
irc.reply(buildPersonString(module)) irc.reply(buildPersonString(module))
contributors = wrap(contributors, ['plugin', additional('nick')]) contributors = wrap(contributors, ['plugin', additional('text')])
Plugin = internationalizeDocstring(Plugin) Plugin = internationalizeDocstring(Plugin)
Class = Plugin Class = Plugin

View File

@ -54,6 +54,12 @@ class PluginTestCase(PluginTestCase):
# Test ability to list contributions # Test ability to list contributions
# As of 2019-10-19 there is no more distinction between commands and non-commands # As of 2019-10-19 there is no more distinction between commands and non-commands
self.assertRegexp('contributors Plugin skorobeus', 'original contributors command') self.assertRegexp('contributors Plugin skorobeus', 'original contributors command')
self.assertRegexp('contributors Plugin Kevin Murphy', 'original contributors command')
self.assertRegexp('contributors Plugin James Lu', 'refactored contributors command')
# Test handling of the plugin author, who is usually not listed in __contributors__
self.assertRegexp('contributors Plugin jemfinch', 'wrote the Plugin plugin')
self.assertRegexp('contributors Plugin Jeremy Fincher', 'wrote the Plugin plugin')
# TODO: test handling of a person with multiple contributions to a command # TODO: test handling of a person with multiple contributions to a command

View File

@ -50,7 +50,7 @@ class Author(object):
self.nick = nick self.nick = nick
self.email = email self.email = email
def __str__(self): def format(self, short=False):
# If only one of these are defined, take the nick as the name # If only one of these are defined, take the nick as the name
name = self.name or self.nick or 'Unknown author' name = self.name or self.nick or 'Unknown author'
@ -58,11 +58,14 @@ class Author(object):
if self.nick and name != self.nick: if self.nick and name != self.nick:
# Format as "Name (nick)" if both are given and different # Format as "Name (nick)" if both are given and different
s += ' (%s)' % self.nick s += ' (%s)' % self.nick
if self.email: if self.email and not short:
# Add "Name (nick) <email>" or "Name <email>" if provided # Add "Name (nick) <email>" or "Name <email>" if provided
s += ' <%s>' % self.email s += ' <%s>' % self.email
return s return s
def __str__(self):
return self.format()
class authors(object): # This is basically a bag. class authors(object): # This is basically a bag.
jemfinch = Author('Jeremy Fincher', 'jemfinch', 'jemfinch@users.sf.net') jemfinch = Author('Jeremy Fincher', 'jemfinch', 'jemfinch@users.sf.net')
jamessan = Author('James McCoy', 'jamessan', 'vega.james@gmail.com') jamessan = Author('James McCoy', 'jamessan', 'vega.james@gmail.com')

View File

@ -54,4 +54,10 @@ class MiscTestCase(SupyTestCase):
# Only email? # Only email?
self.assertEqual(str(supybot.Author(email='xyzzy@localhost.localdomain')), 'Unknown author <xyzzy@localhost.localdomain>') self.assertEqual(str(supybot.Author(email='xyzzy@localhost.localdomain')), 'Unknown author <xyzzy@localhost.localdomain>')
def testAuthorExpandShort(self):
self.assertEqual(supybot.authors.progval.format(short=True),
'Valentin Lorentz (ProgVal)')
self.assertEqual(supybot.authors.jlu.format(short=True),
'James Lu')
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: