Browse Source

Removes more Py2 compatibility stuff

Ask Solem 9 years ago
parent
commit
5597237ba3

+ 0 - 23
celery/app/amqp.py

@@ -3,7 +3,6 @@
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
 import numbers
 import numbers
-import sys
 
 
 from collections import Mapping, namedtuple
 from collections import Mapping, namedtuple
 from datetime import timedelta
 from datetime import timedelta
@@ -16,7 +15,6 @@ from kombu.utils import cached_property
 from kombu.utils.functional import maybe_list
 from kombu.utils.functional import maybe_list
 
 
 from celery import signals
 from celery import signals
-from celery.local import try_import
 from celery.utils.nodenames import anon_nodename
 from celery.utils.nodenames import anon_nodename
 from celery.utils.saferepr import saferepr
 from celery.utils.saferepr import saferepr
 from celery.utils.text import indent as textindent
 from celery.utils.text import indent as textindent
@@ -26,14 +24,9 @@ from . import routes as _routes
 
 
 __all__ = ['AMQP', 'Queues', 'task_message']
 __all__ = ['AMQP', 'Queues', 'task_message']
 
 
-PY3 = sys.version_info[0] == 3
-
 #: earliest date supported by time.mktime.
 #: earliest date supported by time.mktime.
 INT_MIN = -2147483648
 INT_MIN = -2147483648
 
 
-# json in Python 2.7 borks if dict contains byte keys.
-JSON_NEEDS_UNICODE_KEYS = not PY3 and not try_import('simplejson')
-
 #: Human readable queue declaration.
 #: Human readable queue declaration.
 QUEUE_FORMAT = """
 QUEUE_FORMAT = """
 .> {0.name:<16} exchange={0.exchange.name}({0.exchange.type}) \
 .> {0.name:<16} exchange={0.exchange.name}({0.exchange.type}) \
@@ -329,14 +322,6 @@ class AMQP:
         if kwargsrepr is None:
         if kwargsrepr is None:
             kwargsrepr = saferepr(kwargs, self.kwargsrepr_maxsize)
             kwargsrepr = saferepr(kwargs, self.kwargsrepr_maxsize)
 
 
