diff -Nru limnoria-2022.11.10/debian/changelog limnoria-2023.1.12/debian/changelog --- limnoria-2022.11.10/debian/changelog 2022-11-23 03:03:00.000000000 +0000 +++ limnoria-2023.1.12/debian/changelog 2023-01-19 09:55:21.000000000 +0000 @@ -1,8 +1,16 @@ -limnoria (2022.11.10-1~bpo22.04.1) jammy-backports; urgency=medium +limnoria (2023.1.12-1~bpo22.04.1) jammy-backports; urgency=medium * No-change backport to jammy. - -- Unit 193 Tue, 22 Nov 2022 22:03:00 -0500 + -- Unit 193 Thu, 19 Jan 2023 04:55:21 -0500 + +limnoria (2023.1.12-1) unstable; urgency=medium + + * New upstream version 2023.1.12. + * d/copyright: Bump years. + * Update Standards-Version to 4.6.2. + + -- Unit 193 Fri, 13 Jan 2023 03:10:06 -0500 limnoria (2022.11.10-1) unstable; urgency=medium diff -Nru limnoria-2022.11.10/debian/control limnoria-2023.1.12/debian/control --- limnoria-2022.11.10/debian/control 2022-07-05 05:44:07.000000000 +0000 +++ limnoria-2023.1.12/debian/control 2023-01-13 08:09:44.000000000 +0000 @@ -16,7 +16,7 @@ python3-setuptools, libpython3-stdlib (>= 3.9) | python3-tz , Rules-Requires-Root: no -Standards-Version: 4.6.1 +Standards-Version: 4.6.2 Vcs-Git: https://salsa.debian.org/debian/limnoria.git Vcs-Browser: https://salsa.debian.org/debian/limnoria Homepage: https://github.com/ProgVal/Limnoria diff -Nru limnoria-2022.11.10/debian/copyright limnoria-2023.1.12/debian/copyright --- limnoria-2022.11.10/debian/copyright 2022-03-19 23:24:57.000000000 +0000 +++ limnoria-2023.1.12/debian/copyright 2023-01-13 08:09:19.000000000 +0000 @@ -7,13 +7,13 @@ Copyright: 2002-2005 Jeremiah Fincher 2008-2015 James McCoy 2010-2021 The Limnoria Contributors - 2010-2022 Valentin Lorentz + 2010-2023 Valentin Lorentz 2019-2020 James Lu License: BSD-3-clause Files: debian/* Copyright: 2014-2021 Mattia Rizzolo - 2018-2022 Unit 193 + 2018-2023 Unit 193 License: BSD-3-clause Files: plugins/Anonymous/* diff -Nru limnoria-2022.11.10/limnoria.egg-info/PKG-INFO limnoria-2023.1.12/limnoria.egg-info/PKG-INFO --- limnoria-2022.11.10/limnoria.egg-info/PKG-INFO 2022-11-16 13:00:11.000000000 +0000 +++ limnoria-2023.1.12/limnoria.egg-info/PKG-INFO 2023-01-12 21:25:16.000000000 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: limnoria -Version: 2022.11.10 +Version: 2023.1.12 Summary: A multipurpose Python IRC bot, designed for flexibility and robustness , while being easy to install, set up, and maintain. Home-page: https://limnoria.net/ Author: Valentin Lorentz diff -Nru limnoria-2022.11.10/PKG-INFO limnoria-2023.1.12/PKG-INFO --- limnoria-2022.11.10/PKG-INFO 2022-11-16 13:00:11.894451900 +0000 +++ limnoria-2023.1.12/PKG-INFO 2023-01-12 21:25:17.092990000 +0000 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: limnoria -Version: 2022.11.10 +Version: 2023.1.12 Summary: A multipurpose Python IRC bot, designed for flexibility and robustness , while being easy to install, set up, and maintain. Home-page: https://limnoria.net/ Author: Valentin Lorentz diff -Nru limnoria-2022.11.10/plugins/Alias/test.py limnoria-2023.1.12/plugins/Alias/test.py --- limnoria-2022.11.10/plugins/Alias/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Alias/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -111,7 +111,7 @@ self.assertResponse('foobar', 'sbbone') self.assertRaises(Alias.AliasError, cb.removeAlias, 'foobar') cb.removeAlias('foobar', evenIfLocked=True) - self.assertFalse('foobar' in cb.aliases) + self.assertNotIn('foobar', cb.aliases) self.assertError('foobar') self.assertRegexp('alias add abc\x07 ignore', 'Error.*Invalid') diff -Nru limnoria-2022.11.10/plugins/Anonymous/test.py limnoria-2023.1.12/plugins/Anonymous/test.py --- limnoria-2022.11.10/plugins/Anonymous/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Anonymous/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -39,7 +39,7 @@ with conf.supybot.plugins.Anonymous.requireRegistration.context(False): m = self.assertNotError('anonymous say %s foo!' % self.channel) - self.assertTrue(m.args[1] == 'foo!') + self.assertEqual(m.args[1], 'foo!') def testTell(self): self.assertError('anonymous tell %s I love you!' % self.nick) @@ -48,7 +48,7 @@ self.assertError('anonymous tell %s foo!' % self.channel) with conf.supybot.plugins.Anonymous.allowPrivateTarget.context(True): m = self.assertNotError('anonymous tell %s foo!' % self.nick) - self.assertTrue(m.args[1] == 'foo!') + self.assertEqual(m.args[1], 'foo!') def testAction(self): m = self.assertError('anonymous do %s loves you!' % self.channel) diff -Nru limnoria-2022.11.10/plugins/Channel/plugin.py limnoria-2023.1.12/plugins/Channel/plugin.py --- limnoria-2022.11.10/plugins/Channel/plugin.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Channel/plugin.py 2023-01-12 21:25:09.000000000 +0000 @@ -313,17 +313,15 @@ @internationalizeDocstring def kban(self, irc, msg, args, channel, optlist, bannedNick, expiry, reason): - """[] [--{exact,nick,user,host}] [] [] + """[] [--{exact,nick,user,host,account}] [] [] If you have the #channel,op capability, this will kickban for as many seconds as you specify, or else (if you specify 0 seconds or don't specify a number of seconds) it will ban the person indefinitely. --exact bans only the exact hostmask; --nick bans just the nick; - --user bans just the user, and --host bans just the host. You can - combine these options as you choose. is a reason to give for - the kick. - is only necessary if the message isn't sent in the channel - itself. + --user bans just the user, and --host bans just the host + You can combine the --nick, --user, and --host options as you choose. + is only necessary if the message isn't sent in the channel itself. """ self._ban(irc, msg, args, channel, optlist, bannedNick, expiry, reason, True) @@ -343,9 +341,9 @@ If you have the #channel,op capability, this will ban for as many seconds as you specify, otherwise (if you specify 0 seconds or don't specify a number of seconds) it will ban the person indefinitely. - --exact can be used to specify an exact hostmask. You can combine the - exact, nick, user, and host options as you choose. is only - necessary if the message isn't sent in the channel itself. + --exact can be used to specify an exact hostmask. + You can combine the --nick, --user, and --host options as you choose. + is only necessary if the message isn't sent in the channel itself. """ self._ban(irc, msg, args, channel, optlist, bannedNick, expiry, None, False) diff -Nru limnoria-2022.11.10/plugins/Channel/test.py limnoria-2023.1.12/plugins/Channel/test.py --- limnoria-2022.11.10/plugins/Channel/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Channel/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -46,19 +46,19 @@ def testLobotomies(self): self.assertRegexp('lobotomy list', 'not.*any') -## def testCapabilities(self): -## self.prefix = 'foo!bar@baz' -## self.irc.feedMsg(ircmsgs.privmsg(self.irc.nick, 'register foo bar', -## prefix=self.prefix)) -## u = ircdb.users.getUser(0) -## u.addCapability('%s.op' % self.channel) -## ircdb.users.setUser(u) -## self.assertNotError(' ') -## self.assertResponse('user capabilities foo', '[]') -## self.assertNotError('channel addcapability foo op') -## self.assertRegexp('channel capabilities foo', 'op') -## self.assertNotError('channel removecapability foo op') -## self.assertResponse('user capabilities foo', '[]') + def testCapabilities(self): + self.prefix = 'foo!bar@baz' + self.irc.feedMsg(ircmsgs.privmsg(self.irc.nick, 'register foo bar', + prefix=self.prefix)) + u = ircdb.users.getUser(0) + u.addCapability('%s.op' % self.channel) + ircdb.users.setUser(u) + self.assertNotError(' ') + self.assertResponse('user capabilities foo', '[]') + self.assertNotError('channel addcapability foo op') + self.assertRegexp('channel capabilities foo', 'op') + self.assertNotError('channel removecapability foo op') + self.assertResponse('user capabilities foo', '[]') def testCapabilities(self): self.assertNotError('channel capability list') @@ -185,28 +185,39 @@ self.assertBan('iban $a:nyuszika7h', '$a:nyuszika7h') self.assertNotError('unban $a:nyuszika7h') -## def testKban(self): -## self.irc.prefix = 'something!else@somehwere.else' -## self.irc.nick = 'something' -## self.irc.feedMsg(ircmsgs.join(self.channel, -## prefix='foobar!user@host.domain.tld')) -## self.assertError('kban foobar') -## self.irc.feedMsg(ircmsgs.op(self.channel, self.irc.nick)) -## self.assertError('kban foobar -1') -## self.assertKban('kban foobar', '*!*@*.domain.tld') -## self.assertKban('kban --exact foobar', 'foobar!user@host.domain.tld') -## self.assertKban('kban --host foobar', '*!*@host.domain.tld') -## self.assertKban('kban --user foobar', '*!user@*') -## self.assertKban('kban --nick foobar', 'foobar!*@*') -## self.assertKban('kban --nick --user foobar', 'foobar!user@*') -## self.assertKban('kban --nick --host foobar', -## 'foobar!*@host.domain.tld') -## self.assertKban('kban --user --host foobar', '*!user@host.domain.tld') -## self.assertKban('kban --nick --user --host foobar', -## 'foobar!user@host.domain.tld') -## self.assertNotRegexp('kban adlkfajsdlfkjsd', 'KeyError') -## self.assertNotRegexp('kban foobar time', 'ValueError') -## self.assertError('kban %s' % self.irc.nick) + def testKban(self): + self.irc.prefix = 'something!else@somehwere.else' + self.irc.nick = 'something' + def join(): + self.irc.feedMsg(ircmsgs.join( + self.channel, prefix='foobar!user@host.domain.tld')) + join() + self.assertError('kban foobar') + self.irc.feedMsg(ircmsgs.op(self.channel, self.irc.nick)) + #self.assertError('kban foobar -1') + #self.assertKban('kban foobar', '*!*@*.domain.tld') + #join() + self.assertKban('kban --exact foobar', 'foobar!user@host.domain.tld') + join() + self.assertKban('kban --host foobar', '*!*@host.domain.tld') + join() + self.assertKban('kban --user foobar', '*!user@*') + join() + self.assertKban('kban --nick foobar', 'foobar!*@*') + join() + self.assertKban('kban --nick --user foobar', 'foobar!user@*') + join() + self.assertKban('kban --nick --host foobar', + 'foobar!*@host.domain.tld') + join() + self.assertKban('kban --user --host foobar', '*!user@host.domain.tld') + join() + self.assertKban('kban --nick --user --host foobar', + 'foobar!user@host.domain.tld') + join() + self.assertKban('kban foobar', '*!*@host.domain.tld') + + self.assertRegexp('kban adlkfajsdlfkjsd', 'adlkfajsdlfkjsd is not in') def testBan(self): with conf.supybot.protocols.irc.banmask.context(['exact']): diff -Nru limnoria-2022.11.10/plugins/Fediverse/activitypub.py limnoria-2023.1.12/plugins/Fediverse/activitypub.py --- limnoria-2022.11.10/plugins/Fediverse/activitypub.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Fediverse/activitypub.py 2023-01-12 21:25:09.000000000 +0000 @@ -61,10 +61,6 @@ pass -class HostmetaError(ProtocolError): - pass - - class ActivityPubProtocolError(ActivityPubError): pass @@ -118,7 +114,7 @@ @sandbox def _get_webfinger_url(hostname): - with convert_exceptions(HostmetaError): + try: doc = ET.fromstring( web.getUrlContent("https://%s/.well-known/host-meta" % hostname) ) @@ -126,8 +122,9 @@ for link in doc.iter(XRD_URI + "Link"): if link.attrib["rel"] == "lrdd": return link.attrib["template"] - - return "https://%s/.well-known/webfinger?resource={uri}" + except web.Error: + # Fall back to the default Webfinger URL + return "https://%s/.well-known/webfinger?resource={uri}" % hostname def has_webfinger_support(hostname): diff -Nru limnoria-2022.11.10/plugins/Fediverse/test.py limnoria-2023.1.12/plugins/Fediverse/test.py --- limnoria-2022.11.10/plugins/Fediverse/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Fediverse/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -255,6 +255,19 @@ "\x02someuser\x02 (@someuser@example.org): My Biography", ) + def testProfileNoHostmeta(self): + expected_requests = [ + (HOSTMETA_URL, utils.web.Error("blah")), + (WEBFINGER_URL, WEBFINGER_DATA), + (ACTOR_URL, ACTOR_DATA), + ] + + with self.mockRequests(expected_requests): + self.assertResponse( + "profile @someuser@example.org", + "\x02someuser\x02 (@someuser@example.org): My Biography", + ) + def testProfileSnarfer(self): with self.mockWebfingerSupport("not called"), self.mockRequests([]): self.assertSnarfNoResponse("aaa @nonexistinguser@example.org bbb") diff -Nru limnoria-2022.11.10/plugins/Games/test.py limnoria-2023.1.12/plugins/Games/test.py --- limnoria-2022.11.10/plugins/Games/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Games/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -43,8 +43,11 @@ 'Got a msg without bang|click|spin: %r' % m) elif m.command == 'KICK': sawKick = True - self.assertTrue('bang' in m.args[2].lower(), - 'Got a KICK without bang in it.') + self.assertIn( + 'bang', + m.args[2].lower(), + 'Got a KICK without bang in it.' + ) else: self.fail('Got something other than a kick or a privmsg.') self.assertTrue(sawKick, 'Didn\'t get a kick in %s iterations!' % i) diff -Nru limnoria-2022.11.10/plugins/Limiter/test.py limnoria-2023.1.12/plugins/Limiter/test.py --- limnoria-2022.11.10/plugins/Limiter/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Limiter/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -44,7 +44,7 @@ self.assertEqual(m, ircmsgs.limit('#foo', 1+10)) self.irc.feedMsg(ircmsgs.join('#foo', prefix='bar!root@host')) m = self.irc.takeMsg() - self.assertFalse(m is not None) + self.assertIsNone(m) conf.supybot.plugins.Limiter.maximumExcess.setValue(7) self.irc.feedMsg(ircmsgs.part('#foo', prefix='bar!root@host')) m = self.irc.takeMsg() diff -Nru limnoria-2022.11.10/plugins/Misc/test.py limnoria-2023.1.12/plugins/Misc/test.py --- limnoria-2022.11.10/plugins/Misc/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Misc/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -130,7 +130,7 @@ def testHelpIncludeFullCommandName(self): self.assertHelp('help channel capability add') m = self.getMsg('help channel capability add') - self.assertTrue('channel capability add' in m.args[1]) + self.assertIn('channel capability add', m.args[1]) def testHelpDoesAmbiguityWithDefaultPlugins(self): m = self.getMsg('help list') # Misc.list and User.list. @@ -189,12 +189,12 @@ oldprefix, self.prefix = self.prefix, 'tester!foo@bar__no_testcap__baz' self.nick = 'tester' m = self.getMsg('tell aljsdkfh [plugin tell]') - self.assertTrue('let you do' in m.args[1]) + self.assertIn('let you do', m.args[1]) m = self.getMsg('tell #foo [plugin tell]') - self.assertTrue('No need for' in m.args[1]) + self.assertIn('No need for', m.args[1]) m = self.getMsg('tell me you love me') m = self.irc.takeMsg() - self.assertTrue(m.args[0] == self.nick) + self.assertEqual(m.args[0], self.nick) def testNoNestedTell(self): self.assertRegexp('echo [tell %s foo]' % self.nick, 'nested') @@ -271,7 +271,7 @@ self.assertResponse('more', 'abc '*112 + ' \x02(2 more messages)\x02') m = self.irc.takeMsg() - self.assertIsNot(m, None) + self.assertIsNotNone(m) self.assertEqual( m.args[1], 'abc '*112 + ' \x02(1 more message)\x02') diff -Nru limnoria-2022.11.10/plugins/MoobotFactoids/test.py limnoria-2023.1.12/plugins/MoobotFactoids/test.py --- limnoria-2022.11.10/plugins/MoobotFactoids/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/MoobotFactoids/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -54,8 +54,11 @@ while max and L: max -= 1 option = plugin.pickOptions(s) - self.assertTrue(option in original, - 'Option %s not in %s' % (option, original)) + self.assertIn( + option, + original, + 'Option %s not in %s' % (option, original) + ) if option in L: L.remove(option) self.assertFalse(L, 'Some options never seen: %s' % L) diff -Nru limnoria-2022.11.10/plugins/Reply/test.py limnoria-2023.1.12/plugins/Reply/test.py --- limnoria-2022.11.10/plugins/Reply/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Reply/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -63,6 +63,6 @@ self.prefix = 'something!else@somewhere.else' self.nick = 'something' m = self.assertAction('action foo', 'foo') - self.assertFalse(m.args[0] == self.irc.nick) + self.assertNotEqual(m.args[0], self.irc.nick) # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: diff -Nru limnoria-2022.11.10/plugins/RSS/test.py limnoria-2023.1.12/plugins/RSS/test.py --- limnoria-2022.11.10/plugins/RSS/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/RSS/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -414,7 +414,7 @@ timeFastForward(1.1) self.assertNotError('rss %s' % url) m = self.assertNotError('rss %s 2' % url) - self.assertTrue(m.args[1].count(' | ') == 1) + self.assertEqual(m.args[1].count(' | '), 1) def testRssAdd(self): timeFastForward(1.1) diff -Nru limnoria-2022.11.10/plugins/Seen/test.py limnoria-2023.1.12/plugins/Seen/test.py --- limnoria-2022.11.10/plugins/Seen/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Seen/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -86,7 +86,7 @@ self.assertError('seen *') self.assertNotError('seen %s' % self.nick) m = self.assertNotError('seen %s' % self.nick.upper()) - self.assertTrue(self.nick.upper() in m.args[1]) + self.assertIn(self.nick.upper(), m.args[1]) self.assertRegexp('seen user %s' % self.nick, '^%s was last seen' % self.nick) self.assertNotError('config plugins.Seen.minimumNonWildcard 0') diff -Nru limnoria-2022.11.10/plugins/Services/config.py limnoria-2023.1.12/plugins/Services/config.py --- limnoria-2022.11.10/plugins/Services/config.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Services/config.py 2023-01-12 21:25:09.000000000 +0000 @@ -68,7 +68,7 @@ Services = conf.registerPlugin('Services') conf.registerNetworkValue(Services, 'nicks', - ValidNickSet([], _("""Determines what nicks the bot will use with + ValidNickSet([], _("""Space-separated list of nicks the bot will use with services."""))) class Networks(registry.SpaceSeparatedSetOfStrings): @@ -86,6 +86,10 @@ conf.registerNetworkValue(Services, 'ghostDelay', registry.NonNegativeInteger(60, _("""Determines how many seconds the bot will wait between successive GHOST attempts. Set this to 0 to disable GHOST."""))) +conf.registerNetworkValue(Services, 'ghostCommand', + registry.String("GHOST", _("""Determines the NickServ command to use for GHOST. If the network + you're using runs Anope, set this to "RECOVER". If the network you're using runs Atheme, + set this to "GHOST" or "REGAIN"."""))) conf.registerNetworkValue(Services, 'NickServ', ValidNickOrEmptyString('NickServ', _("""Determines what nick the 'NickServ' service has."""))) diff -Nru limnoria-2022.11.10/plugins/Services/plugin.py limnoria-2023.1.12/plugins/Services/plugin.py --- limnoria-2022.11.10/plugins/Services/plugin.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Services/plugin.py 2023-01-12 21:25:09.000000000 +0000 @@ -162,7 +162,8 @@ else: self.log.info('Sending ghost (current nick: %s; ghosting: %s)', irc.nick, nick) - ghost = 'GHOST %s %s' % (nick, password) + ghostCommand = self.registryValue('ghostCommand', network=irc.network) + ghost = '%s %s %s' % (ghostCommand, nick, password) # Ditto about the sendMsg (see _doIdentify). irc.sendMsg(ircmsgs.privmsg(nickserv, ghost)) state.sentGhost = time.time() @@ -297,7 +298,7 @@ elif irc.isChannel(msg.args[0]): # Atheme uses channel-wide notices for alerting channel access # changes if the FANTASY or VERBOSE setting is on; we can suppress - # these 'unexpected notice' warnings since they're not really + # these 'unexpected notice' warnings since they're not really # important. pass else: diff -Nru limnoria-2022.11.10/plugins/Services/test.py limnoria-2023.1.12/plugins/Services/test.py --- limnoria-2022.11.10/plugins/Services/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Services/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -50,12 +50,12 @@ try: self.assertNotError('services password %s baz' % self.nick) m = self.assertNotError('services identify') - self.assertTrue(m.args[0] == 'NickServ') - self.assertTrue(m.args[1].lower() == 'identify baz') + self.assertEqual(m.args[0], 'NickServ') + self.assertEqual(m.args[1].lower(), 'identify baz') self.assertNotError('services password %s biff' % self.nick) m = self.assertNotError('services identify') - self.assertTrue(m.args[0] == 'NickServ') - self.assertTrue(m.args[1].lower() == 'identify biff') + self.assertEqual(m.args[0], 'NickServ') + self.assertEqual(m.args[1].lower(), 'identify biff') finally: self.assertNotError('services password %s ""' % self.nick) @@ -84,8 +84,8 @@ 'Global: bar; test: bar2') m = self.assertNotError('services identify') - self.assertTrue(m.args[0] == 'NickServ') - self.assertTrue(m.args[1].lower() == 'identify bar2') + self.assertEqual(m.args[0], 'NickServ') + self.assertEqual(m.args[1].lower(), 'identify bar2') finally: self.assertNotError('services password %s ""' % self.nick) diff -Nru limnoria-2022.11.10/plugins/Status/test.py limnoria-2023.1.12/plugins/Status/test.py --- limnoria-2022.11.10/plugins/Status/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Status/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -41,8 +41,8 @@ def testCpu(self): m = self.assertNotError('status cpu') - self.assertFalse('kB kB' in m.args[1]) - self.assertFalse('None' in m.args[1], 'None in cpu output: %r.' % m) + self.assertNotIn('kB kB', m.args[1]) + self.assertNotIn('None', m.args[1], 'None in cpu output: %r.' % m) for s in ['linux', 'freebsd', 'openbsd', 'netbsd', 'darwin']: if sys.platform.startswith(s): self.assertTrue('B' in m.args[1] or 'KB' in m.args[1] or diff -Nru limnoria-2022.11.10/plugins/Topic/test.py limnoria-2023.1.12/plugins/Topic/test.py --- limnoria-2022.11.10/plugins/Topic/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Topic/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -129,7 +129,7 @@ conf.supybot.plugins.Topic.separator.setValue(' <==> ') _ = self.getMsg('topic add foo') m = self.getMsg('topic add bar') - self.assertTrue('<==>' in m.args[1]) + self.assertIn('<==>', m.args[1]) finally: conf.supybot.plugins.Topic.separator.setValue(original) diff -Nru limnoria-2022.11.10/plugins/User/test.py limnoria-2023.1.12/plugins/User/test.py --- limnoria-2022.11.10/plugins/User/test.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/User/test.py 2023-01-12 21:25:09.000000000 +0000 @@ -104,7 +104,7 @@ self.assertResponse('hostmask', self.prefix) self.assertError('@hostmask asdf') m = self.irc.takeMsg() - self.assertFalse(m is not None, m) + self.assertIsNone(m, m) def testRegisterPasswordLength(self): self.assertRegexp('register foo aa', 'at least 3 characters long.') @@ -131,7 +131,7 @@ try: self.assertError('unregister foo') m = self.irc.takeMsg() - self.assertFalse(m is not None, m) + self.assertIsNone(m, m) self.assertTrue(ircdb.users.getUserId('foo')) finally: conf.supybot.databases.users.allowUnregistration.setValue(orig) diff -Nru limnoria-2022.11.10/plugins/Web/plugin.py limnoria-2023.1.12/plugins/Web/plugin.py --- limnoria-2022.11.10/plugins/Web/plugin.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/plugins/Web/plugin.py 2023-01-12 21:25:09.000000000 +0000 @@ -164,8 +164,17 @@ timeout = self.registryValue('timeout') headers = conf.defaultHttpHeaders(irc.network, msg.channel) try: - (target, text) = utils.web.getUrlTargetAndContent(url, size=size, - timeout=timeout, headers=headers) + fd = utils.web.getUrlFd(url, timeout=timeout, headers=headers) + target = fd.geturl() + text = fd.read(size) + response_headers = fd.headers + fd.close() + except socket.timeout: + if raiseErrors: + irc.error(_('Connection to %s timed out') % url, Raise=True) + else: + selg.log.info('Web plugins TitleSnarfer: URL <%s> timed out', + url) except Exception as e: if raiseErrors: irc.error(_('That URL raised <' + str(e)) + '>', @@ -174,9 +183,19 @@ self.log.info('Web plugin TitleSnarfer: URL <%s> raised <%s>', url, str(e)) return + + encoding = None + if 'Content-Type' in fd.headers: + mime_params = [p.split('=', 1) + for p in fd.headers['Content-Type'].split(';')[1:]] + mime_params = {k.strip(): v.strip() for (k, v) in mime_params} + if mime_params.get('charset'): + encoding = mime_params['charset'] + + encoding = encoding or utils.web.getEncoding(text) or 'utf8' + try: - text = text.decode(utils.web.getEncoding(text) or 'utf8', - 'replace') + text = text.decode(encoding, 'replace') except UnicodeDecodeError: if minisix.PY3: if raiseErrors: diff -Nru limnoria-2022.11.10/src/irclib.py limnoria-2023.1.12/src/irclib.py --- limnoria-2022.11.10/src/irclib.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/src/irclib.py 2023-01-12 21:25:09.000000000 +0000 @@ -676,7 +676,7 @@ :type: ircutils.IrcDict[str, ChannelState] - .. attribute:: nickToHostmask + .. attribute:: nicksToHostmasks Stores the last hostmask of a seen nick. diff -Nru limnoria-2022.11.10/src/version.py limnoria-2023.1.12/src/version.py --- limnoria-2022.11.10/src/version.py 2022-11-16 13:00:11.000000000 +0000 +++ limnoria-2023.1.12/src/version.py 2023-01-12 21:25:16.000000000 +0000 @@ -1,4 +1,4 @@ -version = '2022.11.10' +version = '2023.01.12' try: # For import from setup.py import supybot.utils.python supybot.utils.python._debug_software_version = version diff -Nru limnoria-2022.11.10/test/test_callbacks.py limnoria-2023.1.12/test/test_callbacks.py --- limnoria-2022.11.10/test/test_callbacks.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/test/test_callbacks.py 2023-01-12 21:25:09.000000000 +0000 @@ -417,14 +417,14 @@ def testReplyWithNickPrefix(self): self.feedMsg('@len foo') m = self.irc.takeMsg() - self.assertTrue(m is not None, 'm: %r' % m) + self.assertIsNotNone(m, 'm: %r' % m) self.assertTrue(m.args[1].startswith(self.nick)) try: original = conf.supybot.reply.withNickPrefix() conf.supybot.reply.withNickPrefix.setValue(False) self.feedMsg('@len foobar') m = self.irc.takeMsg() - self.assertTrue(m is not None) + self.assertIsNotNone(m) self.assertFalse(m.args[1].startswith(self.nick)) finally: conf.supybot.reply.withNickPrefix.setValue(original) @@ -448,7 +448,7 @@ conf.supybot.reply.error.withNotice.setValue(True) m = self.getMsg("eval irc.error('foo')") self.assertTrue(m, 'No message returned.') - self.assertTrue(m.command == 'NOTICE') + self.assertEqual(m.command, 'NOTICE') finally: conf.supybot.reply.error.withNotice.setValue(original) @@ -1112,10 +1112,10 @@ self.irc.addCallback(self.WithPrivateNotice(self.irc)) # Check normal behavior. m = self.assertNotError('normal') - self.assertFalse(m.command == 'NOTICE') + self.assertNotEqual(m.command, 'NOTICE') self.assertTrue(ircutils.isChannel(m.args[0])) m = self.assertNotError('explicit') - self.assertFalse(m.command == 'NOTICE') + self.assertNotEqual(m.command, 'NOTICE') self.assertTrue(ircutils.isChannel(m.args[0])) # Check abnormal behavior. originalInPrivate = conf.supybot.reply.inPrivate() @@ -1124,10 +1124,10 @@ conf.supybot.reply.inPrivate.setValue(True) conf.supybot.reply.withNotice.setValue(True) m = self.assertNotError('normal') - self.assertTrue(m.command == 'NOTICE') + self.assertEqual(m.command, 'NOTICE') self.assertFalse(ircutils.isChannel(m.args[0])) m = self.assertNotError('explicit') - self.assertFalse(m.command == 'NOTICE') + self.assertNotEqual(m.command, 'NOTICE') self.assertTrue(ircutils.isChannel(m.args[0])) finally: conf.supybot.reply.inPrivate.setValue(originalInPrivate) @@ -1136,10 +1136,10 @@ try: conf.supybot.reply.withNoticeWhenPrivate.setValue(True) m = self.assertNotError('implicit') - self.assertTrue(m.command == 'NOTICE') + self.assertEqual(m.command, 'NOTICE') self.assertFalse(ircutils.isChannel(m.args[0])) m = self.assertNotError('normal') - self.assertFalse(m.command == 'NOTICE') + self.assertNotEqual(m.command, 'NOTICE') self.assertTrue(ircutils.isChannel(m.args[0])) finally: conf.supybot.reply.withNoticeWhenPrivate.setValue(orig) @@ -1149,10 +1149,10 @@ try: conf.supybot.reply.withNoticeWhenPrivate.setValue(True) m = self.assertNotError("eval irc.reply('y',to='x',private=True)") - self.assertTrue(m.command == 'NOTICE') + self.assertEqual(m.command, 'NOTICE') m = self.getMsg(' ') m = self.assertNotError("eval irc.reply('y',to='#x',private=True)") - self.assertFalse(m.command == 'NOTICE') + self.assertNotEqual(m.command, 'NOTICE') finally: conf.supybot.reply.withNoticeWhenPrivate.setValue(original) @@ -1164,28 +1164,28 @@ irc = irclib.Irc('test') proxy = callbacks.SimpleProxy(irc, msg) # First one way... - self.assertFalse(proxy != irc) - self.assertTrue(proxy == irc) + self.assertEqual(proxy, irc) + self.assertEqual(proxy, irc) self.assertEqual(hash(proxy), hash(irc)) # Then the other! - self.assertFalse(irc != proxy) - self.assertTrue(irc == proxy) + self.assertEqual(irc, proxy) + self.assertEqual(irc, proxy) self.assertEqual(hash(irc), hash(proxy)) # And now dictionaries... d = {} d[irc] = 'foo' - self.assertTrue(len(d) == 1) - self.assertTrue(d[irc] == 'foo') - self.assertTrue(d[proxy] == 'foo') + self.assertEqual(len(d), 1) + self.assertEqual(d[irc], 'foo') + self.assertEqual(d[proxy], 'foo') d[proxy] = 'bar' - self.assertTrue(len(d) == 1) - self.assertTrue(d[irc] == 'bar') - self.assertTrue(d[proxy] == 'bar') + self.assertEqual(len(d), 1) + self.assertEqual(d[irc], 'bar') + self.assertEqual(d[proxy], 'bar') d[irc] = 'foo' - self.assertTrue(len(d) == 1) - self.assertTrue(d[irc] == 'foo') - self.assertTrue(d[proxy] == 'foo') + self.assertEqual(len(d), 1) + self.assertEqual(d[irc], 'foo') + self.assertEqual(d[proxy], 'foo') diff -Nru limnoria-2022.11.10/test/test_ircdb.py limnoria-2023.1.12/test/test_ircdb.py --- limnoria-2022.11.10/test/test_ircdb.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/test/test_ircdb.py 2023-01-12 21:25:09.000000000 +0000 @@ -122,17 +122,17 @@ def testContains(self): s = ircdb.CapabilitySet() - self.assertFalse('foo' in s) - self.assertFalse('-foo' in s) + self.assertNotIn('foo', s) + self.assertNotIn('-foo', s) s.add('foo') - self.assertTrue('foo' in s) - self.assertTrue('-foo' in s) + self.assertIn('foo', s) + self.assertIn('-foo', s) s.remove('foo') - self.assertFalse('foo' in s) - self.assertFalse('-foo' in s) + self.assertNotIn('foo', s) + self.assertNotIn('-foo', s) s.add('-foo') - self.assertTrue('foo' in s) - self.assertTrue('-foo' in s) + self.assertIn('foo', s) + self.assertIn('-foo', s) def testCheck(self): s = ircdb.CapabilitySet() @@ -170,8 +170,8 @@ def testOwnerIsAlwaysPresent(self): d = ircdb.UserCapabilitySet() - self.assertTrue('owner' in d) - self.assertTrue('-owner' in d) + self.assertIn('owner', d) + self.assertIn('-owner', d) self.assertFalse(d.check('owner')) d.add('owner') self.assertTrue(d.check('owner')) @@ -187,8 +187,8 @@ def testOwner(self): s = ircdb.UserCapabilitySet() s.add('owner') - self.assertTrue('foo' in s) - self.assertTrue('-foo' in s) + self.assertIn('foo', s) + self.assertIn('-foo', s) self.assertTrue(s.check('owner')) self.assertFalse(s.check('-owner')) self.assertFalse(s.check('-foo')) @@ -265,7 +265,7 @@ self.assertTrue(u.checkHostmask('foo!bar@baz')) u.addAuth('foo!bar@baz') self.assertTrue(u.checkHostmask('foo!bar@baz')) - self.assertTrue(len(u.auth) == 1) + self.assertEqual(len(u.auth), 1) u.addAuth('boo!far@fizz') self.assertTrue(u.checkHostmask('boo!far@fizz')) timeFastForward(2.1) diff -Nru limnoria-2022.11.10/test/test_irclib.py limnoria-2023.1.12/test/test_irclib.py --- limnoria-2022.11.10/test/test_irclib.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/test/test_irclib.py 2023-01-12 21:25:09.000000000 +0000 @@ -52,21 +52,21 @@ def startCapNegociation(self, caps='sasl'): m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) - self.assertTrue(m.args == ('LS', '302'), 'Expected CAP LS 302, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.args, ('LS', '302'), 'Expected CAP LS 302, got %r.' % m) m = self.irc.takeMsg() - self.assertTrue(m.command == 'NICK', 'Expected NICK, got %r.' % m) + self.assertEqual(m.command, 'NICK', 'Expected NICK, got %r.' % m) m = self.irc.takeMsg() - self.assertTrue(m.command == 'USER', 'Expected USER, got %r.' % m) + self.assertEqual(m.command, 'USER', 'Expected USER, got %r.' % m) self.irc.feedMsg(ircmsgs.IrcMsg(command='CAP', args=('*', 'LS', caps))) if caps: m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args[0], 'REQ', m) self.assertEqual(m.args[1], 'sasl') @@ -75,7 +75,7 @@ def endCapNegociation(self): m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args, ('END',), m) @@ -204,13 +204,13 @@ q.enqueue(self.msg) q.enqueue(self.msg) q.enqueue(self.msg) - self.assertTrue(self.msg in q) + self.assertIn(self.msg, q) q.dequeue() - self.assertTrue(self.msg in q) + self.assertIn(self.msg, q) q.dequeue() - self.assertTrue(self.msg in q) + self.assertIn(self.msg, q) q.dequeue() - self.assertFalse(self.msg in q) + self.assertNotIn(self.msg, q) def testRepr(self): q = irclib.IrcMsgQueue() @@ -313,39 +313,39 @@ c1 = pickle.loads(pickle.dumps(c)) self.assertEqual(c, c1) c.removeUser('jemfinch') - self.assertFalse('jemfinch' in c.users) - self.assertTrue('jemfinch' in c1.users) + self.assertNotIn('jemfinch', c.users) + self.assertIn('jemfinch', c1.users) def testCopy(self): c = irclib.ChannelState() c.addUser('jemfinch') c1 = copy.deepcopy(c) c.removeUser('jemfinch') - self.assertFalse('jemfinch' in c.users) - self.assertTrue('jemfinch' in c1.users) + self.assertNotIn('jemfinch', c.users) + self.assertIn('jemfinch', c1.users) def testAddUser(self): c = irclib.ChannelState() c.addUser('foo') - self.assertTrue('foo' in c.users) - self.assertFalse('foo' in c.ops) - self.assertFalse('foo' in c.voices) - self.assertFalse('foo' in c.halfops) + self.assertIn('foo', c.users) + self.assertNotIn('foo', c.ops) + self.assertNotIn('foo', c.voices) + self.assertNotIn('foo', c.halfops) c.addUser('+bar') - self.assertTrue('bar' in c.users) - self.assertTrue('bar' in c.voices) - self.assertFalse('bar' in c.ops) - self.assertFalse('bar' in c.halfops) + self.assertIn('bar', c.users) + self.assertIn('bar', c.voices) + self.assertNotIn('bar', c.ops) + self.assertNotIn('bar', c.halfops) c.addUser('%baz') - self.assertTrue('baz' in c.users) - self.assertTrue('baz' in c.halfops) - self.assertFalse('baz' in c.voices) - self.assertFalse('baz' in c.ops) + self.assertIn('baz', c.users) + self.assertIn('baz', c.halfops) + self.assertNotIn('baz', c.voices) + self.assertNotIn('baz', c.ops) c.addUser('@quuz') - self.assertTrue('quuz' in c.users) - self.assertTrue('quuz' in c.ops) - self.assertFalse('quuz' in c.halfops) - self.assertFalse('quuz' in c.voices) + self.assertIn('quuz', c.users) + self.assertIn('quuz', c.ops) + self.assertNotIn('quuz', c.halfops) + self.assertNotIn('quuz', c.voices) class IrcStateTestCase(SupyTestCase): @@ -362,7 +362,7 @@ st.channels['#foo'] = irclib.ChannelState() m = ircmsgs.kick('#foo', self.irc.nick, prefix=self.irc.prefix) st.addMsg(self.irc, m) - self.assertFalse('#foo' in st.channels) + self.assertNotIn('#foo', st.channels) def testAddMsgRemovesOpsProperly(self): st = irclib.IrcState() @@ -370,18 +370,18 @@ st.channels['#foo'].ops.add('bar') m = ircmsgs.mode('#foo', ('-o', 'bar')) st.addMsg(self.irc, m) - self.assertFalse('bar' in st.channels['#foo'].ops) + self.assertNotIn('bar', st.channels['#foo'].ops) def testNickChangesChangeChannelUsers(self): st = irclib.IrcState() st.channels['#foo'] = irclib.ChannelState() st.channels['#foo'].addUser('@bar') - self.assertTrue('bar' in st.channels['#foo'].users) + self.assertIn('bar', st.channels['#foo'].users) self.assertTrue(st.channels['#foo'].isOp('bar')) st.addMsg(self.irc, ircmsgs.IrcMsg(':bar!asfd@asdf.com NICK baz')) - self.assertFalse('bar' in st.channels['#foo'].users) + self.assertNotIn('bar', st.channels['#foo'].users) self.assertFalse(st.channels['#foo'].isOp('bar')) - self.assertTrue('baz' in st.channels['#foo'].users) + self.assertIn('baz', st.channels['#foo'].users) self.assertTrue(st.channels['#foo'].isOp('baz')) def testHistory(self): @@ -478,20 +478,106 @@ state = irclib.IrcState() stateCopy = state.copy() state.channels['#foo'] = None - self.assertFalse('#foo' in stateCopy.channels) + self.assertNotIn('#foo', stateCopy.channels) def testJoin(self): st = irclib.IrcState() + st.addMsg(self.irc, ircmsgs.join('#foo', prefix=self.irc.prefix)) - self.assertTrue('#foo' in st.channels) - self.assertTrue(self.irc.nick in st.channels['#foo'].users) + self.assertIn('#foo', st.channels) + self.assertIn(self.irc.nick, st.channels['#foo'].users) + st.addMsg(self.irc, ircmsgs.join('#foo', prefix='foo!bar@baz')) - self.assertTrue('foo' in st.channels['#foo'].users) + self.assertIn('foo', st.channels['#foo'].users) + st2 = st.copy() - st.addMsg(self.irc, ircmsgs.quit(prefix='foo!bar@baz')) - self.assertFalse('foo' in st.channels['#foo'].users) - self.assertTrue('foo' in st2.channels['#foo'].users) + st2.addMsg(self.irc, ircmsgs.quit(prefix='foo!bar@baz')) + self.assertNotIn('foo', st2.channels['#foo'].users) + self.assertIn('foo', st.channels['#foo'].users) + + def testNickToHostmask(self): + st = irclib.IrcState() + st.addMsg(self.irc, ircmsgs.join('#foo', prefix='foo!bar@baz')) + st.addMsg(self.irc, ircmsgs.join('#foo', prefix='bar!baz@qux')) + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + # QUIT erases the entry + with self.subTest("QUIT"): + st2 = st.copy() + st2.addMsg(self.irc, ircmsgs.quit(prefix='foo!bar@baz')) + with self.assertRaises(KeyError): + st2.nickToHostmask('foo') + self.assertEqual(st2.nickToHostmask('bar'), 'bar!baz@qux') + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + # NICK moves the entry + with self.subTest("NICK"): + st2 = st.copy() + st2.addMsg(self.irc, ircmsgs.IrcMsg(prefix='foo!bar@baz', + command='NICK', args=['foo2'])) + with self.assertRaises(KeyError): + st2.nickToHostmask('foo') + self.assertEqual(st2.nickToHostmask('foo2'), 'foo2!bar@baz') + self.assertEqual(st2.nickToHostmask('bar'), 'bar!baz@qux') + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + # NICK moves the entry (and overwrites if needed) + with self.subTest("NICK with overwrite"): + st2 = st.copy() + st2.addMsg(self.irc, ircmsgs.IrcMsg(prefix='foo!bar@baz', + command='NICK', args=['bar'])) + with self.assertRaises(KeyError): + st2.nickToHostmask('foo') + self.assertEqual(st2.nickToHostmask('bar'), 'bar!bar@baz') + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + with self.subTest("PRIVMSG"): + st2 = st.copy() + st2.addMsg(self.irc, ircmsgs.IrcMsg(prefix='foo!bar2@baz2', + command='PRIVMSG', + args=['#chan', 'foo'])) + self.assertEqual(st2.nickToHostmask('foo'), 'foo!bar2@baz2') + self.assertEqual(st2.nickToHostmask('bar'), 'bar!baz@qux') + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + with self.subTest("PRIVMSG with no host is ignored"): + st2 = st.copy() + st2.addMsg(self.irc, ircmsgs.IrcMsg(prefix='foo', + command='PRIVMSG', + args=['#chan', 'foo'])) + self.assertEqual(st2.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st2.nickToHostmask('bar'), 'bar!baz@qux') + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + self.assertEqual(st.nickToHostmask('bar'), 'bar!baz@qux') + + def testNickToHostmaskWho(self): + st = irclib.IrcState() + + st.addMsg(self.irc, ircmsgs.IrcMsg(command='352', # RPL_WHOREPLY + args=[self.irc.nick, '#chan', 'bar', 'baz', 'server.example', + 'foo', 'H', '0 real name'])) + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + + def testNickToHostmaskWhox(self): + st = irclib.IrcState() + + st.addMsg(self.irc, ircmsgs.IrcMsg(command='354', # RPL_WHOSPCRPL + args=[self.irc.nick, '1', 'bar', '127.0.0.1', 'baz', + 'foo', 'H', '0', 'real name'])) + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar@baz') + + def testChghost(self): + st = irclib.IrcState() + + st.addMsg(self.irc, ircmsgs.IrcMsg(prefix='foo!bar@baz', + command='CHGHOST', args=['bar2', 'baz2'])) + self.assertEqual(st.nickToHostmask('foo'), 'foo!bar2@baz2') def testEq(self): state1 = irclib.IrcState() @@ -508,23 +594,23 @@ def testHandlesModes(self): st = irclib.IrcState() st.addMsg(self.irc, ircmsgs.join('#foo', prefix=self.irc.prefix)) - self.assertFalse('bar' in st.channels['#foo'].ops) + self.assertNotIn('bar', st.channels['#foo'].ops) st.addMsg(self.irc, ircmsgs.op('#foo', 'bar')) - self.assertTrue('bar' in st.channels['#foo'].ops) + self.assertIn('bar', st.channels['#foo'].ops) st.addMsg(self.irc, ircmsgs.deop('#foo', 'bar')) - self.assertFalse('bar' in st.channels['#foo'].ops) + self.assertNotIn('bar', st.channels['#foo'].ops) - self.assertFalse('bar' in st.channels['#foo'].voices) + self.assertNotIn('bar', st.channels['#foo'].voices) st.addMsg(self.irc, ircmsgs.voice('#foo', 'bar')) - self.assertTrue('bar' in st.channels['#foo'].voices) + self.assertIn('bar', st.channels['#foo'].voices) st.addMsg(self.irc, ircmsgs.devoice('#foo', 'bar')) - self.assertFalse('bar' in st.channels['#foo'].voices) + self.assertNotIn('bar', st.channels['#foo'].voices) - self.assertFalse('bar' in st.channels['#foo'].halfops) + self.assertNotIn('bar', st.channels['#foo'].halfops) st.addMsg(self.irc, ircmsgs.halfop('#foo', 'bar')) - self.assertTrue('bar' in st.channels['#foo'].halfops) + self.assertIn('bar', st.channels['#foo'].halfops) st.addMsg(self.irc, ircmsgs.dehalfop('#foo', 'bar')) - self.assertFalse('bar' in st.channels['#foo'].halfops) + self.assertNotIn('bar', st.channels['#foo'].halfops) def testDoModeOnlyChannels(self): st = irclib.IrcState() @@ -572,14 +658,14 @@ self.irc = irclib.Irc('test') m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) - self.assertTrue(m.args == ('LS', '302'), 'Expected CAP LS 302, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.args, ('LS', '302'), 'Expected CAP LS 302, got %r.' % m) m = self.irc.takeMsg() - self.assertTrue(m.command == 'NICK', 'Expected NICK, got %r.' % m) + self.assertEqual(m.command, 'NICK', 'Expected NICK, got %r.' % m) m = self.irc.takeMsg() - self.assertTrue(m.command == 'USER', 'Expected USER, got %r.' % m) + self.assertEqual(m.command, 'USER', 'Expected USER, got %r.' % m) self.irc.REQUEST_CAPABILITIES = set(['a'*400, 'b'*400]) caps = ' '.join(self.irc.REQUEST_CAPABILITIES) @@ -589,12 +675,12 @@ args=('*', 'LS', 'b'*400))) m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args[0], 'REQ', m) self.assertEqual(m.args[1], 'a'*400) m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args[0], 'REQ', m) self.assertEqual(m.args[1], 'b'*400) @@ -602,20 +688,20 @@ self.irc = irclib.Irc('test') m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) - self.assertTrue(m.args == ('LS', '302'), 'Expected CAP LS 302, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.args, ('LS', '302'), 'Expected CAP LS 302, got %r.' % m) m = self.irc.takeMsg() - self.assertTrue(m.command == 'NICK', 'Expected NICK, got %r.' % m) + self.assertEqual(m.command, 'NICK', 'Expected NICK, got %r.' % m) m = self.irc.takeMsg() - self.assertTrue(m.command == 'USER', 'Expected USER, got %r.' % m) + self.assertEqual(m.command, 'USER', 'Expected USER, got %r.' % m) self.irc.feedMsg(ircmsgs.IrcMsg(command='CAP', args=('*', 'LS', 'account-notify echo-message'))) m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args[0], 'REQ', m) self.assertEqual(m.args[1], 'account-notify') @@ -626,21 +712,21 @@ args=('*', 'ACK', 'account-notify'))) m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args, ('END',), m) def testEchomessageLabeledresponseGrouped(self): self.irc = irclib.Irc('test') m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) - self.assertTrue(m.args == ('LS', '302'), 'Expected CAP LS 302, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.args, ('LS', '302'), 'Expected CAP LS 302, got %r.' % m) m = self.irc.takeMsg() - self.assertTrue(m.command == 'NICK', 'Expected NICK, got %r.' % m) + self.assertEqual(m.command, 'NICK', 'Expected NICK, got %r.' % m) m = self.irc.takeMsg() - self.assertTrue(m.command == 'USER', 'Expected USER, got %r.' % m) + self.assertEqual(m.command, 'USER', 'Expected USER, got %r.' % m) self.irc.REQUEST_CAPABILITIES = set([ 'account-notify', 'a'*490, 'echo-message', 'labeled-response']) @@ -649,17 +735,17 @@ 'account-notify ' + 'a'*490 + ' echo-message labeled-response'))) m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args[0], 'REQ', m) self.assertEqual(m.args[1], 'echo-message labeled-response') m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args[0], 'REQ', m) self.assertEqual(m.args[1], 'a'*490) m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args[0], 'REQ', m) self.assertEqual(m.args[1], 'account-notify') @@ -836,14 +922,14 @@ #self.assertTrue(m.command == 'PASS', 'Expected PASS, got %r.' % m) m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) - self.assertTrue(m.args == ('LS', '302'), 'Expected CAP LS 302, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.args, ('LS', '302'), 'Expected CAP LS 302, got %r.' % m) m = self.irc.takeMsg() - self.assertTrue(m.command == 'NICK', 'Expected NICK, got %r.' % m) + self.assertEqual(m.command, 'NICK', 'Expected NICK, got %r.' % m) m = self.irc.takeMsg() - self.assertTrue(m.command == 'USER', 'Expected USER, got %r.' % m) + self.assertEqual(m.command, 'USER', 'Expected USER, got %r.' % m) # TODO self.irc.feedMsg(ircmsgs.IrcMsg(command='CAP', @@ -852,7 +938,7 @@ args=('*', 'LS', 'extended-join'))) m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args[0], 'REQ', m) # NOTE: Capabilities are requested in alphabetic order, because # sets are unordered, and their "order" is nondeterministic. @@ -862,11 +948,11 @@ args=('*', 'ACK', 'account-tag multi-prefix extended-join'))) m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args, ('END',), m) m = self.irc.takeMsg() - self.assertTrue(m is None, m) + self.assertIsNone(m, m) def testPingResponse(self): self.irc.feedMsg(ircmsgs.ping('123')) @@ -890,9 +976,9 @@ self.irc.queueMsg(ircmsgs.IrcMsg('NOTICE #foo bar')) self.irc.sendMsg(ircmsgs.IrcMsg('PRIVMSG #foo yeah!')) msg = self.irc.takeMsg() - self.assertTrue(msg.command == 'PRIVMSG') + self.assertEqual(msg.command, 'PRIVMSG') msg = self.irc.takeMsg() - self.assertTrue(msg.command == 'NOTICE') + self.assertEqual(msg.command, 'NOTICE') def testNoMsgLongerThan512(self): self.irc.queueMsg(ircmsgs.privmsg('whocares', 'x'*1000)) @@ -1542,7 +1628,7 @@ conf.supybot.networks.test.sasl.password.setValue('') m = self.irc.takeMsg() - self.assertTrue(m.command == 'CAP', 'Expected CAP, got %r.' % m) + self.assertEqual(m.command, 'CAP', 'Expected CAP, got %r.' % m) self.assertEqual(m.args[0], 'REQ', m) self.assertEqual(m.args[1], 'sasl') self.irc.feedMsg(ircmsgs.IrcMsg(command='CAP', diff -Nru limnoria-2022.11.10/test/test_ircmsgs.py limnoria-2023.1.12/test/test_ircmsgs.py --- limnoria-2022.11.10/test/test_ircmsgs.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/test/test_ircmsgs.py 2023-01-12 21:25:09.000000000 +0000 @@ -70,7 +70,7 @@ def testNe(self): for msg in msgs: - self.assertFalse(msg != msg) + self.assertEqual(msg, msg) ## def testImmutability(self): ## s = 'something else' @@ -99,7 +99,7 @@ prefix='foo!bar@baz') m = ircmsgs.IrcMsg(prefix='foo!bar@baz', args=('foo', 'bar'), command='CMD') - self.assertIs(m.time, None) + self.assertIsNone(m.time) m.time = 24 self.assertEqual(ircmsgs.IrcMsg(msg=m).time, 24) diff -Nru limnoria-2022.11.10/test/test_ircutils.py limnoria-2023.1.12/test/test_ircutils.py --- limnoria-2022.11.10/test/test_ircutils.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/test/test_ircutils.py 2023-01-12 21:25:09.000000000 +0000 @@ -236,53 +236,53 @@ s = ('foo bar baz qux ' * 100)[0:-1] r = ircutils.wrap(s, 10) - self.assertTrue(max(map(pred, r)) <= 10) + self.assertLessEqual(max(map(pred, r)), 10) self.assertEqual(''.join(r), s) r = ircutils.wrap(s, 100) - self.assertTrue(max(map(pred, r)) <= 100) + self.assertLessEqual(max(map(pred, r)), 100) self.assertEqual(''.join(r), s) s = (''.join([chr(0x1f527), chr(0x1f527), chr(0x1f527), ' ']) * 100)\ [0:-1] r = ircutils.wrap(s, 20) - self.assertTrue(max(map(pred, r)) <= 20, (max(map(pred, r)), repr(r))) + self.assertLessEqual(max(map(pred, r)), 20, (max(map(pred, r)), repr(r))) self.assertEqual(''.join(r), s) r = ircutils.wrap(s, 100) - self.assertTrue(max(map(pred, r)) <= 100) + self.assertLessEqual(max(map(pred, r)), 100) self.assertEqual(''.join(r), s) s = ('foobarbazqux ' * 100)[0:-1] r = ircutils.wrap(s, 10) - self.assertTrue(max(map(pred, r)) <= 10) + self.assertLessEqual(max(map(pred, r)), 10) self.assertEqual(''.join(r), s) r = ircutils.wrap(s, 100) - self.assertTrue(max(map(pred, r)) <= 100) + self.assertLessEqual(max(map(pred, r)), 100) self.assertEqual(''.join(r), s) s = ('foobarbazqux' * 100)[0:-1] r = ircutils.wrap(s, 10) - self.assertTrue(max(map(pred, r)) <= 10) + self.assertLessEqual(max(map(pred, r)), 10) self.assertEqual(''.join(r), s) r = ircutils.wrap(s, 100) - self.assertTrue(max(map(pred, r)) <= 100) + self.assertLessEqual(max(map(pred, r)), 100) self.assertEqual(''.join(r), s) s = chr(233)*500 r = ircutils.wrap(s, 500) - self.assertTrue(max(map(pred, r)) <= 500) + self.assertLessEqual(max(map(pred, r)), 500) r = ircutils.wrap(s, 139) - self.assertTrue(max(map(pred, r)) <= 139) + self.assertLessEqual(max(map(pred, r)), 139) s = '\x02\x16 barbazqux' + ('foobarbazqux ' * 20)[0:-1] r = ircutils.wrap(s, 91) - self.assertTrue(max(map(pred, r)) <= 91) + self.assertLessEqual(max(map(pred, r)), 91) def testSafeArgument(self): s = 'I have been running for 9 seconds' @@ -453,9 +453,9 @@ def testContains(self): d = ircutils.IrcDict() d['#FOO'] = None - self.assertTrue('#foo' in d) + self.assertIn('#foo', d) d['#fOOBAR[]'] = None - self.assertTrue('#foobar{}' in d) + self.assertIn('#foobar{}', d) def testGetSetItem(self): d = ircutils.IrcDict() @@ -467,8 +467,8 @@ def testCopyable(self): d = ircutils.IrcDict() d['foo'] = 'bar' - self.assertTrue(d == copy.copy(d)) - self.assertTrue(d == copy.deepcopy(d)) + self.assertEqual(d, copy.copy(d)) + self.assertEqual(d, copy.deepcopy(d)) class IrcSetTestCase(SupyTestCase): @@ -476,30 +476,30 @@ s = ircutils.IrcSet() s.add('foo') s.add('bar') - self.assertTrue('foo' in s) - self.assertTrue('FOO' in s) + self.assertIn('foo', s) + self.assertIn('FOO', s) s.discard('alfkj') s.remove('FOo') - self.assertFalse('foo' in s) - self.assertFalse('FOo' in s) + self.assertNotIn('foo', s) + self.assertNotIn('FOo', s) def testCopy(self): s = ircutils.IrcSet() s.add('foo') s.add('bar') s1 = copy.deepcopy(s) - self.assertTrue('foo' in s) - self.assertTrue('FOO' in s) + self.assertIn('foo', s) + self.assertIn('FOO', s) s.discard('alfkj') s.remove('FOo') - self.assertFalse('foo' in s) - self.assertFalse('FOo' in s) - self.assertTrue('foo' in s1) - self.assertTrue('FOO' in s1) + self.assertNotIn('foo', s) + self.assertNotIn('FOo', s) + self.assertIn('foo', s1) + self.assertIn('FOO', s1) s1.discard('alfkj') s1.remove('FOo') - self.assertFalse('foo' in s1) - self.assertFalse('FOo' in s1) + self.assertNotIn('foo', s1) + self.assertNotIn('FOo', s1) class IrcStringTestCase(SupyTestCase): @@ -514,8 +514,8 @@ def testInequality(self): s1 = 'supybot' s2 = ircutils.IrcString('Supybot') - self.assertTrue(s1 == s2) - self.assertFalse(s1 != s2) + self.assertEqual(s1, s2) + self.assertEqual(s1, s2) class AuthenticateTestCase(SupyTestCase): PAIRS = [ diff -Nru limnoria-2022.11.10/test/test_registry.py limnoria-2023.1.12/test/test_registry.py --- limnoria-2022.11.10/test/test_registry.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/test/test_registry.py 2023-01-12 21:25:09.000000000 +0000 @@ -224,6 +224,73 @@ registry.open_registry(filename) self.assertEqual(conf.supybot.networks.test.password(), ' foo ') + def testReload(self): + import supybot.world as world + with conf.supybot.reply.whenAddressedBy.chars.context('@'): + with conf.supybot.reply.whenAddressedBy.chars\ + .get(':testreloadnet').get('#testreloadchan').context('#'): + with conf.supybot.reply.whenAddressedBy.chars \ + .get(':testreloadnet2').context(','): + + newircs = [] + for name in ("testreloadnet", "testreloadnet2", "testnet"): + class newirc: + network = name + newircs.append(newirc) + world.ircs.append(newirc) + try: + # separate function, to keep indent level to a sane + # level + self._testReload() + finally: + for newirc in newircs: + world.ircs.remove(newirc) + + def _testReload(self): + # sanity checks before the actual tests + self.assertEqual(conf.supybot.reply.whenAddressedBy.chars(), '@') + self.assertEqual(conf.supybot.reply.whenAddressedBy.chars + .getSpecific(network='testnet', channel='testchan')(), + '@') + self.assertEqual(conf.supybot.reply.whenAddressedBy.chars + .getSpecific(channel='#testchan')(), + '@') + self.assertEqual(conf.supybot.reply.whenAddressedBy.chars + .getSpecific(network='testreloadnet2')(), + ',') + self.assertEqual(conf.supybot.reply.whenAddressedBy.chars + .getSpecific(network='testreloadnet', + channel='#testreloadchan')(), + '#') + + filename = conf.supybot.directories.conf.dirize('reload.conf') + registry.close(conf.supybot, filename) + with open(filename, 'at') as fd: + fd.write('supybot.reply.whenAddressedBy.chars: !') + + registry.open_registry(filename) + + # new global value applies + self.assertEqual(conf.supybot.reply.whenAddressedBy.chars(), '!') + self.assertEqual(conf.supybot.reply.whenAddressedBy.chars + .getSpecific(network='testnet', channel='#testchan')(), + '!') + self.assertEqual(conf.supybot.reply.whenAddressedBy.chars + .getSpecific(network='testnet', channel='#testchan')(), + '!') + self.assertEqual(conf.supybot.reply.whenAddressedBy.chars + .getSpecific(channel='#testchan')(), + '!') + + # remain unchanged + self.assertEqual(conf.supybot.reply.whenAddressedBy.chars + .getSpecific(network='testreloadnet2')(), + ',') + self.assertEqual(conf.supybot.reply.whenAddressedBy.chars + .getSpecific(network='testreloadnet', + channel='#testreloadchan')(), + '#') + def testWith(self): v = registry.String('foo', 'help') self.assertEqual(v(), 'foo') diff -Nru limnoria-2022.11.10/test/test_standardSubstitute.py limnoria-2023.1.12/test/test_standardSubstitute.py --- limnoria-2022.11.10/test/test_standardSubstitute.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/test/test_standardSubstitute.py 2023-01-12 21:25:09.000000000 +0000 @@ -74,9 +74,9 @@ self.assertNotEqual(f(irc, msg, '$today'), '$today') self.assertNotEqual(f(irc, msg, '$now'), '$now') n = f(irc, msg, '$randnick') - self.assertTrue(n in irc.state.channels['#foo'].users) + self.assertIn(n, irc.state.channels['#foo'].users) n = f(irc, msg, '$randomnick') - self.assertTrue(n in irc.state.channels['#foo'].users) + self.assertIn(n, irc.state.channels['#foo'].users) n = f(irc, msg, '$randomnick '*100) L = n.split() self.assertFalse(all(L[0].__eq__, L), 'all $randomnicks were the same') diff -Nru limnoria-2022.11.10/test/test_utils.py limnoria-2023.1.12/test/test_utils.py --- limnoria-2022.11.10/test/test_utils.py 2022-11-16 13:00:02.000000000 +0000 +++ limnoria-2023.1.12/test/test_utils.py 2023-01-12 21:25:09.000000000 +0000 @@ -74,7 +74,7 @@ def testInsensitivePreservingDict(self): ipd = utils.InsensitivePreservingDict d = ipd(dict(Foo=10)) - self.assertTrue(d['foo'] == 10) + self.assertEqual(d['foo'], 10) self.assertEqual(d.keys(), ['Foo']) self.assertEqual(d.get('foo'), 10) self.assertEqual(d.get('Foo'), 10) @@ -399,7 +399,7 @@ def testEllipsisify(self): f = utils.str.ellipsisify self.assertEqual(f('x'*30, 30), 'x'*30) - self.assertTrue(len(f('x'*35, 30)) <= 30) + self.assertLessEqual(len(f('x'*35, 30)), 30) self.assertTrue(f(' '.join(['xxxx']*10), 30)[:-3].endswith('xxxx')) @@ -553,7 +553,7 @@ if network: def testGetUrlWithSize(self): url = 'http://slashdot.org/' - self.assertTrue(len(utils.web.getUrl(url, 1024)) == 1024) + self.assertEqual(len(utils.web.getUrl(url, 1024)), 1024) class FormatTestCase(SupyTestCase): def testNormal(self): @@ -619,10 +619,10 @@ def testContains(self): b = RingBuffer(3, range(3)) - self.assertTrue(0 in b) - self.assertTrue(1 in b) - self.assertTrue(2 in b) - self.assertFalse(3 in b) + self.assertIn(0, b) + self.assertIn(1, b) + self.assertIn(2, b) + self.assertNotIn(3, b) def testGetitem(self): L = range(10) @@ -711,18 +711,18 @@ def testEq(self): b = RingBuffer(3, range(3)) - self.assertFalse(b == list(range(3))) + self.assertNotEqual(b, list(range(3))) b1 = RingBuffer(3) - self.assertFalse(b == b1) + self.assertNotEqual(b, b1) b1.append(0) - self.assertFalse(b == b1) + self.assertNotEqual(b, b1) b1.append(1) - self.assertFalse(b == b1) + self.assertNotEqual(b, b1) b1.append(2) - self.assertTrue(b == b1) + self.assertEqual(b, b1) b = RingBuffer(100, range(10)) b1 = RingBuffer(10, range(10)) - self.assertFalse(b == b1) + self.assertNotEqual(b, b1) def testIter(self): b = RingBuffer(3, range(3)) @@ -799,24 +799,24 @@ def testEq(self): q1 = queue() q2 = queue() - self.assertTrue(q1 == q1, 'queue not equal to itself') - self.assertTrue(q2 == q2, 'queue not equal to itself') - self.assertTrue(q1 == q2, 'initialized queues not equal') + self.assertEqual(q1, q1, 'queue not equal to itself') + self.assertEqual(q2, q2, 'queue not equal to itself') + self.assertEqual(q1, q2, 'initialized queues not equal') q1.enqueue(1) - self.assertTrue(q1 == q1, 'queue not equal to itself') - self.assertTrue(q2 == q2, 'queue not equal to itself') + self.assertEqual(q1, q1, 'queue not equal to itself') + self.assertEqual(q2, q2, 'queue not equal to itself') q2.enqueue(1) - self.assertTrue(q1 == q1, 'queue not equal to itself') - self.assertTrue(q2 == q2, 'queue not equal to itself') - self.assertTrue(q1 == q2, 'queues not equal after identical enqueue') + self.assertEqual(q1, q1, 'queue not equal to itself') + self.assertEqual(q2, q2, 'queue not equal to itself') + self.assertEqual(q1, q2, 'queues not equal after identical enqueue') q1.dequeue() - self.assertTrue(q1 == q1, 'queue not equal to itself') - self.assertTrue(q2 == q2, 'queue not equal to itself') - self.assertFalse(q1 == q2, 'queues equal after one dequeue') + self.assertEqual(q1, q1, 'queue not equal to itself') + self.assertEqual(q2, q2, 'queue not equal to itself') + self.assertNotEqual(q1, q2, 'queues equal after one dequeue') q2.dequeue() - self.assertTrue(q1 == q2, 'queues not equal after both are dequeued') - self.assertTrue(q1 == q1, 'queue not equal to itself') - self.assertTrue(q2 == q2, 'queue not equal to itself') + self.assertEqual(q1, q2, 'queues not equal after both are dequeued') + self.assertEqual(q1, q1, 'queue not equal to itself') + self.assertEqual(q2, q2, 'queue not equal to itself') def testInit(self): self.assertEqual(len(queue()), 0, 'queue len not 0 after init') @@ -876,17 +876,17 @@ def testContains(self): q = queue() - self.assertFalse(1 in q, 'empty queue cannot have elements') + self.assertNotIn(1, q, 'empty queue cannot have elements') q.enqueue(1) - self.assertTrue(1 in q, 'recent enqueued element not in q') + self.assertIn(1, q, 'recent enqueued element not in q') q.enqueue(2) - self.assertTrue(1 in q, 'original enqueued element not in q') - self.assertTrue(2 in q, 'second enqueued element not in q') + self.assertIn(1, q, 'original enqueued element not in q') + self.assertIn(2, q, 'second enqueued element not in q') q.dequeue() - self.assertFalse(1 in q, 'dequeued element in q') - self.assertTrue(2 in q, 'not dequeued element not in q') + self.assertNotIn(1, q, 'dequeued element in q') + self.assertIn(2, q, 'not dequeued element not in q') q.dequeue() - self.assertFalse(2 in q, 'dequeued element in q') + self.assertNotIn(2, q, 'dequeued element in q') def testIter(self): q1 = queue((1, 2, 3)) @@ -964,24 +964,24 @@ def testEq(self): q1 = queue() q2 = queue() - self.assertTrue(q1 == q1, 'queue not equal to itself') - self.assertTrue(q2 == q2, 'queue not equal to itself') - self.assertTrue(q1 == q2, 'initialized queues not equal') + self.assertEqual(q1, q1, 'queue not equal to itself') + self.assertEqual(q2, q2, 'queue not equal to itself') + self.assertEqual(q1, q2, 'initialized queues not equal') q1.enqueue(1) - self.assertTrue(q1 == q1, 'queue not equal to itself') - self.assertTrue(q2 == q2, 'queue not equal to itself') + self.assertEqual(q1, q1, 'queue not equal to itself') + self.assertEqual(q2, q2, 'queue not equal to itself') q2.enqueue(1) - self.assertTrue(q1 == q1, 'queue not equal to itself') - self.assertTrue(q2 == q2, 'queue not equal to itself') - self.assertTrue(q1 == q2, 'queues not equal after identical enqueue') + self.assertEqual(q1, q1, 'queue not equal to itself') + self.assertEqual(q2, q2, 'queue not equal to itself') + self.assertEqual(q1, q2, 'queues not equal after identical enqueue') q1.dequeue() - self.assertTrue(q1 == q1, 'queue not equal to itself') - self.assertTrue(q2 == q2, 'queue not equal to itself') - self.assertFalse(q1 == q2, 'queues equal after one dequeue') + self.assertEqual(q1, q1, 'queue not equal to itself') + self.assertEqual(q2, q2, 'queue not equal to itself') + self.assertNotEqual(q1, q2, 'queues equal after one dequeue') q2.dequeue() - self.assertTrue(q1 == q2, 'queues not equal after both are dequeued') - self.assertTrue(q1 == q1, 'queue not equal to itself') - self.assertTrue(q2 == q2, 'queue not equal to itself') + self.assertEqual(q1, q2, 'queues not equal after both are dequeued') + self.assertEqual(q1, q1, 'queue not equal to itself') + self.assertEqual(q2, q2, 'queue not equal to itself') def testInit(self): self.assertEqual(len(queue()), 0, 'queue len not 0 after init') @@ -1041,17 +1041,17 @@ def testContains(self): q = queue() - self.assertFalse(1 in q, 'empty queue cannot have elements') + self.assertNotIn(1, q, 'empty queue cannot have elements') q.enqueue(1) - self.assertTrue(1 in q, 'recent enqueued element not in q') + self.assertIn(1, q, 'recent enqueued element not in q') q.enqueue(2) - self.assertTrue(1 in q, 'original enqueued element not in q') - self.assertTrue(2 in q, 'second enqueued element not in q') + self.assertIn(1, q, 'original enqueued element not in q') + self.assertIn(2, q, 'second enqueued element not in q') q.dequeue() - self.assertFalse(1 in q, 'dequeued element in q') - self.assertTrue(2 in q, 'not dequeued element not in q') + self.assertNotIn(1, q, 'dequeued element in q') + self.assertIn(2, q, 'not dequeued element not in q') q.dequeue() - self.assertFalse(2 in q, 'dequeued element in q') + self.assertNotIn(2, q, 'dequeued element in q') def testIter(self): q1 = queue((1, 2, 3)) @@ -1092,28 +1092,28 @@ class TwoWayDictionaryTestCase(SupyTestCase): def testInit(self): d = TwoWayDictionary(foo='bar') - self.assertTrue('foo' in d) - self.assertTrue('bar' in d) + self.assertIn('foo', d) + self.assertIn('bar', d) d = TwoWayDictionary({1: 2}) - self.assertTrue(1 in d) - self.assertTrue(2 in d) + self.assertIn(1, d) + self.assertIn(2, d) def testSetitem(self): d = TwoWayDictionary() d['foo'] = 'bar' - self.assertTrue('foo' in d) - self.assertTrue('bar' in d) + self.assertIn('foo', d) + self.assertIn('bar', d) def testDelitem(self): d = TwoWayDictionary(foo='bar') del d['foo'] - self.assertFalse('foo' in d) - self.assertFalse('bar' in d) + self.assertNotIn('foo', d) + self.assertNotIn('bar', d) d = TwoWayDictionary(foo='bar') del d['bar'] - self.assertFalse('bar' in d) - self.assertFalse('foo' in d) + self.assertNotIn('bar', d) + self.assertNotIn('foo', d) class TestTimeoutQueue(SupyTestCase): @@ -1146,11 +1146,11 @@ def testContains(self): q = TimeoutQueue(1) q.enqueue(1) - self.assertTrue(1 in q) - self.assertTrue(1 in q) # For some reason, the second one might fail. - self.assertFalse(2 in q) + self.assertIn(1, q) + self.assertIn(1, q) # For some reason, the second one might fail. + self.assertNotIn(2, q) timeFastForward(1.1) - self.assertFalse(1 in q) + self.assertNotIn(1, q) def testIter(self): q = TimeoutQueue(1) @@ -1178,9 +1178,9 @@ def testReset(self): q = TimeoutQueue(10) q.enqueue(1) - self.assertTrue(1 in q) + self.assertIn(1, q) q.reset() - self.assertFalse(1 in q) + self.assertNotIn(1, q) def testClean(self): def iter_and_next(q): @@ -1213,9 +1213,9 @@ d = CacheDict(10) for i in range(max**2): d[i] = i - self.assertTrue(len(d) <= max) - self.assertTrue(i in d) - self.assertTrue(d[i] == i) + self.assertLessEqual(len(d), max) + self.assertIn(i, d) + self.assertEqual(d[i], i) class TestExpiringDict(SupyTestCase): def testInit(self): @@ -1313,14 +1313,14 @@ def testBasics(self): s = TruncatableSet(['foo', 'bar', 'baz', 'qux']) self.assertEqual(s, set(['foo', 'bar', 'baz', 'qux'])) - self.assertTrue('foo' in s) - self.assertTrue('bar' in s) - self.assertFalse('quux' in s) + self.assertIn('foo', s) + self.assertIn('bar', s) + self.assertNotIn('quux', s) s.discard('baz') - self.assertTrue('foo' in s) - self.assertFalse('baz' in s) + self.assertIn('foo', s) + self.assertNotIn('baz', s) s.add('quux') - self.assertTrue('quux' in s) + self.assertIn('quux', s) def testTruncate(self): s = TruncatableSet(['foo', 'bar'])