From 62d312338dec072be5adeac9c5830a752941ec08 Mon Sep 17 00:00:00 2001 From: Quantum Date: Sun, 13 Aug 2017 19:11:40 -0400 Subject: [PATCH] Add Python 3 support. --- optimize_later/config.py | 6 ++---- optimize_later/core.py | 6 ++---- optimize_later/tests.py | 4 ++-- optimize_later/utils.py | 16 +++++++++++++++- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/optimize_later/config.py b/optimize_later/config.py index db15cb8..c13c68d 100644 --- a/optimize_later/config.py +++ b/optimize_later/config.py @@ -1,7 +1,7 @@ import logging from functools import wraps -from optimize_later.utils import NoArgDecoratorMeta +from optimize_later.utils import NoArgDecoratorMeta, with_metaclass try: import threading @@ -38,9 +38,7 @@ def global_callback(report): log.exception('Failed to invoke global callback: %r', callback) -class optimize_context(object): - __metaclass__ = NoArgDecoratorMeta - +class optimize_context(with_metaclass(NoArgDecoratorMeta)): def __init__(self, callbacks=None): self.callbacks = callbacks diff --git a/optimize_later/core.py b/optimize_later/core.py index 528b2ff..9f9bd16 100644 --- a/optimize_later/core.py +++ b/optimize_later/core.py @@ -7,7 +7,7 @@ from functools import wraps from numbers import Number from optimize_later.config import global_callback -from optimize_later.utils import NoArgDecoratorMeta +from optimize_later.utils import NoArgDecoratorMeta, with_metaclass log = logging.getLogger(__name__.rpartition('.')[0] or __name__) timer = [time.time, time.clock][os.name == 'nt'] @@ -89,9 +89,7 @@ class OptimizeReport(object): return self.short() -class optimize_later(object): - __metaclass__ = NoArgDecoratorMeta - +class optimize_later(with_metaclass(NoArgDecoratorMeta)): def __init__(self, name=None, limit=None, callback=None): if limit is None and isinstance(name, Number): name, limit = None, name diff --git a/optimize_later/tests.py b/optimize_later/tests.py index 72316d7..81a0173 100644 --- a/optimize_later/tests.py +++ b/optimize_later/tests.py @@ -162,7 +162,7 @@ class OptimizeLaterTest(TestCase): self.assertEqual(len(reports), 1) self.assertReport(reports[0], blocks=2) report = reports[0].long() - print report + print(report) self.assertIn(' - Block ', report) self.assertIn(' - Block', report) self.assertEqual(report.count(', children:'), 2) @@ -177,7 +177,7 @@ class OptimizeLaterTest(TestCase): self.assertEqual(function.__name__, 'function') self.assertEqual(function.__module__, __name__) - for i in xrange(10): + for i in range(10): function() self.assertEqual(len(reports), 10) for report in reports: diff --git a/optimize_later/utils.py b/optimize_later/utils.py index e6b8da4..dfbd280 100644 --- a/optimize_later/utils.py +++ b/optimize_later/utils.py @@ -5,4 +5,18 @@ class NoArgDecoratorMeta(type): def __call__(cls, *args, **kwargs): if len(args) == 1 and isinstance(args[0], FunctionType): return cls()(args[0]) - return super(NoArgDecoratorMeta, cls).__call__(*args, **kwargs) \ No newline at end of file + return super(NoArgDecoratorMeta, cls).__call__(*args, **kwargs) + + +# Borrowed from the six library. +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + return type.__new__(metaclass, 'temporary_class', (), {})