From 7854db7135478a22061fe30da7c4414394bcab61 Mon Sep 17 00:00:00 2001 From: James Lu Date: Mon, 11 Nov 2019 11:09:50 -0800 Subject: [PATCH] Better formatting in supybot.Author if some fields are missing --- src/__init__.py | 23 ++++++++++++++----- test/test_misc.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 test/test_misc.py diff --git a/src/__init__.py b/src/__init__.py index 14de16165..240d57a17 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -40,6 +40,10 @@ del builtins['supybotInternationalization'] (__builtins__ if isinstance(__builtins__, dict) else __builtins__.__dict__)['format'] = utils.str.format class Author(object): + """ + Describes a plugin author. All fields are optional, but the standard practice + is to include an email and at least one of 'name' and 'nick'. + """ def __init__(self, name=None, nick=None, email=None, **kwargs): self.__dict__.update(kwargs) self.name = name @@ -47,10 +51,17 @@ class Author(object): self.email = email def __str__(self): - if self.name != self.nick: - return '%s (%s) <%s>' % (self.name, self.nick, self.email) - else: - return '%s <%s>' % (self.name, self.email) + # If only one of these are defined, take the nick as the name + name = self.name or self.nick or 'Unknown author' + + s = name + if self.nick and name != self.nick: + # Format as "Name (nick)" if both are given and different + s += ' (%s)' % self.nick + if self.email: + # Add "Name (nick) " or "Name " if provided + s += ' <%s>' % self.email + return s class authors(object): # This is basically a bag. jemfinch = Author('Jeremy Fincher', 'jemfinch', 'jemfinch@users.sf.net') @@ -64,8 +75,8 @@ class authors(object): # This is basically a bag. grantbow = Author('Grant Bowman', 'Grantbow', 'grantbow@grantbow.com') stepnem = Author('Štěpán Němec', 'stepnem', 'stepnem@gmail.com') progval = Author('Valentin Lorentz', 'ProgVal', 'progval@gmail.com') - jlu = Author('James Lu', 'GLolol', 'james@overdrivenetworks.com') - unknown = Author('Unknown author', 'unknown', 'unknown@email.invalid') + jlu = Author('James Lu', email='james@overdrivenetworks.com') + unknown = Author('Unknown author', email='unknown@email.invalid') # Let's be somewhat safe about this. def __getattr__(self, attr): diff --git a/test/test_misc.py b/test/test_misc.py new file mode 100644 index 000000000..a1e55604a --- /dev/null +++ b/test/test_misc.py @@ -0,0 +1,57 @@ +### +# Copyright (c) 2019, James Lu +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions, and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions, and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author of this software nor the name of +# contributors to this software may be used to endorse or promote products +# derived from this software without specific prior written consent. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +### + +import supybot +from supybot.test import * + +class MiscTestCase(SupyTestCase): + + def testAuthorExpand(self): + # The standard 3 pair: name, nick, email + self.assertEqual(str(supybot.authors.progval), + 'Valentin Lorentz (ProgVal) ') + # All 3 provided, but name == nick + self.assertEqual(str(supybot.Author('foobar', 'foobar', 'foobar@example.net')), + 'foobar ') + # Only name provided + self.assertEqual(str(supybot.Author('somedev')), 'somedev') + # Only nick provided + self.assertEqual(str(supybot.Author(nick='somedev')), 'somedev') + # Only name and nick provided + self.assertEqual(str(supybot.Author('James Lu', 'tacocat')), 'James Lu (tacocat)') + # Only name and nick provided, but name == nick + self.assertEqual(str(supybot.Author('tacocat', 'tacocat')), 'tacocat') + # Only name and email + self.assertEqual(str(supybot.authors.jlu), 'James Lu ') + # Only nick and email + self.assertEqual(str(supybot.Author(nick='abcdef', email='abcdef@example.org')), 'abcdef ') + # Only email? + self.assertEqual(str(supybot.Author(email='xyzzy@localhost.localdomain')), 'Unknown author ') + +# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: