diff --git a/plugins/Aka/plugin.py b/plugins/Aka/plugin.py index aa4335ad5..8d5ec8ba8 100644 --- a/plugins/Aka/plugin.py +++ b/plugins/Aka/plugin.py @@ -38,6 +38,7 @@ import supybot.utils as utils import supybot.ircdb as ircdb from supybot.commands import * import supybot.plugins as plugins +import supybot.minisix as minisix import supybot.ircutils as ircutils import supybot.callbacks as callbacks from supybot.i18n import PluginInternationalization @@ -106,7 +107,7 @@ if sqlite3: def has_aka(self, channel, name): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') db = self.get_db(channel) return self.get_db(channel).cursor() \ @@ -122,7 +123,7 @@ if sqlite3: def get_alias(self, channel, name): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') cursor = self.get_db(channel).cursor() cursor.execute("""SELECT alias FROM aliases @@ -137,7 +138,7 @@ if sqlite3: name = callbacks.canonicalName(name, preserve_spaces=True) if self.has_aka(channel, name): raise AkaError(_('This Aka already exists.')) - if sys.version_info[0] < 3: + if minisix.PY2: if isinstance(name, str): name = name.decode('utf8') if isinstance(alias, str): @@ -150,7 +151,7 @@ if sqlite3: def remove_aka(self, channel, name): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') db = self.get_db(channel) db.cursor().execute('DELETE FROM aliases WHERE name = ?', (name,)) @@ -158,7 +159,7 @@ if sqlite3: def lock_aka(self, channel, name, by): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') db = self.get_db(channel) cursor = db.cursor().execute("""UPDATE aliases @@ -170,7 +171,7 @@ if sqlite3: def unlock_aka(self, channel, name, by): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') db = self.get_db(channel) cursor = db.cursor() @@ -182,7 +183,7 @@ if sqlite3: def get_aka_lock(self, channel, name): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') cursor = self.get_db(channel).cursor() cursor.execute("""SELECT locked, locked_by, locked_at @@ -237,7 +238,7 @@ elif sqlalchemy: def has_aka(self, channel, name): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') count = self.get_db(channel).query(SQLAlchemyAlias) \ .filter(SQLAlchemyAlias.name == name) \ @@ -249,7 +250,7 @@ elif sqlalchemy: def get_alias(self, channel, name): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') try: return self.get_db(channel).query(SQLAlchemyAlias.alias) \ @@ -261,7 +262,7 @@ elif sqlalchemy: name = callbacks.canonicalName(name, preserve_spaces=True) if self.has_aka(channel, name): raise AkaError(_('This Aka already exists.')) - if sys.version_info[0] < 3: + if minisix.PY2: if isinstance(name, str): name = name.decode('utf8') if isinstance(alias, str): @@ -272,7 +273,7 @@ elif sqlalchemy: def remove_aka(self, channel, name): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') db = self.get_db(channel) db.query(SQLAlchemyAlias).filter(SQLAlchemyAlias.name == name).delete() @@ -280,7 +281,7 @@ elif sqlalchemy: def lock_aka(self, channel, name, by): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') db = self.get_db(channel) try: @@ -297,7 +298,7 @@ elif sqlalchemy: def unlock_aka(self, channel, name, by): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') db = self.get_db(channel) try: @@ -314,7 +315,7 @@ elif sqlalchemy: def get_aka_lock(self, channel, name): name = callbacks.canonicalName(name, preserve_spaces=True) - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') try: return self.get_db(channel) \ @@ -387,7 +388,7 @@ class Aka(callbacks.Plugin): for cb in dynamic.irc.callbacks: # including this plugin if cb.isCommandMethod(' '.join(args[0:-1])): return False - if sys.version_info[0] < 3 and isinstance(name, str): + if minisix.PY2 and isinstance(name, str): name = name.decode('utf8') channel = dynamic.channel or 'global' return self._db.has_aka(channel, name) or \ diff --git a/plugins/Alias/plugin.py b/plugins/Alias/plugin.py index 8ddc2b59b..c4cd5663f 100644 --- a/plugins/Alias/plugin.py +++ b/plugins/Alias/plugin.py @@ -35,6 +35,7 @@ import types import supybot.conf as conf import supybot.utils as utils from supybot.commands import * +import supybot.minisix as minisix import supybot.ircutils as ircutils import supybot.registry as registry import supybot.callbacks as callbacks @@ -223,7 +224,7 @@ def makeNewAlias(name, alias): doc = format(_('\n\nAlias for %q.'), flexargs, (biggestDollar, _('argument')), alias) except UnicodeDecodeError: - if sys.version_info[0] == 2: + if minisix.PY2: alias = alias.decode('utf8') doc = format(_('\n\nAlias for %q.'), flexargs, (biggestDollar, _('argument')), alias) diff --git a/plugins/ChannelLogger/plugin.py b/plugins/ChannelLogger/plugin.py index 897e5d68a..e991d86ef 100644 --- a/plugins/ChannelLogger/plugin.py +++ b/plugins/ChannelLogger/plugin.py @@ -31,14 +31,13 @@ import os import sys import time -if sys.version_info[0] < 3: - from io import open from cStringIO import StringIO import supybot.conf as conf import supybot.world as world import supybot.ircdb as ircdb import supybot.irclib as irclib +import supybot.minisix as minisix import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.registry as registry @@ -46,6 +45,9 @@ import supybot.callbacks as callbacks from supybot.i18n import PluginInternationalization, internationalizeDocstring _ = PluginInternationalization('ChannelLogger') +if minisix.PY2: + from io import open + class FakeLog(object): def flush(self): return @@ -164,7 +166,7 @@ class ChannelLogger(callbacks.Plugin): format = conf.supybot.log.timestampFormat() if format: string = time.strftime(format) + ' ' - if sys.version_info[0] < 3: + if minisix.PY2: string = string.decode('utf8', 'ignore') log.write(string) @@ -181,7 +183,7 @@ class ChannelLogger(callbacks.Plugin): self.timestamp(log) if self.registryValue('stripFormatting', channel): s = ircutils.stripFormatting(s) - if sys.version_info[0] < 3: + if minisix.PY2: s = s.decode('utf8', 'ignore') log.write(s) if self.registryValue('flushImmediately'): diff --git a/plugins/Factoids/plugin.py b/plugins/Factoids/plugin.py index f01c3b95d..1ca165763 100644 --- a/plugins/Factoids/plugin.py +++ b/plugins/Factoids/plugin.py @@ -39,6 +39,7 @@ import supybot.ircdb as ircdb import supybot.utils as utils from supybot.commands import * import supybot.plugins as plugins +import supybot.minisix as minisix import supybot.ircutils as ircutils import supybot.callbacks as callbacks import supybot.httpserver as httpserver @@ -219,11 +220,11 @@ class Factoids(callbacks.Plugin, plugins.ChannelDBHandler): def makeDb(self, filename): if os.path.exists(filename): db = sqlite3.connect(filename) - if sys.version_info[0] < 3: + if minisix.PY2: db.text_factory = str return db db = sqlite3.connect(filename) - if sys.version_info[0] < 3: + if minisix.PY2: db.text_factory = str cursor = db.cursor() cursor.execute("""CREATE TABLE keys ( diff --git a/plugins/Filter/plugin.py b/plugins/Filter/plugin.py index 4cdd0fa27..751a70e4e 100644 --- a/plugins/Filter/plugin.py +++ b/plugins/Filter/plugin.py @@ -38,6 +38,7 @@ from cStringIO import StringIO import supybot.conf as conf import supybot.utils as utils from supybot.commands import * +import supybot.minisix as minisix import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks @@ -146,7 +147,7 @@ class Filter(callbacks.Plugin): Returns the binary representation of . """ L = [] - if sys.version_info[0] >= 3: + if minisix.PY3: if isinstance(text, str): bytes_ = text.encode() else: @@ -221,7 +222,7 @@ class Filter(callbacks.Plugin): commonly used for text that simply needs to be hidden from inadvertent reading by roaming eyes, since it's easily reversible. """ - if sys.version_info[0] < 3: + if minisix.PY2: text = text.decode('utf8') irc.reply(self._rot13_encoder(text)[0]) rot13 = wrap(rot13, ['text']) @@ -398,12 +399,12 @@ class Filter(callbacks.Plugin): Returns colorized like a rainbow. """ - if sys.version_info[0] < 3: + if minisix.PY2: text = text.decode('utf-8') colors = utils.iter.cycle(['05', '04', '07', '08', '09', '03', '11', '10', '12', '02', '06', '13']) L = [self._color(c, fg=next(colors)) for c in text] - if sys.version_info[0] < 3: + if minisix.PY2: L = [c.encode('utf-8') for c in L] irc.reply(''.join(L) + '\x03') rainbow = wrap(rainbow, ['text']) diff --git a/plugins/GPG/plugin.py b/plugins/GPG/plugin.py index 49c6e5603..b4ea2f962 100644 --- a/plugins/GPG/plugin.py +++ b/plugins/GPG/plugin.py @@ -38,6 +38,7 @@ import supybot.conf as conf import supybot.utils as utils import supybot.ircdb as ircdb from supybot.commands import * +import supybot.minisix as minisix import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks @@ -147,7 +148,7 @@ class GPG(callbacks.Plugin): the key used is associated to a user.""" self._expire_tokens() content = utils.web.getUrl(url) - if sys.version_info[0] >= 3 and isinstance(content, bytes): + if minisix.PY3 and isinstance(content, bytes): content = content.decode() match = self._auth_re.search(content) if not match: diff --git a/plugins/Google/plugin.py b/plugins/Google/plugin.py index d77242313..cc64edcfc 100644 --- a/plugins/Google/plugin.py +++ b/plugins/Google/plugin.py @@ -40,6 +40,7 @@ import supybot.conf as conf import supybot.utils as utils import supybot.world as world from supybot.commands import * +import supybot.minisix as minisix import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks @@ -136,7 +137,7 @@ class Google(callbacks.PluginRegexp): title = utils.web.htmlToText(result['titleNoFormatting']\ .encode('utf-8')) url = result['unescapedUrl'] - if sys.version_info[0] < 3: + if minisix.PY2: url = url.encode('utf-8') if title: if bold: @@ -144,7 +145,7 @@ class Google(callbacks.PluginRegexp): results.append(format('%s: %u', title, url)) else: results.append(url) - if sys.version_info[0] < 3: + if minisix.PY2: repl = lambda x:x if isinstance(x, unicode) else unicode(x, 'utf8') results = list(map(repl, results)) if not results: diff --git a/plugins/Karma/plugin.py b/plugins/Karma/plugin.py index 7dcf611f9..3b5e704a6 100644 --- a/plugins/Karma/plugin.py +++ b/plugins/Karma/plugin.py @@ -35,6 +35,7 @@ import csv import supybot.conf as conf import supybot.utils as utils from supybot.commands import * +import supybot.minisix as minisix import supybot.plugins as plugins import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils @@ -59,12 +60,12 @@ class SqliteKarmaDB(object): return self.dbs[filename] if os.path.exists(filename): db = sqlite3.connect(filename, check_same_thread=False) - if sys.version_info[0] < 3: + if minisix.PY2: db.text_factory = str self.dbs[filename] = db return db db = sqlite3.connect(filename, check_same_thread=False) - if sys.version_info[0] < 3: + if minisix.PY2: db.text_factory = str self.dbs[filename] = db cursor = db.cursor() diff --git a/plugins/Math/test.py b/plugins/Math/test.py index a19491f7d..4ea7f61f1 100644 --- a/plugins/Math/test.py +++ b/plugins/Math/test.py @@ -101,7 +101,7 @@ class MathTestCase(PluginTestCase): self.assertResponse('calc 5*0.06', str(5*0.06)) self.assertResponse('calc 2.0-7.0', str(2-7)) self.assertResponse('calc e**(i*pi)+1', '0') - if sys.version_info[0] >= 3: + if minisix.PY3: # Python 2 has bad handling of exponentiation of negative numbers self.assertResponse('calc (-1)**.5', 'i') self.assertRegexp('calc (-5)**.5', '2.236067977[0-9]+i') diff --git a/plugins/MessageParser/plugin.py b/plugins/MessageParser/plugin.py index ef51f234e..b7668d773 100644 --- a/plugins/MessageParser/plugin.py +++ b/plugins/MessageParser/plugin.py @@ -30,6 +30,7 @@ import supybot.utils as utils from supybot.commands import * +import supybot.minisix as minisix import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks @@ -81,11 +82,11 @@ class MessageParser(callbacks.Plugin, plugins.ChannelDBHandler): """Create the database and connect to it.""" if os.path.exists(filename): db = sqlite3.connect(filename) - if sys.version_info[0] < 3: + if minisix.PY2: db.text_factory = str return db db = sqlite3.connect(filename) - if sys.version_info[0] < 3: + if minisix.PY2: db.text_factory = str cursor = db.cursor() cursor.execute("""CREATE TABLE triggers ( diff --git a/plugins/Misc/plugin.py b/plugins/Misc/plugin.py index b36cf408a..8c575e113 100644 --- a/plugins/Misc/plugin.py +++ b/plugins/Misc/plugin.py @@ -44,6 +44,7 @@ import supybot.utils as utils from supybot.commands import * import supybot.ircdb as ircdb import supybot.irclib as irclib +import supybot.minisix as minisix import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.callbacks as callbacks @@ -53,7 +54,7 @@ from supybot import commands from supybot.i18n import PluginInternationalization, internationalizeDocstring _ = PluginInternationalization('Misc') -if sys.version_info[0] < 3: +if minisix.PY2: from itertools import ifilter as filter def get_suffix(file): @@ -336,7 +337,7 @@ class Misc(callbacks.Plugin): version = data['commit']['committer']['date'] # Strip the last 'Z': version = version.rsplit('T', 1)[0].replace('-', '.') - if sys.version_info[0] < 3 and isinstance(version, unicode): + if minisix.PY2 and isinstance(version, unicode): version = version.encode('utf8') versions[branch] = version newest = _('The newest versions available online are %s.') % \ diff --git a/plugins/MoobotFactoids/plugin.py b/plugins/MoobotFactoids/plugin.py index b38359f36..303edb72b 100755 --- a/plugins/MoobotFactoids/plugin.py +++ b/plugins/MoobotFactoids/plugin.py @@ -39,6 +39,7 @@ import supybot.ircdb as ircdb import supybot.utils as utils import supybot.shlex as shlex from supybot.commands import * +import supybot.minisix as minisix import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks @@ -107,12 +108,12 @@ class SqliteMoobotDB(object): if os.path.exists(filename): db = sqlite3.connect(filename, check_same_thread=False) - if sys.version_info[0] < 3: + if minisix.PY2: db.text_factory = str self.dbs[channel] = db return db db = sqlite3.connect(filename, check_same_thread=False) - if sys.version_info[0] < 3: + if minisix.PY2: db.text_factory = str self.dbs[channel] = db cursor = db.cursor() diff --git a/plugins/Owner/plugin.py b/plugins/Owner/plugin.py index 20cc205ee..0f1bd1122 100644 --- a/plugins/Owner/plugin.py +++ b/plugins/Owner/plugin.py @@ -47,6 +47,7 @@ from supybot.commands import * import supybot.irclib as irclib import supybot.plugin as plugin import supybot.plugins as plugins +import supybot.minisix as minisix import supybot.drivers as drivers import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils @@ -398,7 +399,7 @@ class Owner(callbacks.Plugin): L.append(format('linecache line cache flushed: %n cleared.', (len(linecache.cache), 'line'))) linecache.clearcache() - if sys.version_info[0] < 3: + if minisix.PY2: sys.exc_clear() collected = world.upkeep() if gc.garbage: diff --git a/plugins/PluginDownloader/plugin.py b/plugins/PluginDownloader/plugin.py index 50abf660b..3739c368a 100644 --- a/plugins/PluginDownloader/plugin.py +++ b/plugins/PluginDownloader/plugin.py @@ -37,17 +37,18 @@ import urllib import tarfile from cStringIO import StringIO -BytesIO = StringIO if sys.version_info[0] < 3 else io.BytesIO - import supybot.log as log import supybot.conf as conf import supybot.utils as utils from supybot.commands import * +import supybot.minisix as minisix import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.callbacks as callbacks from supybot.i18n import PluginInternationalization, internationalizeDocstring +BytesIO = StringIO if minisix.PY2 else io.BytesIO + _ = PluginInternationalization('PluginDownloader') class Repository: @@ -104,7 +105,7 @@ class GithubRepository(GitRepository): def _download(self, plugin): try: response = utils.web.getUrlFd(self._downloadUrl) - if sys.version_info[0] < 3: + if minisix.PY2: assert response.getcode() == 200, response.getcode() else: assert response.status == 200, response.status @@ -127,7 +128,7 @@ class GithubRepository(GitRepository): assert archive.getmember(prefix + dirname).isdir(), \ 'This is not a valid plugin (it is a file, not a directory).' - run_2to3 = sys.version_info[0] >= 3 + run_2to3 = minisix.PY3 for file in archive.getmembers(): if file.name.startswith(prefix + dirname): extractedFile = archive.extractfile(file) @@ -144,7 +145,7 @@ class GithubRepository(GitRepository): with open(newFileName, 'ab') as fd: reload_imported = False for line in extractedFile.readlines(): - if sys.version_info[0] >= 3: + if minisix.PY3: if 'import reload' in line.decode(): reload_imported = True elif not reload_imported and \ @@ -188,7 +189,7 @@ class GithubRepository(GitRepository): if file.name.startswith(prefix + dirname + '/README'): extractedFile = archive.extractfile(file) content = extractedFile.read() - if sys.version_info[0] >= 3: + if minisix.PY3: content = content.decode() return content diff --git a/plugins/PluginDownloader/test.py b/plugins/PluginDownloader/test.py index 7770e515e..a0353013f 100644 --- a/plugins/PluginDownloader/test.py +++ b/plugins/PluginDownloader/test.py @@ -33,6 +33,7 @@ import sys import shutil from supybot.test import * +import supybot.minisix as minisix pluginsPath = '%s/test-plugins' % os.getcwd() @@ -98,7 +99,7 @@ class PluginDownloaderTestCase(PluginTestCase): 'Advanced Twitter plugin for Supybot, with capabilities ' 'handling, and per-channel user account.') - if sys.version_info[0] >= 3: + if minisix.PY3: def test_2to3(self): self.assertRegexp('plugindownloader install SpiderDave Pastebin', 'convert') diff --git a/plugins/QuoteGrabs/plugin.py b/plugins/QuoteGrabs/plugin.py index 4de6da4dd..389fda95d 100644 --- a/plugins/QuoteGrabs/plugin.py +++ b/plugins/QuoteGrabs/plugin.py @@ -37,6 +37,7 @@ import supybot.dbi as dbi import supybot.conf as conf import supybot.utils as utils from supybot.commands import * +import supybot.minisix as minisix import supybot.ircmsgs as ircmsgs import supybot.plugins as plugins import supybot.ircutils as ircutils @@ -86,13 +87,13 @@ class SqliteQuoteGrabsDB(object): return self.dbs[filename] if os.path.exists(filename): db = sqlite3.connect(filename) - if sys.version_info[0] < 3: + if minisix.PY2: db.text_factory = str db.create_function('nickeq', 2, p) self.dbs[filename] = db return db db = sqlite3.connect(filename) - if sys.version_info[0] < 3: + if minisix.PY2: db.text_factory = str db.create_function('nickeq', 2, p) self.dbs[filename] = db diff --git a/plugins/RSS/plugin.py b/plugins/RSS/plugin.py index 9b47c2873..f406fb3f4 100644 --- a/plugins/RSS/plugin.py +++ b/plugins/RSS/plugin.py @@ -44,6 +44,7 @@ import supybot.conf as conf import supybot.utils as utils import supybot.world as world from supybot.commands import * +import supybot.minisix as minisix import supybot.ircmsgs as ircmsgs import supybot.ircutils as ircutils import supybot.registry as registry diff --git a/plugins/RSS/test.py b/plugins/RSS/test.py index f825f74bf..053d885b2 100644 --- a/plugins/RSS/test.py +++ b/plugins/RSS/test.py @@ -32,7 +32,8 @@ import sys import feedparser from supybot.test import * import supybot.conf as conf -if sys.version_info[0] >= 3: +import supybot.minisix as minisix +if minisix.PY3: from io import BytesIO else: from cStringIO import StringIO as BytesIO @@ -47,7 +48,7 @@ xkcd_new = """ def constant(content): - if sys.version_info[0] >= 3: + if minisix.PY3: content = content.encode() def f(*args, **kwargs): return BytesIO(content) diff --git a/plugins/Seen/plugin.py b/plugins/Seen/plugin.py index da762b728..c380909e4 100644 --- a/plugins/Seen/plugin.py +++ b/plugins/Seen/plugin.py @@ -39,6 +39,7 @@ import supybot.world as world import supybot.ircdb as ircdb from supybot.commands import * import supybot.irclib as irclib +import supybot.minisix as minisix import supybot.ircmsgs as ircmsgs import supybot.plugins as plugins import supybot.ircutils as ircutils @@ -209,7 +210,7 @@ class Seen(callbacks.Plugin): nick, channel, utils.timeElapsed(time.time()-when)) if self.registryValue('showLastMessage', channel): - if sys.version_info[0] < 3: + if minisix.PY2: said = said.decode('utf8') reply = _('%s: %s') % (reply, said) irc.reply(reply) diff --git a/plugins/String/plugin.py b/plugins/String/plugin.py index adcc77e00..75eed6101 100644 --- a/plugins/String/plugin.py +++ b/plugins/String/plugin.py @@ -37,7 +37,7 @@ import binascii import supybot.utils as utils from supybot.commands import * -import supybot.commands as commands +import supybot.minisix as minisix import supybot.plugins as plugins import supybot.commands as commands import supybot.ircutils as ircutils @@ -96,9 +96,9 @@ class String(callbacks.Plugin): text = codecs.getencoder('base64_codec')(text)[0].decode() # Change result into a string - if sys.version_info[0] < 3 and isinstance(text, unicode): + if minisix.PY2 and isinstance(text, unicode): text = text.encode('utf-8') - elif sys.version_info[0] >= 3 and isinstance(text, bytes): + elif minisix.PY3 and isinstance(text, bytes): text = text.decode() if encoding in ('base64', 'base64_codec'): @@ -129,7 +129,7 @@ class String(callbacks.Plugin): decoder = codecs.getdecoder(encoding) except LookupError: irc.errorInvalid(_('encoding'), encoding) - if sys.version_info[0] >= 3 and not isinstance(text, bytes): + if minisix.PY3 and not isinstance(text, bytes): text = text.encode() try: text = decoder(text)[0] @@ -140,9 +140,9 @@ class String(callbacks.Plugin): return # Change result into a string - if sys.version_info[0] < 3 and isinstance(text, unicode): + if minisix.PY2 and isinstance(text, unicode): text = text.encode('utf-8') - elif sys.version_info[0] >= 3 and isinstance(text, bytes): + elif minisix.PY3 and isinstance(text, bytes): try: text = text.decode() except UnicodeDecodeError: diff --git a/plugins/Unix/plugin.py b/plugins/Unix/plugin.py index 1f0f6bd82..0ceb4f3e0 100644 --- a/plugins/Unix/plugin.py +++ b/plugins/Unix/plugin.py @@ -42,6 +42,7 @@ import shlex import supybot.utils as utils from supybot.commands import * +import supybot.minisix as minisix import supybot.plugins as plugins import supybot.ircutils as ircutils import supybot.registry as registry @@ -222,7 +223,7 @@ class Unix(callbacks.Plugin): 'not available.'), Raise=True) (out, err) = inst.communicate() inst.wait() - if sys.version_info[0] > 2: + if minisix.PY3: lines = [i.decode('utf-8').rstrip() for i in out.splitlines()] lines = list(map(str, lines)) else: diff --git a/plugins/Web/plugin.py b/plugins/Web/plugin.py index c777c016a..31c01a108 100644 --- a/plugins/Web/plugin.py +++ b/plugins/Web/plugin.py @@ -37,6 +37,7 @@ import htmlentitydefs import supybot.conf as conf import supybot.utils as utils from supybot.commands import * +import supybot.minisix as minisix import supybot.plugins as plugins import supybot.commands as commands import supybot.ircutils as ircutils @@ -163,7 +164,7 @@ class Web(callbacks.PluginRegexp): if self.registryValue('snarferShowTargetDomain', channel) else url) title = utils.web.htmlToText(parser.title.strip()) - if sys.version_info[0] < 3: + if minisix.PY2: if isinstance(title, unicode): title = title.encode('utf8', 'replace') s = format(_('Title: %s (at %s)'), title, domain) @@ -280,7 +281,7 @@ class Web(callbacks.PluginRegexp): except UnicodeDecodeError: pass parser = Title() - if sys.version_info[0] >= 3 and isinstance(text, bytes): + if minisix.PY3 and isinstance(text, bytes): irc.error(_('Could not guess the page\'s encoding. (Try ' 'installing python-charade.)'), Raise=True) try: diff --git a/setup.py b/setup.py index 679cc5abf..0387ffedc 100644 --- a/setup.py +++ b/setup.py @@ -51,7 +51,7 @@ try: proc = subprocess.Popen('git show HEAD --format=%ci', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) date = proc.stdout.readline() - if sys.version_info[0] >= 3: + if minisix.PY3: date = date.decode() date = time.strptime(date.strip(), '%Y-%m-%d %H:%M:%S %z') utc_date = time.gmtime(time.mktime(date)) diff --git a/src/callbacks.py b/src/callbacks.py index ffbed9840..679d82cf5 100644 --- a/src/callbacks.py +++ b/src/callbacks.py @@ -42,7 +42,13 @@ import codecs import getopt import inspect -if sys.version_info[0] < 3: +from . import (conf, ircdb, irclib, ircmsgs, ircutils, log, minisix, registry, + utils, world) +from .utils.iter import any, all +from .i18n import PluginInternationalization, internationalizeDocstring +_ = PluginInternationalization() + +if minisix.PY2: # cStringIO is buggy with Python 2.6 ( # see http://paste.progval.net/show/227/ ) # and it does not handle unicode objects in Python 2.x @@ -50,12 +56,6 @@ if sys.version_info[0] < 3: else: from cStringIO import StringIO -from . import (conf, ircdb, irclib, ircmsgs, ircutils, log, registry, utils, - world) -from .utils.iter import any, all -from .i18n import PluginInternationalization, internationalizeDocstring -_ = PluginInternationalization() - def _addressed(nick, msg, prefixChars=None, nicks=None, prefixStrings=None, whenAddressedByNick=None, whenAddressedByNickAtEnd=None): @@ -151,9 +151,9 @@ def canonicalName(command, preserve_spaces=False): Currently, this makes everything lowercase and removes all dashes and underscores. """ - if sys.version_info[0] < 3 and isinstance(command, unicode): + if minisix.PY2 and isinstance(command, unicode): command = command.encode('utf-8') - elif sys.version_info[0] >= 3 and isinstance(command, bytes): + elif minisix.PY3 and isinstance(command, bytes): command = command.decode() special = '\t-_' if not preserve_spaces: @@ -294,7 +294,7 @@ class Tokenizer(object): # Whoever you are, if you make a single modification to this # code, TEST the code with Python 2 & 3, both with the unit # tests and on IRC with this: @echo "好" - if sys.version_info[0] < 3: + if minisix.PY2: try: token = token.encode('utf8').decode('string_escape') token = token.decode('utf8') @@ -925,7 +925,7 @@ class NestedCommandsIrcProxy(ReplyIrcProxy): # In case we're truncating, we add 20 to allowedLength, # because our allowedLength is shortened for the # "(XX more messages)" trailer. - if sys.version_info[0] >= 3: + if minisix.PY3: appended = _('(XX more messages)').encode() s = s.encode()[:allowedLength+len(appended)] s = s.decode('utf8', 'ignore') diff --git a/src/drivers/Socket.py b/src/drivers/Socket.py index c249a352d..f7655da59 100644 --- a/src/drivers/Socket.py +++ b/src/drivers/Socket.py @@ -41,7 +41,7 @@ import errno import select import socket -from .. import (conf, drivers, log, schedule, utils, world) +from .. import (conf, drivers, log, minisix, schedule, utils, world) from ..utils.iter import imap from ..utils.str import decode_raw_line @@ -127,7 +127,7 @@ class SocketDriver(drivers.IrcDriver, drivers.ServersMixin): self.outbuffer += ''.join(map(str, msgs)) if self.outbuffer: try: - if sys.version_info[0] < 3: + if minisix.PY2: sent = self.conn.send(self.outbuffer) else: sent = self.conn.send(self.outbuffer.encode()) @@ -148,8 +148,8 @@ class SocketDriver(drivers.IrcDriver, drivers.ServersMixin): # Do not use a list comprehension here, we have to edit the list # and not to reassign it. if not inst.connected or \ - (sys.version_info[0] == 3 and inst.conn._closed) or \ - (sys.version_info[0] == 2 and + (minisix.PY3 and inst.conn._closed) or \ + (minisix.PY2 and inst.conn._sock.__class__ is socket._closedsocket): cls._instances.remove(inst) elif inst.conn.fileno() == -1: diff --git a/src/httpserver.py b/src/httpserver.py index ee9398904..b770bc91f 100644 --- a/src/httpserver.py +++ b/src/httpserver.py @@ -41,6 +41,7 @@ from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler import supybot.log as log import supybot.conf as conf import supybot.world as world +import supybot.minisix as minisix from supybot.i18n import PluginInternationalization _ = PluginInternationalization() @@ -276,7 +277,7 @@ class SupyHTTPServerCallback(object): message, it probably means you are developing a plugin, and you have neither overriden this message or defined an handler for this query.""") - if sys.version_info[0] >= 3: + if minisix.PY3: def write(self, b): if isinstance(b, str): b = b.encode() @@ -316,7 +317,7 @@ class Supy404(SupyHTTPServerCallback): self.send_header('Content-Length', len(self.response)) self.end_headers() response = self.response - if sys.version_info[0] >= 3: + if minisix.PY3: response = response.encode() self.wfile.write(response) @@ -339,7 +340,7 @@ class SupyIndex(SupyHTTPServerCallback): self.send_header('Content-Type', 'text/html; charset=utf-8') self.send_header('Content-Length', len(response)) self.end_headers() - if sys.version_info[0] >= 3: + if minisix.PY3: response = response.encode() self.wfile.write(response) @@ -357,7 +358,7 @@ class Static(SupyHTTPServerCallback): self.send_header('Content-type', self._mimetype) self.send_header('Content-Length', len(response)) self.end_headers() - if sys.version_info[0] >= 3: + if minisix.PY3: response = response.encode() self.wfile.write(response) @@ -394,7 +395,7 @@ class Favicon(SupyHTTPServerCallback): self.send_header('Content-type', 'text/plain; charset=utf-8') self.send_header('Content-Length', len(response)) self.end_headers() - if sys.version_info[0] >= 3: + if minisix.PY3: response = response.encode() self.wfile.write(response) diff --git a/src/ircmsgs.py b/src/ircmsgs.py index 45bf3104b..130fe924a 100644 --- a/src/ircmsgs.py +++ b/src/ircmsgs.py @@ -40,7 +40,7 @@ import sys import time import functools -from . import conf, ircutils, utils +from . import conf, ircutils, minisix, utils from .utils.iter import all ### @@ -582,7 +582,7 @@ def kick(channel, nick, s='', prefix='', msg=None): assert isNick(nick), repr(nick) if msg and not prefix: prefix = msg.prefix - if sys.version_info[0] < 3 and isinstance(s, unicode): + if minisix.PY2 and isinstance(s, unicode): s = s.encode('utf8') assert isinstance(s, str) if s: @@ -602,7 +602,7 @@ def kicks(channels, nicks, s='', prefix='', msg=None): assert areNicks(nicks), repr(nicks) if msg and not prefix: prefix = msg.prefix - if sys.version_info[0] < 3 and isinstance(s, unicode): + if minisix.PY2 and isinstance(s, unicode): s = s.encode('utf8') assert isinstance(s, str) if s: @@ -619,7 +619,7 @@ def privmsg(recipient, s, prefix='', msg=None): if conf.supybot.protocols.irc.strictRfc(): assert (areReceivers(recipient)), repr(recipient) assert s, 's must not be empty.' - if sys.version_info[0] < 3 and isinstance(s, unicode): + if minisix.PY2 and isinstance(s, unicode): s = s.encode('utf8') assert isinstance(s, str) if msg and not prefix: @@ -651,7 +651,7 @@ def notice(recipient, s, prefix='', msg=None): if conf.supybot.protocols.irc.strictRfc(): assert areReceivers(recipient), repr(recipient) assert s, 'msg must not be empty.' - if sys.version_info[0] < 3 and isinstance(s, unicode): + if minisix.PY2 and isinstance(s, unicode): s = s.encode('utf8') assert isinstance(s, str) if msg and not prefix: @@ -701,7 +701,7 @@ def part(channel, s='', prefix='', msg=None): assert isChannel(channel), repr(channel) if msg and not prefix: prefix = msg.prefix - if sys.version_info[0] < 3 and isinstance(s, unicode): + if minisix.PY2 and isinstance(s, unicode): s = s.encode('utf8') assert isinstance(s, str) if s: @@ -717,7 +717,7 @@ def parts(channels, s='', prefix='', msg=None): assert all(isChannel, channels), channels if msg and not prefix: prefix = msg.prefix - if sys.version_info[0] < 3 and isinstance(s, unicode): + if minisix.PY2 and isinstance(s, unicode): s = s.encode('utf8') assert isinstance(s, str) if s: @@ -746,7 +746,7 @@ def topic(channel, topic=None, prefix='', msg=None): return IrcMsg(prefix=prefix, command='TOPIC', args=(channel,), msg=msg) else: - if sys.version_info[0] < 3 and isinstance(topic, unicode): + if minisix.PY2 and isinstance(topic, unicode): topic = topic.encode('utf8') assert isinstance(topic, str) return IrcMsg(prefix=prefix, command='TOPIC', diff --git a/src/ircutils.py b/src/ircutils.py index 566b5a73c..e7c619f0a 100644 --- a/src/ircutils.py +++ b/src/ircutils.py @@ -608,10 +608,10 @@ def isValidArgument(s): def safeArgument(s): """If s is unsafe for IRC, returns a safe version.""" - if sys.version_info[0] < 3 and isinstance(s, unicode): + if minisix.PY2 and isinstance(s, unicode): s = s.encode('utf-8') - elif (sys.version_info[0] < 3 and not isinstance(s, basestring)) or \ - (sys.version_info[0] >= 3 and not isinstance(s, str)): + elif (minisix.PY2 and not isinstance(s, basestring)) or \ + (minisix.PY3 and not isinstance(s, str)): debug('Got a non-string in safeArgument: %r', s) s = str(s) if isValidArgument(s): diff --git a/src/plugin.py b/src/plugin.py index ebe7e970b..b1333ade9 100644 --- a/src/plugin.py +++ b/src/plugin.py @@ -65,7 +65,7 @@ def loadPluginModule(name, ignoreDeprecation=False): module = imp.load_module(name, *moduleInfo) except: sys.modules.pop(name, None) - keys = sys.modules.keys() + keys = list(sys.modules.keys()) for key in keys: if key.startswith(name + '.'): sys.modules.pop(key) diff --git a/src/questions.py b/src/questions.py index 61abb19a8..dfeaece9e 100644 --- a/src/questions.py +++ b/src/questions.py @@ -35,7 +35,7 @@ import sys import textwrap from getpass import getpass as getPass -from . import ansi, utils +from . import ansi, minisix, utils from supybot.i18n import PluginInternationalization, internationalizeDocstring _ = PluginInternationalization() @@ -76,7 +76,7 @@ def expect(prompt, possibilities, recursed=False, default=None, if useBold: prompt += ansi.RESET print(ansi.BOLD, end=' ', file=fd) - if sys.version_info[0] >= 3: + if minisix.PY3: s = input(prompt) else: s = raw_input(prompt) diff --git a/src/registry.py b/src/registry.py index 0a9a562e2..fc6033a4f 100644 --- a/src/registry.py +++ b/src/registry.py @@ -37,7 +37,7 @@ import codecs import string import textwrap -from . import utils, i18n +from . import utils, i18n, minisix _ = i18n.PluginInternationalization() def error(s): @@ -66,7 +66,7 @@ class NonExistentRegistryEntry(RegistryException, AttributeError): # raise an AttributeError if a registry entry does not exist. pass -ENCODING = 'string_escape' if sys.version_info[0] < 3 else 'unicode_escape' +ENCODING = 'string_escape' if minisix.PY2 else 'unicode_escape' decoder = codecs.getdecoder(ENCODING) encoder = codecs.getencoder(ENCODING) diff --git a/src/test.py b/src/test.py index 3e0b07e72..2c5124c1f 100644 --- a/src/test.py +++ b/src/test.py @@ -40,7 +40,7 @@ import unittest import threading from . import (callbacks, conf, drivers, httpserver, i18n, ircdb, irclib, - ircmsgs, ircutils, log, plugin, registry, utils, world) + ircmsgs, ircutils, log, minisix, plugin, registry, utils, world) i18n.import_conf() network = True @@ -242,7 +242,7 @@ class PluginTestCase(SupyTestCase): prefixChars = conf.supybot.reply.whenAddressedBy.chars() if not usePrefixChar and query[0] in prefixChars: query = query[1:] - if sys.version_info[0] < 3: + if minisix.PY2: query = query.encode('utf8') # unicode->str msg = ircmsgs.privmsg(to, query, prefix=frm) if self.myVerbose: @@ -437,7 +437,7 @@ class ChannelPluginTestCase(PluginTestCase): prefixChars = conf.supybot.reply.whenAddressedBy.chars() if query[0] not in prefixChars and usePrefixChar: query = prefixChars[0] + query - if sys.version_info[0] < 3 and isinstance(query, unicode): + if minisix.PY2 and isinstance(query, unicode): query = query.encode('utf8') # unicode->str msg = ircmsgs.privmsg(to, query, prefix=frm) if self.myVerbose: diff --git a/src/utils/gen.py b/src/utils/gen.py index a9006d0f9..8d95ac520 100644 --- a/src/utils/gen.py +++ b/src/utils/gen.py @@ -46,6 +46,7 @@ from . import crypt from .str import format from .file import mktemp from .iter import imap +from .. import minisix from supybot.i18n import PluginInternationalization _ = PluginInternationalization() @@ -168,7 +169,7 @@ def saltHash(password, salt=None, hash='sha'): hasher = crypt.md5 return '|'.join([salt, hasher((salt + password).encode('utf8')).hexdigest()]) -_astStr2 = ast.Str if sys.version_info[0] < 3 else ast.Bytes +_astStr2 = ast.Str if minisix.PY2 else ast.Bytes def safeEval(s, namespace={'True': True, 'False': False, 'None': None}): """Evaluates s, safely. Useful for turning strings into tuples/lists/etc. without unsafely using eval().""" @@ -223,7 +224,7 @@ class IterableMap(object): """Define .items() in a class and subclass this to get the other iters. """ def items(self): - if sys.version_info[0] >= 3 and hasattr(self, 'items'): + if minisix.PY3 and hasattr(self, 'items'): # For old plugins return getattr(self, 'items')() # avoid 2to3 else: diff --git a/src/utils/str.py b/src/utils/str.py index 1d0994daa..44898af0e 100644 --- a/src/utils/str.py +++ b/src/utils/str.py @@ -53,7 +53,7 @@ try: except ImportError: charadeLoaded = False -if sys.version_info[0] >= 3: +if minisix.PY3: def decode_raw_line(line): #first, try to decode using utf-8 try: @@ -182,8 +182,8 @@ def dqrepr(s): """Returns a repr() of s guaranteed to be in double quotes.""" # The wankers-that-be decided not to use double-quotes anymore in 2.3. # return '"' + repr("'\x00" + s)[6:] - encoding = 'string_escape' if sys.version_info[0] < 3 else 'unicode_escape' - if sys.version_info[0] < 3 and isinstance(s, unicode): + encoding = 'string_escape' if minisix.PY2 else 'unicode_escape' + if minisix.PY2 and isinstance(s, unicode): s = s.encode('utf8', 'replace') return '"%s"' % s.encode(encoding).decode().replace('"', '\\"') @@ -506,7 +506,7 @@ def format(s, *args, **kwargs): # to add the character to the _formatRe regexp or it will be ignored # (and hard to debug if you don't know the trick). # Of course, you should also document it in the docstring above. - if sys.version_info[0] < 3: + if minisix.PY2: def pred(s): if isinstance(s, unicode): return s.encode('utf8') @@ -521,7 +521,7 @@ def format(s, *args, **kwargs): token = args.pop() if isinstance(token, str): return token - elif sys.version_info[0] < 3 and isinstance(token, unicode): + elif minisix.PY2 and isinstance(token, unicode): return token.encode('utf8', 'replace') else: return str(token) diff --git a/src/utils/web.py b/src/utils/web.py index 0f18899db..8c1412602 100644 --- a/src/utils/web.py +++ b/src/utils/web.py @@ -46,6 +46,7 @@ except AttributeError: pass from .str import normalizeWhitespace +from .. import minisix Request = urllib2.Request urlquote = urllib.quote @@ -108,7 +109,7 @@ def getUrlFd(url, headers=None, data=None, timeout=None): a dict and string, respectively, as per urllib2.Request's arguments.""" if headers is None: headers = defaultHeaders - if sys.version_info[0] >= 3 and isinstance(data, str): + if minisix.PY3 and isinstance(data, str): data = data.encode() try: if not isinstance(url, urllib2.Request): @@ -203,9 +204,9 @@ class HtmlToText(HTMLParser, object): def handle_entityref(self, data): if data in htmlentitydefs.name2codepoint: self.data.append(unichr(htmlentitydefs.name2codepoint[data])) - elif sys.version_info[0] >= 3 and isinstance(data, bytes): + elif minisix.PY3 and isinstance(data, bytes): self.data.append(data.decode()) - elif sys.version_info[0] < 3 and isinstance(data, str): + elif minisix.PY2 and isinstance(data, str): self.data.append(data.decode('utf8', errors='replace')) else: self.data.append(data) @@ -222,7 +223,7 @@ def htmlToText(s, tagReplace=' '): s = s.decode(encoding) else: try: - if sys.version_info[0] < 3 or isinstance(s, bytes): + if minisix.PY2 or isinstance(s, bytes): s = s.decode('utf8') except: pass diff --git a/src/world.py b/src/world.py index a748b2339..0a8b1db0e 100644 --- a/src/world.py +++ b/src/world.py @@ -173,7 +173,7 @@ def upkeep(): #if registryFilename is not None: # registry.open(registryFilename) if not dying: - if sys.version_info[0] < 3: + if minisix.PY2: log.debug('Regexp cache size: %s', len(re._cache)) log.debug('Pattern cache size: %s', len(ircutils._patternCache)) log.debug('HostmaskPatternEqual cache size: %s', diff --git a/test/test_callbacks.py b/test/test_callbacks.py index ad0cee3aa..160f63b26 100644 --- a/test/test_callbacks.py +++ b/test/test_callbacks.py @@ -33,6 +33,7 @@ from supybot.test import * import supybot.conf as conf import supybot.utils as utils import supybot.ircmsgs as ircmsgs +import supybot.minisix as minisix import supybot.callbacks as callbacks tokenize = callbacks.tokenize @@ -76,7 +77,7 @@ class TokenizerTestCase(SupyTestCase): def testUnicode(self): self.assertEqual(tokenize(u'好'), [u'好']) self.assertEqual(tokenize(u'"好"'), [u'好'])""" - if sys.version_info[0] >= 3: + if minisix.PY3: _testUnicode = _testUnicode.replace("u'", "'") exec(_testUnicode) diff --git a/test/test_commands.py b/test/test_commands.py index b54f1d3ec..475e2b10f 100644 --- a/test/test_commands.py +++ b/test/test_commands.py @@ -37,6 +37,7 @@ from supybot.commands import * import supybot.conf as conf import supybot.irclib as irclib import supybot.ircmsgs as ircmsgs +import supybot.minisix as minisix import supybot.callbacks as callbacks @@ -88,7 +89,7 @@ class GeneralContextTestCase(CommandsTestCase): finally: conf.supybot.protocols.irc.strictRfc.setValue(strict) - if sys.version_info[0] < 3: + if minisix.PY2: def testSpecLong(self): self.assertState(['long'], ['1'], [long(1)]) self.assertState(['long', 'long', 'long'], ['1', '2', '3'], diff --git a/test/test_firewall.py b/test/test_firewall.py index b8b638a65..1d285021e 100644 --- a/test/test_firewall.py +++ b/test/test_firewall.py @@ -29,6 +29,7 @@ from supybot.test import * from supybot import log +import supybot.minisix as minisix class FirewallTestCase(SupyTestCase): def setUp(self): @@ -46,7 +47,7 @@ class C(%s pass def foo(self): raise self.MyException()""" % - ('metaclass=log.MetaFirewall):\n' if sys.version_info[0] >= 3 else + ('metaclass=log.MetaFirewall):\n' if minisix.PY3 else 'object):\n __metaclass__ = log.MetaFirewall')) def testCFooDoesNotRaise(self): diff --git a/test/test_utils.py b/test/test_utils.py index fdf9a36c3..0e7e1f792 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -35,6 +35,7 @@ import time import pickle import supybot.utils as utils from supybot.utils.structures import * +import supybot.minisix as minisix if sys.version_info[0] >= 0: xrange = range @@ -130,7 +131,7 @@ class GenTest(SupyTestCase): self.assertEqual(list(AL.items()), [(1, 2), (2, 3), (3, 4)]) self.assertEqual(list(AL.items()), [(1, 2), (2, 3), (3, 4)]) self.assertEqual(list(AL.keys()), [1, 2, 3]) - if sys.version_info[0] < 3: + if minisix.PY2: self.assertEqual(list(AL.keys()), [1, 2, 3]) self.assertEqual(AL.values(), [2, 3, 4]) self.assertEqual(list(AL.values()), [2, 3, 4])