-        if JSON_NEEDS_UNICODE_KEYS:  # pragma: no cover
-            if callbacks:
-                callbacks = [utf8dict(callback) for callback in callbacks]
-            if errbacks:
-                errbacks = [utf8dict(errback) for errback in errbacks]
-            if chord:
-                chord = utf8dict(chord)
-
         return task_message(
         return task_message(
             headers={
             headers={
                 'lang': 'py',
                 'lang': 'py',
@@ -409,14 +394,6 @@ class AMQP:
         eta = eta and eta.isoformat()
         eta = eta and eta.isoformat()
         expires = expires and expires.isoformat()
         expires = expires and expires.isoformat()
 
 
-        if JSON_NEEDS_UNICODE_KEYS:  # pragma: no cover
-            if callbacks:
-                callbacks = [utf8dict(callback) for callback in callbacks]
-            if errbacks:
-                errbacks = [utf8dict(errback) for errback in errbacks]
-            if chord:
-                chord = utf8dict(chord)
-
         return task_message(
         return task_message(
             headers={},
             headers={},
             properties={
             properties={

+ 0 - 2
celery/backends/base.py

@@ -42,7 +42,6 @@ from celery.utils.serialization import (
 __all__ = ['BaseBackend', 'KeyValueStoreBackend', 'DisabledBackend']
 __all__ = ['BaseBackend', 'KeyValueStoreBackend', 'DisabledBackend']
 
 
 EXCEPTION_ABLE_CODECS = frozenset({'pickle'})
 EXCEPTION_ABLE_CODECS = frozenset({'pickle'})
-PY3 = sys.version_info >= (3, 0)
 
 
 logger = get_logger(__name__)
 logger = get_logger(__name__)
 
 
@@ -244,7 +243,6 @@ class Backend:
         return self.meta_from_decoded(self.decode(payload))
         return self.meta_from_decoded(self.decode(payload))
 
 
     def decode(self, payload):
     def decode(self, payload):
-        payload = PY3 and payload or str(payload)
         return loads(payload,
         return loads(payload,
                      content_type=self.content_type,
                      content_type=self.content_type,
                      content_encoding=self.content_encoding,
                      content_encoding=self.content_encoding,

+ 2 - 8
celery/backends/cache.py

@@ -2,8 +2,6 @@
 """Memcached and in-memory cache result backend."""
 """Memcached and in-memory cache result backend."""
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
-import sys
-
 from kombu.utils import cached_property
 from kombu.utils import cached_property
 from kombu.utils.encoding import bytes_to_str, ensure_bytes
 from kombu.utils.encoding import bytes_to_str, ensure_bytes
 
 
@@ -16,8 +14,6 @@ __all__ = ['CacheBackend']
 
 
 _imp = [None]
 _imp = [None]
 
 
-PY3 = sys.version_info[0] == 3
-
 REQUIRES_BACKEND = """\
 REQUIRES_BACKEND = """\
 The Memcached backend requires either pylibmc or python-memcached.\
 The Memcached backend requires either pylibmc or python-memcached.\
 """
 """
@@ -30,7 +26,7 @@ Please use one of the following backends instead: {1}\
 
 
 def import_best_memcache():
 def import_best_memcache():
     if _imp[0] is None:
     if _imp[0] is None:
-        is_pylibmc, memcache_key_t = False, ensure_bytes
+        is_pylibmc = False
         try:
         try:
             import pylibmc as memcache
             import pylibmc as memcache
             is_pylibmc = True
             is_pylibmc = True
@@ -39,9 +35,7 @@ def import_best_memcache():
                 import memcache  # noqa
                 import memcache  # noqa
             except ImportError:
             except ImportError:
                 raise ImproperlyConfigured(REQUIRES_BACKEND)
                 raise ImproperlyConfigured(REQUIRES_BACKEND)
-        if PY3:  # pragma: no cover
-            memcache_key_t = bytes_to_str
-        _imp[0] = (is_pylibmc, memcache, memcache_key_t)
+        _imp[0] = (is_pylibmc, memcache, bytes_to_str)
     return _imp[0]
     return _imp[0]
 
 
 
 

+ 3 - 6
celery/backends/cassandra.py

@@ -2,7 +2,6 @@
 """Apache Cassandra result store backend using the DataStax driver."""
 """Apache Cassandra result store backend using the DataStax driver."""
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
-import sys
 try:  # pragma: no cover
 try:  # pragma: no cover
     import cassandra
     import cassandra
     import cassandra.auth
     import cassandra.auth
@@ -58,11 +57,9 @@ Q_EXPIRES = """
     USING TTL {0}
     USING TTL {0}
 """
 """
 
 
-if sys.version_info[0] == 3:
-    def buf_t(x):
-        return bytes(x, 'utf8')
-else:
-    buf_t = buffer  # noqa
+
+def buf_t(x):
+    return bytes(x, 'utf8')
 
 
 
 
 class CassandraBackend(BaseBackend):
 class CassandraBackend(BaseBackend):

+ 4 - 11
celery/backends/riak.py

@@ -2,8 +2,6 @@
 """Riak result store backend."""
 """Riak result store backend."""
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
-import sys
-
 try:
 try:
     import riak
     import riak
     from riak import RiakClient
     from riak import RiakClient
@@ -21,18 +19,13 @@ E_BUCKET_NAME = """\
 Riak bucket names must be composed of ASCII characters only, not: {0!r}\
 Riak bucket names must be composed of ASCII characters only, not: {0!r}\
 """
 """
 
 
-if sys.version_info[0] == 3:
-
-    def to_bytes(s):
-        return s.encode() if isinstance(s, str) else s
 
 
-    def str_decode(s, encoding):
-        return to_bytes(s).decode(encoding)
+def to_bytes(s):
+    return s.encode() if isinstance(s, str) else s
 
 
-else:
 
 
-    def str_decode(s, encoding):
-        return s.decode('ascii')
+def str_decode(s, encoding):
+    return to_bytes(s).decode(encoding)
 
 
 
 
 def is_ascii(s):
 def is_ascii(s):

+ 1 - 1
celery/bin/multi.py

@@ -467,7 +467,7 @@ def _args_for_node(p, name, prefix, suffix, cmd, append, options):
 
 
     argv = ([expand(cmd)] +
     argv = ([expand(cmd)] +
             [format_opt(opt, expand(value))
             [format_opt(opt, expand(value))
-                for opt, value in p.optmerge(ns, options).items())] +
+                for opt, value in p.optmerge(ns, options).items()] +
             [p.passthrough])
             [p.passthrough])
     if append:
     if append:
         argv.append(expand(append))
         argv.append(expand(append))

+ 0 - 13
celery/canvas.py

@@ -7,8 +7,6 @@
 """
 """
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
-import sys
-
 from collections import MutableSequence, deque
 from collections import MutableSequence, deque
 from copy import deepcopy
 from copy import deepcopy
 from functools import partial as _partial, reduce
 from functools import partial as _partial, reduce
@@ -19,7 +17,6 @@ from kombu.utils import cached_property, fxrange, reprcall, uuid
 from vine import barrier
 from vine import barrier
 
 
 from celery._state import current_app
 from celery._state import current_app
-from celery.local import try_import
 from celery.result import GroupResult
 from celery.result import GroupResult
 from celery.utils import abstract
 from celery.utils import abstract
 from celery.utils.functional import (
 from celery.utils.functional import (
@@ -32,11 +29,6 @@ __all__ = [
     'group', 'chord', 'signature', 'maybe_signature',
     'group', 'chord', 'signature', 'maybe_signature',
 ]
 ]
 
 
-PY3 = sys.version_info[0] == 3
-
-# json in Python 2.7 borks if dict contains byte keys.
-JSON_NEEDS_UNICODE_KEYS = PY3 and not try_import('simplejson')
-
 
 
 class _getitem_property:
 class _getitem_property:
     """Attribute -> dict key descriptor.
     """Attribute -> dict key descriptor.
@@ -455,11 +447,6 @@ class Signature(dict):
     def __repr__(self):
     def __repr__(self):
         return self.reprcall()
         return self.reprcall()
 
 
-    if JSON_NEEDS_UNICODE_KEYS:  # pragma: no cover
-        def items(self):
-            for k, v in dict.items(self):
-                yield k.decode() if isinstance(k, bytes) else k, v
-
     @property
     @property
     def name(self):
     def name(self):
         # for duck typing compatibility with Task.name
         # for duck typing compatibility with Task.name

+ 1 - 9
celery/concurrency/asynpool.py

@@ -21,7 +21,6 @@ import os
 import select
 import select
 import socket
 import socket
 import struct
 import struct
-import sys
 import time
 import time
 
 
 from collections import Counter, deque, namedtuple
 from collections import Counter, deque, namedtuple
@@ -50,14 +49,7 @@ try:
     from struct import unpack_from as _unpack_from
     from struct import unpack_from as _unpack_from
     memoryview = memoryview
     memoryview = memoryview
     readcanbuf = True
     readcanbuf = True
-
-    if sys.version_info[0] == 2 and sys.version_info < (2, 7, 6):
-
-        def unpack_from(fmt, view, _unpack_from=_unpack_from):  # noqa
-            return _unpack_from(fmt, view.tobytes())  # <- memoryview
-    else:
-        # unpack_from supports memoryview in 2.7.6 and 3.3+
-        unpack_from = _unpack_from  # noqa
+    unpack_from = _unpack_from  # noqa
 
 
 except (ImportError, NameError):  # pragma: no cover
 except (ImportError, NameError):  # pragma: no cover
 
 

+ 2 - 15
celery/five.py

@@ -15,7 +15,6 @@ from vine.five import __all__ as _all_five
 
 
 # bloody flake8
 # bloody flake8
 items = five.items
 items = five.items
-bytes_if_py2 = five.bytes_if_py2
 string_t = five.string_t
 string_t = five.string_t
 
 
 try:
 try:
@@ -43,15 +42,6 @@ The module %s is deprecated and will be removed in a future version.
 
 
 DEFAULT_ATTRS = {'__file__', '__path__', '__doc__', '__all__'}
 DEFAULT_ATTRS = {'__file__', '__path__', '__doc__', '__all__'}
 
 
-# im_func is no longer available in Py3.
-# instead the unbound method itself can be used.
-if sys.version_info[0] == 3:  # pragma: no cover
-    def fun_of_method(method):
-        return method
-else:
-    def fun_of_method(method):  # noqa
-        return method.im_func
-
 
 
 def getappattr(path):
 def getappattr(path):
     """Gets attribute from the current_app recursively,
     """Gets attribute from the current_app recursively,
@@ -134,7 +124,7 @@ class class_property:
 
 
 
 
 def reclassmethod(method):
 def reclassmethod(method):
-    return classmethod(fun_of_method(method))
+    return classmethod(method)
 
 
 
 
 class LazyModule(ModuleType):
 class LazyModule(ModuleType):
@@ -173,8 +163,7 @@ def create_module(name, attrs, cls_attrs=None, pkg=None,
         attr_name: (prepare_attr(attr) if prepare_attr else attr)
         attr_name: (prepare_attr(attr) if prepare_attr else attr)
         for attr_name, attr in items(attrs)
         for attr_name, attr in items(attrs)
     }
     }
-    module = sys.modules[fqdn] = type(
-        bytes_if_py2(modname), (base,), cls_attrs)(bytes_if_py2(name))
+    module = sys.modules[fqdn] = type(modname, (base,), cls_attrs)(name)
     module.__dict__.update(attrs)
     module.__dict__.update(attrs)
     return module
     return module
 
 
@@ -189,8 +178,6 @@ def recreate_module(name, compat_modules=(), by_module={}, direct={},
         operator.add,
         operator.add,
         [tuple(v) for v in [compat_modules, origins, direct, attrs]],
         [tuple(v) for v in [compat_modules, origins, direct, attrs]],
     )))
     )))
-    if sys.version_info[0] < 3:
-        _all = [s.encode() for s in _all]
     cattrs = dict(
     cattrs = dict(
         _compat_modules=compat_modules,
         _compat_modules=compat_modules,
         _all_by_module=by_module, _direct=direct,
         _all_by_module=by_module, _direct=direct,

+ 1 - 6
celery/fixups/django.py

@@ -9,17 +9,12 @@ from kombu.utils import cached_property, symbol_by_name
 
 
 from datetime import datetime
 from datetime import datetime
 from importlib import import_module
 from importlib import import_module
+from io import StringIO
 
 
 from celery import signals
 from celery import signals
 from celery.app import default_app
 from celery.app import default_app
 from celery.exceptions import FixupWarning
 from celery.exceptions import FixupWarning
 
 
-if sys.version_info[0] < 3 and not hasattr(sys, 'pypy_version_info'):
-    from StringIO import StringIO
-else:  # pragma: no cover
-    from io import StringIO
-
-
 __all__ = ['DjangoFixup', 'fixup']
 __all__ = ['DjangoFixup', 'fixup']
 
 
 ERR_NOT_INSTALLED = """\
 ERR_NOT_INSTALLED = """\

+ 3 - 2
celery/loaders/base.py

@@ -158,8 +158,9 @@ class BaseLoader:
             self.find_module(name)
             self.find_module(name)
         except NotAPackage:
         except NotAPackage:
             if name.endswith('.py'):
             if name.endswith('.py'):
-                 raise NotAPackage(CONFIG_WITH_SUFFIX.format(
-                    module=name, suggest=name[:-3])).with_traceback(sys.exc_info()[2])
+                raise NotAPackage(CONFIG_WITH_SUFFIX.format(
+                    module=name, suggest=name[:-3])
+                ).with_traceback(sys.exc_info()[2])
             raise NotAPackage(CONFIG_INVALID_NAME.format(
             raise NotAPackage(CONFIG_INVALID_NAME.format(
                 module=name)).with_traceback(sys.exc_info()[2])
                 module=name)).with_traceback(sys.exc_info()[2])
         else:
         else:

+ 0 - 17
celery/local.py

@@ -9,14 +9,11 @@ Parts of this module is Copyright by Werkzeug Team.
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
 import importlib
 import importlib
-import sys
 
 
 __all__ = ['Proxy', 'PromiseProxy', 'try_import', 'maybe_evaluate']
 __all__ = ['Proxy', 'PromiseProxy', 'try_import', 'maybe_evaluate']
 
 
 __module__ = __name__  # used by Proxy class body
 __module__ = __name__  # used by Proxy class body
 
 
-PY3 = sys.version_info[0] == 3
-
 
 
 def _default_cls_attr(name, type_, cls_value):
 def _default_cls_attr(name, type_, cls_value):
     # Proxy uses properties to forward the standard
     # Proxy uses properties to forward the standard
@@ -124,7 +121,6 @@ class Proxy:
             return bool(self._get_current_object())
             return bool(self._get_current_object())
         except RuntimeError:  # pragma: no cover
         except RuntimeError:  # pragma: no cover
             return False
             return False
-    __nonzero__ = __bool__  # Py2
 
 
     def __dir__(self):
     def __dir__(self):
         try:
         try:
@@ -281,19 +277,6 @@ class Proxy:
     def __reduce__(self):
     def __reduce__(self):
         return self._get_current_object().__reduce__()
         return self._get_current_object().__reduce__()
 
 
-    if not PY3:  # pragma: no cover
-        def __cmp__(self, other):
-            return cmp(self._get_current_object(), other)  # noqa
-
-        def __long__(self):
-            return long(self._get_current_object())  # noqa
-
-        def __unicode__(self):
-            try:
-                return str(self._get_current_object())
-            except RuntimeError:  # pragma: no cover
-                return repr(self)
-
 
 
 class PromiseProxy(Proxy):
 class PromiseProxy(Proxy):
     """This is a proxy to an object that has not yet been evaulated.
     """This is a proxy to an object that has not yet been evaulated.

+ 0 - 1
celery/result.py

@@ -827,7 +827,6 @@ class GroupResult(ResultSet):
 
 
     def __bool__(self):
     def __bool__(self):
         return bool(self.id or self.results)
         return bool(self.id or self.results)
-    __nonzero__ = __bool__  # Included for Py2 backwards compatibility
 
 
     def __eq__(self, other):
     def __eq__(self, other):
         if isinstance(other, GroupResult):
         if isinstance(other, GroupResult):

+ 1 - 5
celery/security/serialization.py

@@ -2,8 +2,6 @@
 """Secure serializer."""
 """Secure serializer."""
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
-import sys
-
 from kombu.serialization import registry, dumps, loads
 from kombu.serialization import registry, dumps, loads
 from kombu.utils.encoding import bytes_to_str, str_to_bytes, ensure_bytes
 from kombu.utils.encoding import bytes_to_str, str_to_bytes, ensure_bytes
 
 
@@ -15,8 +13,6 @@ from .utils import reraise_errors
 
 
 __all__ = ['SecureSerializer', 'register_auth']
 __all__ = ['SecureSerializer', 'register_auth']
 
 
-PY3 = sys.version_info[0] == 3
-
 
 
 class SecureSerializer:
 class SecureSerializer:
 
 
@@ -25,7 +21,7 @@ class SecureSerializer:
         self._key = key
         self._key = key
         self._cert = cert
         self._cert = cert
         self._cert_store = cert_store
         self._cert_store = cert_store
-        self._digest = str_to_bytes(digest) if not PY3 else digest
+        self._digest = digest
         self._serializer = serializer
         self._serializer = serializer
 
 
     def serialize(self, data):
     def serialize(self, data):

+ 1 - 1
celery/tests/__init__.py

@@ -7,7 +7,7 @@ import warnings
 
 
 from importlib import import_module
 from importlib import import_module
 
 
-PYPY3 = getattr(sys, 'pypy_version_info', None) and sys.version_info[0] > 3
+PYPY3 = getattr(sys, 'pypy_version_info', None)
 
 
 try:
 try:
     WindowsError = WindowsError  # noqa
     WindowsError = WindowsError  # noqa

+ 4 - 2
celery/tests/app/test_defaults.py

@@ -45,8 +45,10 @@ class test_defaults(AppCase):
         self.assertFalse(any(key.islower() for key in _TO_NEW_KEY))
         self.assertFalse(any(key.islower() for key in _TO_NEW_KEY))
         self.assertFalse(any(key.isupper() for key in SETTING_KEYS))
         self.assertFalse(any(key.isupper() for key in SETTING_KEYS))
         self.assertFalse(any(key.islower() for key in _OLD_SETTING_KEYS))
         self.assertFalse(any(key.islower() for key in _OLD_SETTING_KEYS))
-        self.assertFalse(any(value.isupper() for value in _TO_NEW_KEY.values()))
-        self.assertFalse(any(value.islower() for value in _TO_OLD_KEY.values()))
+        self.assertFalse(any(
+            value.isupper() for value in _TO_NEW_KEY.values()))
+        self.assertFalse(
+            any(value.islower() for value in _TO_OLD_KEY.values()))
 
 
         for key in _TO_NEW_KEY:
         for key in _TO_NEW_KEY:
             self.assertIn(key, _OLD_SETTING_KEYS)
             self.assertIn(key, _OLD_SETTING_KEYS)

+ 2 - 17
celery/tests/app/test_log.py

@@ -22,7 +22,7 @@ from celery.utils.log import (
 )
 )
 
 
 from case.utils import get_logger_handlers
 from case.utils import get_logger_handlers
-from celery.tests.case import AppCase, Mock, mock, patch, skip
+from celery.tests.case import AppCase, Mock, mock, patch
 
 
 
 
 class test_TaskFormatter(AppCase):
 class test_TaskFormatter(AppCase):
@@ -111,8 +111,6 @@ class test_ColorFormatter(AppCase):
             raise Exception()
             raise Exception()
         except Exception:
         except Exception:
             self.assertTrue(x.formatException(sys.exc_info()))
             self.assertTrue(x.formatException(sys.exc_info()))
-        if sys.version_info[0] == 2:
-            safe_str.assert_called()
 
 
     @patch('logging.Formatter.format')
     @patch('logging.Formatter.format')
     def test_format_object(self, _format):
     def test_format_object(self, _format):
@@ -154,17 +152,6 @@ class test_ColorFormatter(AppCase):
         self.assertIn('<Unrepresentable', msg)
         self.assertIn('<Unrepresentable', msg)
         self.assertEqual(safe_str.call_count, 1)
         self.assertEqual(safe_str.call_count, 1)
 
 
-    @skip.if_python3()
-    @patch('celery.utils.log.safe_str')
-    def test_format_raises_no_color(self, safe_str):
-        x = ColorFormatter(use_color=False)
-        record = Mock()
-        record.levelname = 'ERROR'
-        record.msg = 'HELLO'
-        record.exc_text = 'error text'
-        x.format(record)
-        self.assertEqual(safe_str.call_count, 1)
-
 
 
 class test_default_logger(AppCase):
 class test_default_logger(AppCase):
 
 
@@ -252,9 +239,7 @@ class test_default_logger(AppCase):
     @patch('os.fstat')
     @patch('os.fstat')
     def test_setup_logger_no_handlers_file(self, *args):
     def test_setup_logger_no_handlers_file(self, *args):
         tempfile = mktemp(suffix='unittest', prefix='celery')
         tempfile = mktemp(suffix='unittest', prefix='celery')
-        _open = ('builtins.open' if sys.version_info[0] == 3
-                 else '__builtin__.open')
-        with patch(_open) as osopen:
+        with patch('builtins.open') as osopen:
             with mock.restore_logging():
             with mock.restore_logging():
                 files = defaultdict(StringIO)
                 files = defaultdict(StringIO)
 
 

+ 2 - 8
celery/tests/backends/test_base.py

@@ -1,8 +1,5 @@
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
-import sys
-import types
-
 from contextlib import contextmanager
 from contextlib import contextmanager
 
 
 from celery.exceptions import ChordError, TimeoutError
 from celery.exceptions import ChordError, TimeoutError
@@ -23,7 +20,7 @@ from celery.backends.base import (
 from celery.result import result_from_tuple
 from celery.result import result_from_tuple
 from celery.utils.functional import pass1
 from celery.utils.functional import pass1
 
 
-from celery.tests.case import ANY, AppCase, Case, Mock, call, patch, skip
+from celery.tests.case import ANY, AppCase, Case, Mock, call, patch
 
 
 
 
 class wrapobject:
 class wrapobject:
@@ -111,10 +108,7 @@ class test_prepare_exception(AppCase):
         self.assertTrue(str(x))
         self.assertTrue(str(x))
         y = self.b.exception_to_python(x)
         y = self.b.exception_to_python(x)
         self.assertEqual(y.__class__.__name__, 'Impossible')
         self.assertEqual(y.__class__.__name__, 'Impossible')
-        if sys.version_info < (2, 5):
-            self.assertTrue(y.__class__.__module__)
-        else:
-            self.assertEqual(y.__class__.__module__, 'foo.module')
+        self.assertEqual(y.__class__.__module__, 'foo.module')
 
 
     def test_regular(self):
     def test_regular(self):
         self.b.serializer = 'pickle'
         self.b.serializer = 'pickle'

+ 1 - 6
celery/tests/backends/test_cache.py

@@ -14,8 +14,6 @@ from celery.exceptions import ImproperlyConfigured
 
 
 from celery.tests.case import AppCase, Mock, mock, patch, skip
 from celery.tests.case import AppCase, Mock, mock, patch, skip
 
 
-PY3 = sys.version_info[0] == 3
-
 
 
 class SomeClass:
 class SomeClass:
 
 
@@ -149,10 +147,7 @@ class MyMemcachedStringEncodingError(Exception):
 class MemcachedClient(DummyClient):
 class MemcachedClient(DummyClient):
 
 
     def set(self, key, value, *args, **kwargs):
     def set(self, key, value, *args, **kwargs):
-        if PY3:
-            key_t, must_be, not_be, cod = bytes, 'string', 'bytes', 'decode'
-        else:
-            key_t, must_be, not_be, cod = str, 'bytes', 'string', 'encode'
+        key_t, must_be, not_be, cod = bytes, 'string', 'bytes', 'decode'
         if isinstance(key, key_t):
         if isinstance(key, key_t):
             raise MyMemcachedStringEncodingError(
             raise MyMemcachedStringEncodingError(
                 'Keys must be {0}, not {1}.  Convert your '
                 'Keys must be {0}, not {1}.  Convert your '

+ 2 - 11
celery/tests/events/test_state.py

@@ -20,15 +20,6 @@ from celery.events.state import (
 )
 )
 from celery.tests.case import AppCase, Mock, patch, skip
 from celery.tests.case import AppCase, Mock, patch, skip
 
 
-try:
-    Decimal(2.6)
-except TypeError:  # pragma: no cover
-    # Py2.6: Must first convert float to str
-    _float_to_decimal = str
-else:
-    def _float_to_decimal(f):  # noqa
-        return f
-
 
 
 class replay:
 class replay:
 
 
@@ -196,12 +187,12 @@ class test_Worker(AppCase):
 
 
     def test_compatible_with_Decimal(self):
     def test_compatible_with_Decimal(self):
         w = Worker('george@vandelay.com')
         w = Worker('george@vandelay.com')
-        timestamp, local_received = Decimal(_float_to_decimal(time())), time()
+        timestamp, local_received = Decimal(time()), time()
         w.event('worker-online', timestamp, local_received, fields={
         w.event('worker-online', timestamp, local_received, fields={
             'hostname': 'george@vandelay.com',
             'hostname': 'george@vandelay.com',
             'timestamp': timestamp,
             'timestamp': timestamp,
             'local_received': local_received,
             'local_received': local_received,
-            'freq': Decimal(_float_to_decimal(5.6335431)),
+            'freq': Decimal(5.6335431),
         })
         })
         self.assertTrue(w.alive)
         self.assertTrue(w.alive)
 
 

+ 1 - 25
celery/tests/utils/test_local.py

@@ -1,16 +1,12 @@
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
-import sys
-
 from celery.local import (
 from celery.local import (
     Proxy,
     Proxy,
     PromiseProxy,
     PromiseProxy,
     maybe_evaluate,
     maybe_evaluate,
     try_import,
     try_import,
 )
 )
-from celery.tests.case import Case, Mock, skip
-
-PY3 = sys.version_info[0] == 3
+from celery.tests.case import Case, Mock
 
 
 
 
 class test_try_import(Case):
 class test_try_import(Case):
@@ -80,24 +76,6 @@ class test_Proxy(Case):
         with self.assertRaises(AttributeError):
         with self.assertRaises(AttributeError):
             x.__dict__
             x.__dict__
 
 
-    @skip.if_python3()
-    def test_unicode(self):
-
-        class X:
-
-            def __unicode__(self):
-                return 'UNICODE'
-            __str__ = __unicode__
-
-            def __repr__(self):
-                return 'REPR'
-
-        x = Proxy(lambda: X())
-        self.assertEqual(str(x), 'UNICODE')
-        del(X.__unicode__)
-        del(X.__str__)
-        self.assertEqual(str(x), 'REPR')
-
     def test_dir(self):
     def test_dir(self):
 
 
         class X:
         class X:
@@ -168,8 +146,6 @@ class test_Proxy(Case):
         x[0:2] = [1, 2]
         x[0:2] = [1, 2]
         del(x[0:2])
         del(x[0:2])
         self.assertTrue(str(x))
         self.assertTrue(str(x))
-        if sys.version_info[0] < 3:
-            self.assertEqual(x.__cmp__(object()), -1)
 
 
     def test_complex_cast(self):
     def test_complex_cast(self):
 
 

+ 2 - 10
celery/tests/worker/test_consumer.py

@@ -8,16 +8,14 @@ from collections import deque
 from billiard.exceptions import RestartFreqExceeded
 from billiard.exceptions import RestartFreqExceeded
 
 
 from celery.worker.consumer.agent import Agent
 from celery.worker.consumer.agent import Agent
-from celery.worker.consumer.consumer import CLOSE, Consumer, dump_body
+from celery.worker.consumer.consumer import CLOSE, Consumer
 from celery.worker.consumer.gossip import Gossip
 from celery.worker.consumer.gossip import Gossip
 from celery.worker.consumer.heart import Heart
 from celery.worker.consumer.heart import Heart
 from celery.worker.consumer.mingle import Mingle
 from celery.worker.consumer.mingle import Mingle
 from celery.worker.consumer.tasks import Tasks
 from celery.worker.consumer.tasks import Tasks
 from celery.utils.collections import LimitedSet
 from celery.utils.collections import LimitedSet
 
 
-from celery.tests.case import (
-    AppCase, ContextMock, Mock, call, patch, skip,
-)
+from celery.tests.case import AppCase, ContextMock, Mock, call, patch
 
 
 
 
 class test_Consumer(AppCase):
 class test_Consumer(AppCase):
@@ -47,12 +45,6 @@ class test_Consumer(AppCase):
         c = self.get_consumer()
         c = self.get_consumer()
         self.assertIsNone(c.task_buckets['fooxasdwx.wewe'])
         self.assertIsNone(c.task_buckets['fooxasdwx.wewe'])
 
 
-    @skip.if_python3(reason='buffer type not available')
-    def test_dump_body_buffer(self):
-        msg = Mock()
-        msg.body = 'str'
-        self.assertTrue(dump_body(msg, buffer(msg.body)))
-
     def test_sets_heartbeat(self):
     def test_sets_heartbeat(self):
         c = self.get_consumer(amqheartbeat=10)
         c = self.get_consumer(amqheartbeat=10)
         self.assertEqual(c.amqheartbeat, 10)
         self.assertEqual(c.amqheartbeat, 10)

+ 1 - 26
celery/tests/worker/test_request.py

@@ -5,14 +5,13 @@ import numbers
 import os
 import os
 import signal
 import signal
 import socket
 import socket
-import sys
 
 
 from datetime import datetime, timedelta
 from datetime import datetime, timedelta
 from time import monotonic
 from time import monotonic
 
 
 from billiard.einfo import ExceptionInfo
 from billiard.einfo import ExceptionInfo
 from kombu.utils import uuid
 from kombu.utils import uuid
-from kombu.utils.encoding import default_encode, from_utf8, safe_str, safe_repr
+from kombu.utils.encoding import from_utf8, safe_str, safe_repr
 
 
 from celery import states
 from celery import states
 from celery.app.trace import (
 from celery.app.trace import (
@@ -48,7 +47,6 @@ from celery.tests.case import (
     TaskMessage,
     TaskMessage,
     task_message_from_sig,
     task_message_from_sig,
     patch,
     patch,
-    skip,
 )
 )
 
 
 
 
@@ -123,29 +121,6 @@ def jail(app, task_id, name, args, kwargs):
     ).retval
     ).retval
 
 
 
 
-@skip.if_python3()
-class test_default_encode(AppCase):
-
-    def test_jython(self):
-        prev, sys.platform = sys.platform, 'java 1.6.1'
-        try:
-            self.assertEqual(default_encode(bytes('foo')), 'foo')
-        finally:
-            sys.platform = prev
-
-    def test_cpython(self):
-        prev, sys.platform = sys.platform, 'darwin'
-        gfe, sys.getfilesystemencoding = (
-            sys.getfilesystemencoding,
-            lambda: 'utf-8',
-        )
-        try:
-            self.assertEqual(default_encode(bytes('foo')), 'foo')
-        finally:
-            sys.platform = prev
-            sys.getfilesystemencoding = gfe
-
-
 class test_Retry(AppCase):
 class test_Retry(AppCase):
 
 
     def test_retry_semipredicate(self):
     def test_retry_semipredicate(self):

+ 0 - 5
celery/utils/__init__.py

@@ -6,8 +6,6 @@ here for backwards compatibility.
 """
 """
 from __future__ import absolute_import, print_function, unicode_literals
 from __future__ import absolute_import, print_function, unicode_literals
 
 
-import sys
-
 from .functional import memoize  # noqa
 from .functional import memoize  # noqa
 
 
 from .nodenames import worker_direct, nodename, nodesplit
 from .nodenames import worker_direct, nodename, nodesplit
@@ -15,9 +13,6 @@ from .nodenames import worker_direct, nodename, nodesplit
 __all__ = ['worker_direct', 'gen_task_name', 'nodename', 'nodesplit',
 __all__ = ['worker_direct', 'gen_task_name', 'nodename', 'nodesplit',
            'cached_property', 'uuid']
            'cached_property', 'uuid']
 
 
-PY3 = sys.version_info[0] == 3
-
-
 # ------------------------------------------------------------------------ #
 # ------------------------------------------------------------------------ #
 # > XXX Compat
 # > XXX Compat
 from .log import LOG_LEVELS     # noqa
 from .log import LOG_LEVELS     # noqa

+ 1 - 1
celery/utils/abstract.py

@@ -12,7 +12,7 @@ def _hasattr(C, attr):
     return any(attr in B.__dict__ for B in C.__mro__)
     return any(attr in B.__dict__ for B in C.__mro__)
 
 
 
 
-class _AbstractClass(metaclass=ABCMeta)
+class _AbstractClass(metaclass=ABCMeta):
     __required_attributes__ = frozenset()
     __required_attributes__ = frozenset()
 
 
     @classmethod
     @classmethod

+ 4 - 50
celery/utils/collections.py

@@ -2,7 +2,6 @@
 """Custom maps, sets, sequences and other data structures."""
 """Custom maps, sets, sequences and other data structures."""
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
-import sys
 import time
 import time
 
 
 from collections import (
 from collections import (
@@ -36,8 +35,6 @@ __all__ = [
     'force_mapping', 'lpmerge',
     'force_mapping', 'lpmerge',
 ]
 ]
 
 
-PY3 = sys.version_info[0] >= 3
-
 REPR_LIMITED_SET = """\
 REPR_LIMITED_SET = """\
 <{name}({size}): maxlen={0.maxlen}, expires={0.expires}, minlen={0.minlen}>\
 <{name}({size}): maxlen={0.maxlen}, expires={0.expires}, minlen={0.minlen}>\
 """
 """
@@ -61,50 +58,10 @@ def lpmerge(L, R):
 
 
 class OrderedDict(_OrderedDict):
 class OrderedDict(_OrderedDict):
 
 
-    if PY3:  # pragma: no cover
-        def _LRUkey(self):
-            # return value of od.keys does not support __next__,
-            # but this version will also not create a copy of the list.
-            return next(iter(self.keys()))
-    else:
-        if _dict_is_ordered:  # pragma: no cover
-            def _LRUkey(self):
-                # iterkeys is iterable.
-                return next(self.iterkeys())
-        else:
-            def _LRUkey(self):
-                return self._OrderedDict__root[1][2]
-
-    if not hasattr(_OrderedDict, 'move_to_end'):
-        if _dict_is_ordered:  # pragma: no cover
-
-            def move_to_end(self, key, last=True):
-                if not last:
-                    # we don't use this argument, and the only way to
-                    # implement this on PyPy seems to be O(n): creating a
-                    # copy with the order changed, so we just raise.
-                    raise NotImplementedError('no last=True on PyPy')
-                self[key] = self.pop(key)
-
-        else:
-
-            def move_to_end(self, key, last=True):
-                link = self._OrderedDict__map[key]
-                link_prev = link[0]
-                link_next = link[1]
-                link_prev[1] = link_next
-                link_next[0] = link_prev
-                root = self._OrderedDict__root
-                if last:
-                    last = root[0]
-                    link[0] = last
-                    link[1] = root
-                    last[1] = root[0] = link
-                else:
-                    first = root[1]
-                    link[0] = root
-                    link[1] = first
-                    root[1] = first[0] = link
+    def _LRUkey(self):
+        # return value of od.keys does not support __next__,
+        # but this version will also not create a copy of the list.
+        return next(iter(self.keys()))
 
 
 
 
 class AttributeDictMixin:
 class AttributeDictMixin:
@@ -260,7 +217,6 @@ class ChainMap(MutableMapping):
 
 
     def __bool__(self):
     def __bool__(self):
         return any(self.maps)
         return any(self.maps)
-    __nonzero__ = __bool__  # Py2
 
 
     def setdefault(self, key, default):
     def setdefault(self, key, default):
         key = self._key(key)
         key = self._key(key)
@@ -283,7 +239,6 @@ class ChainMap(MutableMapping):
         """New ChainMap or subclass with a new copy of maps[0] and
         """New ChainMap or subclass with a new copy of maps[0] and
         refs to maps[1:]."""
         refs to maps[1:]."""
         return self.__class__(self.maps[0].copy(), *self.maps[1:])
         return self.__class__(self.maps[0].copy(), *self.maps[1:])
-    __copy__ = copy  # Py2
 
 
     def _iter(self, op):
     def _iter(self, op):
         # defaults must be first in the stream, so values in
         # defaults must be first in the stream, so values in
@@ -585,7 +540,6 @@ class LimitedSet:
 
 
     def __bool__(self):
     def __bool__(self):
         return bool(self._data)
         return bool(self._data)
-    __nonzero__ = __bool__  # Py2
 
 
     @property
     @property
     def _heap_overload(self):
     def _heap_overload(self):

+ 0 - 10
celery/utils/dispatch/saferef.py

@@ -6,14 +6,11 @@ aren't handled by the core weakref module).
 """
 """
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
-import sys
 import traceback
 import traceback
 import weakref
 import weakref
 
 
 __all__ = ['safe_ref']
 __all__ = ['safe_ref']
 
 
-PY3 = sys.version_info[0] == 3
-
 
 
 def safe_ref(target, on_delete=None):  # pragma: no cover
 def safe_ref(target, on_delete=None):  # pragma: no cover
     """Return a *safe* weak reference to a callable target
     """Return a *safe* weak reference to a callable target
@@ -175,13 +172,6 @@ class BoundMethodWeakref:  # pragma: no cover
         return self() is not None
         return self() is not None
     __nonzero__ = __bool__  # py2
     __nonzero__ = __bool__  # py2
 
 
-    if not PY3:
-        def __cmp__(self, other):
-            """Compare with another reference"""
-            if not isinstance(other, self.__class__):
-                return cmp(self.__class__, type(other))  # noqa
-            return cmp(self.key, other.key)              # noqa
-
     def __call__(self):
     def __call__(self):
         """Return a strong reference to the bound method
         """Return a strong reference to the bound method
 
 

+ 0 - 2
celery/utils/functional.py

@@ -21,8 +21,6 @@ __all__ = [
     'regen', 'dictfilter', 'lazy', 'maybe_evaluate', 'head_from_fun',
     'regen', 'dictfilter', 'lazy', 'maybe_evaluate', 'head_from_fun',
 ]
 ]
 
 
-IS_PY3 = sys.version_info[0] == 3
-
 FUNHEAD_TEMPLATE = """
 FUNHEAD_TEMPLATE = """
 def {fun_name}({fun_args}):
 def {fun_name}({fun_args}):
     return {fun_value}
     return {fun_value}

+ 7 - 13
celery/utils/imports.py

@@ -29,19 +29,13 @@ class NotAPackage(Exception):
     pass
     pass
 
 
 
 
-if sys.version_info > (3, 3):  # pragma: no cover
-    def qualname(obj):
-        if not hasattr(obj, '__name__') and hasattr(obj, '__class__'):
-            obj = obj.__class__
-        q = getattr(obj, '__qualname__', None)
-        if '.' not in q:
-            q = '.'.join((obj.__module__, q))
-        return q
-else:
-    def qualname(obj):  # noqa
-        if not hasattr(obj, '__name__') and hasattr(obj, '__class__'):
-            obj = obj.__class__
-        return '.'.join((obj.__module__, obj.__name__))
+def qualname(obj):
+    if not hasattr(obj, '__name__') and hasattr(obj, '__class__'):
+        obj = obj.__class__
+    q = getattr(obj, '__qualname__', None)
+    if '.' not in q:
+        q = '.'.join((obj.__module__, q))
+    return q
 
 
 
 
 def instantiate(name, *args, **kwargs):
 def instantiate(name, *args, **kwargs):

+ 1 - 5
celery/utils/log.py

@@ -24,7 +24,6 @@ __all__ = [
 
 
 _process_aware = False
 _process_aware = False
 _in_sighandler = False
 _in_sighandler = False
-PY3 = sys.version_info[0] == 3
 
 
 MP_LOG = os.environ.get('MP_LOG', False)
 MP_LOG = os.environ.get('MP_LOG', False)
 
 
@@ -126,10 +125,7 @@ class ColorFormatter(logging.Formatter):
     def formatException(self, ei):
     def formatException(self, ei):
         if ei and not isinstance(ei, tuple):
         if ei and not isinstance(ei, tuple):
             ei = sys.exc_info()
             ei = sys.exc_info()
-        r = logging.Formatter.formatException(self, ei)
-        if isinstance(r, str) and not PY3:
-            return safe_str(r)
-        return r
+        return logging.Formatter.formatException(self, ei)
 
 
     def format(self, record):
     def format(self, record):
         msg = logging.Formatter.format(self, record)
         msg = logging.Formatter.format(self, record)

+ 2 - 14
celery/utils/saferepr.py

@@ -13,8 +13,6 @@ Very slow with no limits, super quick with limits.
 """
 """
 from __future__ import absolute_import, unicode_literals
 from __future__ import absolute_import, unicode_literals
 
 
-import sys
-
 from collections import Iterable, Mapping, deque, namedtuple
 from collections import Iterable, Mapping, deque, namedtuple
 
 
 from decimal import Decimal
 from decimal import Decimal
@@ -28,14 +26,6 @@ from .text import truncate, truncate_bytes
 
 
 __all__ = ['saferepr', 'reprstream']
 __all__ = ['saferepr', 'reprstream']
 
 
-IS_PY3 = sys.version_info[0] == 3
-
-if IS_PY3:  # pragma: no cover
-    range_t = (range, )
-else:
-    class range_t:  # noqa
-        pass
-
 _literal = namedtuple('_literal', ('value', 'truncate', 'direction'))
 _literal = namedtuple('_literal', ('value', 'truncate', 'direction'))
 _key = namedtuple('_key', ('value',))
 _key = namedtuple('_key', ('value',))
 _quoted = namedtuple('_quoted', ('value',))
 _quoted = namedtuple('_quoted', ('value',))
@@ -103,10 +93,8 @@ def _saferepr(o, maxlen=None, maxlevels=3, seen=None):
             val = saferepr(token.value, maxlen, maxlevels)
             val = saferepr(token.value, maxlen, maxlevels)
         elif isinstance(token, _quoted):
         elif isinstance(token, _quoted):
             val = token.value
             val = token.value
-            if IS_PY3 and isinstance(val, bytes):  # pragma: no cover
+            if isinstance(val, bytes):
                 val = "b'%s'" % (bytes_to_str(truncate_bytes(val, maxlen)),)
                 val = "b'%s'" % (bytes_to_str(truncate_bytes(val, maxlen)),)
-            else:
-                val = "'%s'" % (truncate(val, maxlen),)
         else:
         else:
             val = truncate(token, maxlen)
             val = truncate(token, maxlen)
         yield val
         yield val
@@ -156,7 +144,7 @@ def reprstream(stack, seen=None, maxlevels=3, level=0, isinstance=isinstance):
                 yield str(val), it
                 yield str(val), it
             elif isinstance(val, chars_t):
             elif isinstance(val, chars_t):
                 yield _quoted(val), it
                 yield _quoted(val), it
-            elif isinstance(val, range_t):  # pragma: no cover
+            elif isinstance(val, range):  # pragma: no cover
                 yield repr(val), it
                 yield repr(val), it
             else:
             else:
                 if isinstance(val, set_t):
                 if isinstance(val, set_t):

+ 0 - 1
celery/utils/threads.py

@@ -33,7 +33,6 @@ __all__ = [
 ]
 ]
 
 
 USE_FAST_LOCALS = os.environ.get('USE_FAST_LOCALS')
 USE_FAST_LOCALS = os.environ.get('USE_FAST_LOCALS')
-PY3 = sys.version_info[0] == 3
 
 
 
 
 @contextmanager
 @contextmanager

+ 15 - 28
celery/utils/timeutils.py

@@ -4,7 +4,6 @@ from __future__ import absolute_import, print_function, unicode_literals
 
 
 import numbers
 import numbers
 import os
 import os
-import sys
 import time as _time
 import time as _time
 
 
 from calendar import monthrange
 from calendar import monthrange
@@ -26,9 +25,6 @@ __all__ = [
     'adjust_timestamp', 'maybe_s_to_ms',
     'adjust_timestamp', 'maybe_s_to_ms',
 ]
 ]
 
 
-PY3 = sys.version_info[0] == 3
-PY33 = sys.version_info >= (3, 3)
-
 C_REMDEBUG = os.environ.get('C_REMDEBUG', False)
 C_REMDEBUG = os.environ.get('C_REMDEBUG', False)
 
 
 DAYNAMES = 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'
 DAYNAMES = 'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'
@@ -84,20 +80,18 @@ class LocalTimezone(tzinfo):
     def tzname(self, dt):
     def tzname(self, dt):
         return _time.tzname[self._isdst(dt)]
         return _time.tzname[self._isdst(dt)]
 
 
-    if PY3:  # pragma: no cover
-
-        def fromutc(self, dt):
-            # The base tzinfo class no longer implements a DST
-            # offset aware .fromutc() in Python 3 (Issue #2306).
+    def fromutc(self, dt):
+        # The base tzinfo class no longer implements a DST
+        # offset aware .fromutc() in Python 3 (Issue #2306).
 
 
-            # I'd rather rely on pytz to do this, than port
-            # the C code from cpython's fromutc [asksol]
-            offset = int(self.utcoffset(dt).seconds / 60.0)
-            try:
-                tz = self._offset_cache[offset]
-            except KeyError:
-                tz = self._offset_cache[offset] = FixedOffset(offset)
-            return tz.fromutc(dt.replace(tzinfo=tz))
+        # I'd rather rely on pytz to do this, than port
+        # the C code from cpython's fromutc [asksol]
+        offset = int(self.utcoffset(dt).seconds / 60.0)
+        try:
+            tz = self._offset_cache[offset]
+        except KeyError:
+            tz = self._offset_cache[offset] = FixedOffset(offset)
+        return tz.fromutc(dt.replace(tzinfo=tz))
 
 
     def _isdst(self, dt):
     def _isdst(self, dt):
         tt = (dt.year, dt.month, dt.day,
         tt = (dt.year, dt.month, dt.day,
@@ -120,17 +114,10 @@ class _Zone:
             dt = make_aware(dt, orig or self.utc)
             dt = make_aware(dt, orig or self.utc)
         return localize(dt, self.tz_or_local(local))
         return localize(dt, self.tz_or_local(local))
 
 
-    if PY33:  # pragma: no cover
-
-        def to_system(self, dt):
-            # tz=None is a special case since Python 3.3, and will
-            # convert to the current local timezone (Issue #2306).
-            return dt.astimezone(tz=None)
-
-    else:
-
-        def to_system(self, dt):  # noqa
-            return localize(dt, self.local)
+    def to_system(self, dt):
+        # tz=None is a special case since Python 3.3, and will
+        # convert to the current local timezone (Issue #2306).
+        return dt.astimezone(tz=None)
 
 
     def to_local_fallback(self, dt):
     def to_local_fallback(self, dt):
         if is_naive(dt):
         if is_naive(dt):

+ 13 - 26
docs/_ext/celerydocs.py

@@ -54,16 +54,6 @@ ABBR_EMPTY = {
 DEFAULT_EMPTY = 'celery.Celery'
 DEFAULT_EMPTY = 'celery.Celery'
 
 
 
 
-if sys.version_info[0] < 3:
-    def bytes_if_py2(s):
-        if isinstance(s, unicode):
-            return s.encode()
-        return s
-else:
-    def bytes_if_py2(s):  # noqa
-        return s
-
-
 def typeify(S, type):
 def typeify(S, type):
     if type in ('meth', 'func'):
     if type in ('meth', 'func'):
         return S + '()'
         return S + '()'
@@ -152,28 +142,25 @@ def maybe_resolve_abbreviations(app, env, node, contnode):
 
 
 
 
 def setup(app):
 def setup(app):
-    app.connect(
-        bytes_if_py2('missing-reference'),
-        maybe_resolve_abbreviations,
-    )
+    app.connect('missing-reference', maybe_resolve_abbreviations)
 
 
     app.add_crossref_type(
     app.add_crossref_type(
-        directivename=bytes_if_py2('sig'),
-        rolename=bytes_if_py2('sig'),
-        indextemplate=bytes_if_py2('pair: %s; sig'),
+        directivename='sig',
+        rolename='sig',
+        indextemplate='pair: %s; sig',
     )
     )
     app.add_crossref_type(
     app.add_crossref_type(
-        directivename=bytes_if_py2('state'),
-        rolename=bytes_if_py2('state'),
-        indextemplate=bytes_if_py2('pair: %s; state'),
+        directivename='state',
+        rolename='state',
+        indextemplate='pair: %s; state',
     )
     )
     app.add_crossref_type(
     app.add_crossref_type(
-        directivename=bytes_if_py2('control'),
-        rolename=bytes_if_py2('control'),
-        indextemplate=bytes_if_py2('pair: %s; control'),
+        directivename='control',
+        rolename='control',
+        indextemplate='pair: %s; control',
     )
     )
     app.add_crossref_type(
     app.add_crossref_type(
-        directivename=bytes_if_py2('event'),
-        rolename=bytes_if_py2('event'),
-        indextemplate=bytes_if_py2('pair: %s; event'),
+        directivename='event',
+        rolename='event',
+        indextemplate='pair: %s; event',
     )
     )