Преглед на файлове

setup.py: Use 2to3 on Py3k

Ask Solem преди 14 години
родител
ревизия
c3b78b8952

+ 1 - 2
celery/app/amqp.py

@@ -9,12 +9,11 @@ AMQ related functionality.
 
 """
 from datetime import datetime, timedelta
-from UserDict import UserDict
-
 
 from celery import routes
 from celery import signals
 from celery.utils import gen_unique_id, textindent
+from celery.utils.compat import UserDict
 
 from kombu import compat as messaging
 from kombu import BrokerConnection

+ 1 - 1
celery/beat.py

@@ -10,7 +10,6 @@ import threading
 import traceback
 import multiprocessing
 from datetime import datetime
-from UserDict import UserDict
 
 from celery import platforms
 from celery import registry
@@ -18,6 +17,7 @@ from celery.app import app_or_default
 from celery.log import SilenceRepeated
 from celery.schedules import maybe_schedule
 from celery.utils import instantiate
+from celery.utils.compat import UserDict
 from celery.utils.timeutils import humanize_seconds
 
 

+ 1 - 2
celery/datastructures.py

@@ -4,10 +4,9 @@ import time
 import traceback
 
 from itertools import chain
-from UserList import UserList
 from Queue import Queue, Empty as QueueEmpty
 
-from celery.utils.compat import OrderedDict
+from celery.utils.compat import OrderedDict, UserList
 
 
 class AttributeDictMixin(object):

+ 1 - 2
celery/registry.py

@@ -1,9 +1,8 @@
 """celery.registry"""
 import inspect
 
-from UserDict import UserDict
-
 from celery.exceptions import NotRegistered
+from celery.utils.compat import UserDict
 
 
 class TaskRegistry(UserDict):

+ 1 - 2
celery/task/sets.py

@@ -1,11 +1,10 @@
 import warnings
 
-from UserList import UserList
-
 from celery import registry
 from celery.app import app_or_default
 from celery.datastructures import AttributeDict
 from celery.utils import gen_unique_id
+from celery.utils.compat import UserList
 
 TASKSET_DEPRECATION_TEXT = """\
 Using this invocation of TaskSet is deprecated and will be removed

+ 4 - 4
celery/tests/test_pickle.py

@@ -20,8 +20,8 @@ class TestPickle(unittest.TestCase):
         exc = None
         try:
             raise RegularException("RegularException raised")
-        except RegularException, exc:
-            pass
+        except RegularException, exc_:
+            exc = exc_
 
         pickled = pickle.dumps({"exception": exc})
         unpickled = pickle.loads(pickled)
@@ -36,8 +36,8 @@ class TestPickle(unittest.TestCase):
         try:
             raise ArgOverrideException("ArgOverrideException raised",
                     status_code=100)
-        except ArgOverrideException, exc:
-            pass
+        except ArgOverrideException, exc_:
+            exc = exc_
 
         pickled = pickle.dumps({"exception": exc})
         unpickled = pickle.loads(pickled)

+ 4 - 1
celery/tests/test_task_http.py

@@ -3,7 +3,10 @@ from __future__ import generators
 
 import logging
 from celery.tests.utils import unittest
-from urllib import addinfourl
+try:
+    from urllib import addinfourl
+except ImportError:  # py3k
+    from urllib.request import addinfourl
 try:
     from contextlib import contextmanager
 except ImportError:

+ 3 - 2
celery/tests/test_task_sets.py

@@ -1,6 +1,6 @@
 from celery.tests.utils import unittest
 
-import simplejson
+import anyjson
 
 from celery.app import app_or_default
 from celery.task import Task
@@ -84,7 +84,8 @@ class test_subtask(unittest.TestCase):
         s.args = list(s.args)                   # tuples are not preserved
                                                 # but this doesn't matter.
         self.assertEqual(s,
-                         subtask(simplejson.loads(simplejson.dumps(s))))
+                         subtask(anyjson.deserialize(
+                             anyjson.serialize(s))))
 
 
 class test_TaskSet(unittest.TestCase):

+ 3 - 3
celery/tests/test_worker_job.py

@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 import logging
-import simplejson
+import anyjson
 import sys
 from celery.tests.utils import unittest
 from celery.tests.utils import StringIO
@@ -339,7 +339,7 @@ class test_TaskRequest(unittest.TestCase):
     def test_from_message(self):
         body = {"task": mytask.name, "id": gen_unique_id(),
                 "args": [2], "kwargs": {u"æØåveéðƒeæ": "bar"}}
