From 7a5ec3f7cc62735b0cd5f3645df72c0ff49d839a Mon Sep 17 00:00:00 2001 From: Shawn Nock Date: Thu, 27 Oct 2016 11:43:21 -0400 Subject: [PATCH] Initial support for Python 3.5 --- setup.py | 4 +-- test/test_pool.py | 69 ++++++++++++++++++++++++---------------------- tox.ini | 11 ++------ txpool/__init__.py | 1 + txpool/pool.py | 16 ++++++----- txpool/worker.py | 11 +++++--- 6 files changed, 58 insertions(+), 54 deletions(-) diff --git a/setup.py b/setup.py index 4dca4f1..59ba5ac 100644 --- a/setup.py +++ b/setup.py @@ -18,10 +18,10 @@ def read(relpath): author_email='escattone@gmail.com', url='https://github.com/escattone/txpool', packages=['txpool'], - install_requires=['twisted>=12'], + install_requires=['twisted>=12', 'six>=1.10'], classifiers=[ 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 2 :: Only', + 'Programming Language :: Python :: 3.5', 'Development Status :: 4 - Beta', 'Natural Language :: English', 'Framework :: Twisted', diff --git a/test/test_pool.py b/test/test_pool.py index 927f078..1bd9497 100644 --- a/test/test_pool.py +++ b/test/test_pool.py @@ -21,6 +21,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +from __future__ import absolute_import import os import re import math @@ -35,6 +36,8 @@ import txpool.pool from txpool import Pool, cpu_count from txpool import PoolError, PoolTimeout +from six.moves import map +from six.moves import range @pytest.inlineCallbacks @@ -47,7 +50,7 @@ def test_pool_1(): try: result = yield pool.on_ready(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == pool.size @@ -69,19 +72,19 @@ def test_pool_1(): try: result = yield pool.apply_async('math.sqrt', (-1,), timeout=5) - except Exception, e: + except Exception as e: result = e assert isinstance(result, PoolError) try: result = yield pool.apply_async(os.path.isdir, directory, timeout=5) - except Exception, e: + except Exception as e: result = e assert result is True try: result = yield pool.close(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == 0 @@ -104,7 +107,7 @@ def test_pool_2(tmpdir): try: result = yield pool.on_ready(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == pool.size @@ -115,7 +118,7 @@ def test_pool_2(tmpdir): try: result = yield pool.close(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == 0 @@ -153,14 +156,14 @@ def test_pool_3(): try: result = yield pool.on_ready(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == pool.size try: result = yield pool.terminate(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == 0 @@ -172,7 +175,7 @@ def test_pool_3(): try: result = yield pool.on_ready(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == pool.size @@ -181,7 +184,7 @@ def test_pool_3(): try: result = yield pool.on_closure(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == 0 @@ -197,25 +200,25 @@ def test_pool_4(): try: result = yield pool.on_ready(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == pool.size deferreds = [] - for _ in xrange(100): + for _ in range(100): deferreds.append(pool.apply_async('os.listdir', ('....',))) for d in deferreds: try: result = yield d - except Exception, e: + except Exception as e: result = e assert isinstance(result, PoolError) try: result = yield pool.close(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == 0 @@ -231,14 +234,14 @@ def test_pool_5(): try: result = yield pool.on_ready(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == pool.size deferreds = [] cancelleds = set() - args = range(1000) + range(-200, 0) + args = list(range(300)) + list(range(-200, 0)) random.shuffle(args) for i, arg in enumerate(args): @@ -251,7 +254,7 @@ def test_pool_5(): for arg, d in deferreds: try: result = yield d - except Exception, e: + except Exception as e: result = e if arg in cancelleds: @@ -263,7 +266,7 @@ def test_pool_5(): try: result = yield pool.apply_async('time.sleep', (3,), timeout=1) - except Exception, e: + except Exception as e: result = e assert isinstance(result, PoolTimeout) @@ -271,7 +274,7 @@ def test_pool_5(): try: result = yield pool.on_closure(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == 0 @@ -287,7 +290,7 @@ def test_pool_6(): try: result = yield pool.on_ready(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == pool.size @@ -298,13 +301,13 @@ def test_pool_6(): try: result = yield d - except Exception, e: + except Exception as e: result = e assert isinstance(result, CancelledError) try: result = yield pool.close(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == 0 @@ -320,7 +323,7 @@ def test_pool_7(): try: result = yield pool.on_ready(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == pool.size @@ -334,20 +337,20 @@ def test_pool_7(): # Try "apply_async" after closing. try: result = yield pool.apply_async(int, ('1011',), dict(base=2)) - except Exception, e: + except Exception as e: result = e assert isinstance(result, PoolError) # Try "on_ready" after closing. try: result = yield pool.on_ready(timeout=5) - except Exception, e: + except Exception as e: result = e assert isinstance(result, PoolError) try: result = yield pool.on_closure(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == 0 @@ -355,7 +358,7 @@ def test_pool_7(): # Call again after pool has closed. try: result = yield pool.on_closure() - except Exception, e: + except Exception as e: result = e assert result is pool @@ -363,13 +366,13 @@ def test_pool_7(): def test_pool_8(): try: pool = Pool(size=0, name='test8') - except Exception, e: + except Exception as e: pool = e assert isinstance(pool, ValueError) try: pool = Pool(size=-10, name='test8') - except Exception, e: + except Exception as e: pool = e assert isinstance(pool, ValueError) @@ -384,7 +387,7 @@ def test_pool_9(): try: result = yield pool.on_ready(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == pool.size @@ -392,7 +395,7 @@ def test_pool_9(): # This will timeout as we haven't called "close". try: result = yield pool.on_closure(timeout=2) - except Exception, e: + except Exception as e: result = e assert isinstance(result, PoolTimeout) @@ -402,7 +405,7 @@ def test_pool_9(): # again. try: result = yield pool.on_ready(timeout=2) - except Exception, e: + except Exception as e: result = e assert isinstance(result, PoolTimeout) assert pool.get_number_of_workers() == 0 @@ -416,7 +419,7 @@ def test_pool_10(): try: result = yield pool.on_ready(timeout=5) - except Exception, e: + except Exception as e: result = e assert result is pool assert pool.get_number_of_workers() == pool.size diff --git a/tox.ini b/tox.ini index 77d08f0..8fc5872 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py27, pypy, flake8 +envlist = py27, py35, pypy, flake8 [testenv] commands = py.test --cov={envsitepackagesdir}/txpool \ @@ -12,13 +12,8 @@ deps = pytest-cov pytest-twisted -[testenv:py27] -basepython = python2.7 - -[testenv:pypy] -basepython = pypy - [testenv:flake8] deps = flake8 -basepython = python2.7 +skip_install = true +basepython = python3 commands = flake8 txpool diff --git a/txpool/__init__.py b/txpool/__init__.py index 5904b99..1603f8e 100644 --- a/txpool/__init__.py +++ b/txpool/__init__.py @@ -1,4 +1,5 @@ # flake8: noqa +from __future__ import absolute_import from txpool.pool import cpu_count, Pool, PoolError, PoolTimeout diff --git a/txpool/pool.py b/txpool/pool.py index d191683..e470e12 100644 --- a/txpool/pool.py +++ b/txpool/pool.py @@ -21,12 +21,13 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -__all__ = ['Pool', 'PoolError', 'PoolTimeout', 'cpu_count'] - +from __future__ import absolute_import +import six +from six.moves import range import os import sys -import cPickle as pickle +import six.moves.cPickle as pickle from collections import deque from logging import INFO, ERROR from multiprocessing import cpu_count @@ -34,6 +35,7 @@ from twisted.internet.protocol import ProcessProtocol from twisted.internet.defer import succeed, fail, Deferred +__all__ = ['Pool', 'PoolError', 'PoolTimeout', 'cpu_count'] DEFAULT_POOL_SIZE = 2 @@ -205,7 +207,7 @@ def get_log(self): return '\n'.join(self._log_lines or ()) def __repr__(self): - if isinstance(self.call, basestring): + if isinstance(self.call, six.string_types): name = self.call else: name = repr(self.call) @@ -215,7 +217,7 @@ def args(): for arg in self.args: yield repr(arg) if self.kwargs: - for item in self.kwargs.iteritems(): + for item in six.iteritems(self.kwargs): yield '%s=%r' % item return ('<%s object at %#x: %s(%s)>' % @@ -258,7 +260,7 @@ def __init__(self, pool, size=None, init_call=None, init_args=None, self.size = size - for _ in xrange(size): + for _ in range(size): self.start_worker() def is_ready(self): @@ -538,7 +540,7 @@ def __init__(self, call): self.remains = '' def add(self, text): - lines = (self.remains + text).splitlines() + lines = (self.remains + text.decode('latin-1')).splitlines() self.remains = lines.pop(-1) for line in lines: diff --git a/txpool/worker.py b/txpool/worker.py index 8f5f169..d02086b 100644 --- a/txpool/worker.py +++ b/txpool/worker.py @@ -22,8 +22,9 @@ # SOFTWARE. import os +import six import sys -import cPickle as pickle +import six.moves.cPickle as pickle try: import fcntl @@ -119,10 +120,10 @@ def main(): break if obj is None: - print 'Stopping' + print('Stopping') break - if isinstance(obj, basestring): + if isinstance(obj, six.string_types): call = import_callable(obj) elif callable(obj): call = obj @@ -130,7 +131,9 @@ def main(): args, kw = obj result = call(*(args or ()), **(kw or {})) pickled = pickle.dumps(result) - out_safe.write('%d:%s,' % (len(pickled), pickled)) + out_safe.write((u'{}:{},'.format( + len(pickled), + pickled.decode('latin-1'))).encode('latin-1')) out_safe.flush() if __name__ == '__main__':