-        m = Message(None, body=simplejson.dumps(body), backend="foo",
+        m = Message(None, body=anyjson.serialize(body), backend="foo",
                           content_type="application/json",
                           content_encoding="utf-8")
         tw = TaskRequest.from_message(m, m.decode())
@@ -355,7 +355,7 @@ class test_TaskRequest(unittest.TestCase):
     def test_from_message_nonexistant_task(self):
         body = {"task": "cu.mytask.doesnotexist", "id": gen_unique_id(),
                 "args": [2], "kwargs": {u"æØåveéðƒeæ": "bar"}}
-        m = Message(None, body=simplejson.dumps(body), backend="foo",
+        m = Message(None, body=anyjson.serialize(body), backend="foo",
                           content_type="application/json",
                           content_encoding="utf-8")
         self.assertRaises(NotRegistered, TaskRequest.from_message,

+ 3 - 0
celery/utils/__init__.py

@@ -53,6 +53,9 @@ class promise(object):
             return -cmp(rhs, self())
         return cmp(self(), rhs)
 
+    def __eq__(self, rhs):
+        return self() == rhs
+
     def __deepcopy__(self, memo):
         memo[id(self)] = self
         return self

+ 40 - 22
celery/utils/compat.py

@@ -1,5 +1,16 @@
 from __future__ import generators
 
+############## py3k #########################################################
+try:
+    from UserList import UserList
+except ImportError:
+    from collections import UserList
+
+try:
+    from UserDict import UserDict
+except ImportError:
+    from collections import UserDict
+
 ############## urlparse.parse_qsl ###########################################
 
 try:
@@ -45,10 +56,12 @@ from operator import eq as _eq
 
 class _Link(object):
     """Doubly linked list."""
-    __slots__ = 'prev', 'next', 'key', '__weakref__'
+    # next can't be lowercase because 2to3 thinks it's a generator
+    # and renames it to __next__.
+    __slots__ = 'PREV', 'NEXT', 'key', '__weakref__'
 
 
-class OrderedDict(dict, MutableMapping):
+class CompatOrderedDict(dict, MutableMapping):
     """Dictionary that remembers insertion order"""
     # An inherited dict maps keys to values.
     # The inherited dict provides __getitem__, __len__, __contains__, and get.
@@ -80,18 +93,18 @@ class OrderedDict(dict, MutableMapping):
             raise TypeError("expected at most 1 arguments, got %d" % (
                                 len(args)))
         try:
-            self.__root
+            self._root
         except AttributeError:
             # sentinel node for the doubly linked list
-            self.__root = root = _Link()
-            root.prev = root.next = root
+            self._root = root = _Link()
+            root.PREV = root.NEXT = root
             self.__map = {}
         self.update(*args, **kwds)
 
     def clear(self):
         "od.clear() -> None.  Remove all items from od."
-        root = self.__root
-        root.prev = root.next = root
+        root = self._root
+        root.PREV = root.NEXT = root
         self.__map.clear()
         dict.clear(self)
 
@@ -102,10 +115,10 @@ class OrderedDict(dict, MutableMapping):
         # key/value pair.
         if key not in self:
             self.__map[key] = link = _Link()
-            root = self.__root
-            last = root.prev
-            link.prev, link.next, link.key = last, root, key
-            last.next = root.prev = weakref.proxy(link)
+            root = self._root
+            last = root.PREV
+            link.PREV, link.NEXT, link.key = last, root, key
+            last.NEXT = root.PREV = weakref.proxy(link)
         dict.__setitem__(self, key, value)
 
     def __delitem__(self, key):
@@ -115,34 +128,34 @@ class OrderedDict(dict, MutableMapping):
         # predecessor and successor nodes.
         dict.__delitem__(self, key)
         link = self.__map.pop(key)
-        link.prev.next = link.next
-        link.next.prev = link.prev
+        link.PREV.NEXT = link.NEXT
+        link.NEXT.PREV = link.PREV
 
     def __iter__(self):
         """od.__iter__() <==> iter(od)"""
         # Traverse the linked list in order.
-        root = self.__root
-        curr = root.next
+        root = self._root
+        curr = root.NEXT
         while curr is not root:
             yield curr.key
-            curr = curr.next
+            curr = curr.NEXT
 
     def __reversed__(self):
         """od.__reversed__() <==> reversed(od)"""
         # Traverse the linked list in reverse order.
-        root = self.__root
-        curr = root.prev
+        root = self._root
+        curr = root.PREV
         while curr is not root:
             yield curr.key
-            curr = curr.prev
+            curr = curr.PREV
 
     def __reduce__(self):
         """Return state information for pickling"""
         items = [[k, self[k]] for k in self]
-        tmp = self.__map, self.__root
-        del(self.__map, self.__root)
+        tmp = self.__map, self._root
+        del(self.__map, self._root)
         inst_dict = vars(self).copy()
-        self.__map, self.__root = tmp
+        self.__map, self._root = tmp
         if inst_dict:
             return (self.__class__, (items,), inst_dict)
         return self.__class__, (items,)
@@ -243,6 +256,11 @@ class OrderedDict(dict, MutableMapping):
     def __ne__(self, other):
         return not (self == other)
 
+try:
+    from collections import OrderedDict
+except ImportError:
+    OrderedDict = CompatOrderedDict
+
 ############## collections.defaultdict ######################################
 
 try:

+ 1 - 1
celery/worker/control/registry.py

@@ -1,4 +1,4 @@
-from UserDict import UserDict
+from celery.utils.compat import UserDict
 
 
 class Panel(UserDict):

+ 14 - 1
setup.py

@@ -5,6 +5,18 @@ import sys
 import codecs
 import platform
 
+extra = {}
+tests_require = {"nose", "nose-cover3"}
+if sys.version_info >= (3, 0):
+    extra.update(use_2to3=True)
+elif sys.version_info <= (2, 6):
+    tests_require.append("unittest2")
+elif sys.version_info <= (2, 5):
+    tests_require.append("simplejson")
+
+if sys.version_info < (2, 4):
+    raise Exception("Celery requires Python 2.4 or higher.")
+
 try:
     from setuptools import setup, find_packages, Command
     from setuptools.command.test import test
@@ -175,7 +187,7 @@ setup(
              "bin/celeryev"],
     zip_safe=False,
     install_requires=install_requires,
-    tests_require=['nose', 'nose-cover3', 'unittest2', 'simplejson'],
+    tests_require=tests_require,
     cmdclass={"install": upgrade_and_install,
               "upgrade": upgrade,
               "test": mytest,
@@ -202,4 +214,5 @@ setup(
         'console_scripts': console_scripts,
     },
     long_description=long_description,
+    **extra
 )