Bladeren bron

Py3 fixes

Ask Solem 11 jaren geleden
bovenliggende
commit
d08014fde0

+ 1 - 1
celery/contrib/migrate.py

@@ -243,7 +243,7 @@ def start_filter(app, conn, filter, limit=None, timeout=1.0,
     state = state or State()
     state = state or State()
     queues = prepare_queues(queues)
     queues = prepare_queues(queues)
     consume_from = [_maybe_queue(app, q)
     consume_from = [_maybe_queue(app, q)
-                    for q in consume_from or queues.keys()]
+                    for q in consume_from or list(queues)]
     if isinstance(tasks, string_t):
     if isinstance(tasks, string_t):
         tasks = set(tasks.split(','))
         tasks = set(tasks.split(','))
     if tasks is None:
     if tasks is None:

+ 4 - 8
celery/task/http.py

@@ -39,17 +39,13 @@ else:
 
 
     from urllib2 import Request, urlopen  # noqa
     from urllib2 import Request, urlopen  # noqa
 
 
-    def maybe_utf8(value):  # noqa
-        """Encode to utf-8, only if the value is Unicode."""
-        if isinstance(value, unicode):
-            return value.encode('utf-8')
-        return value
-
     def utf8dict(tup):  # noqa
     def utf8dict(tup):  # noqa
         """With a dict's items() tuple return a new dict with any utf-8
         """With a dict's items() tuple return a new dict with any utf-8
         keys/values encoded."""
         keys/values encoded."""
-        return dict((key.encode('utf-8'), maybe_utf8(value))
-                    for key, value in tup)
+        return dict(
+            (k.encode('utf-8'),
+             v.encode('utf-8') if isinstance(v, unicode) else v)
+            for k, v in tup)
 
 
 
 
 class InvalidResponseError(Exception):
 class InvalidResponseError(Exception):

+ 9 - 9
celery/tests/contrib/test_migrate.py

@@ -132,7 +132,7 @@ class test_start_filter(AppCase):
     def test_start(self):
     def test_start(self):
         with patch('celery.contrib.migrate.eventloop') as evloop:
         with patch('celery.contrib.migrate.eventloop') as evloop:
             app = Mock()
             app = Mock()
-            filter = Mock(name='filter')
+            filt = Mock(name='filter')
             conn = Connection('memory://')
             conn = Connection('memory://')
             evloop.side_effect = StopFiltering()
             evloop.side_effect = StopFiltering()
             app.amqp.queues = {'foo': Queue('foo'), 'bar': Queue('bar')}
             app.amqp.queues = {'foo': Queue('foo'), 'bar': Queue('bar')}
@@ -147,26 +147,26 @@ class test_start_filter(AppCase):
                 consumer.callbacks.append(x)
                 consumer.callbacks.append(x)
             consumer.register_callback = register_callback
             consumer.register_callback = register_callback
 
 
-            start_filter(app, conn, filter,
+            start_filter(app, conn, filt,
                          queues='foo,bar', ack_messages=True)
                          queues='foo,bar', ack_messages=True)
             body = {'task': 'add', 'id': 'id'}
             body = {'task': 'add', 'id': 'id'}
             for callback in consumer.callbacks:
             for callback in consumer.callbacks:
                 callback(body, Message(body))
                 callback(body, Message(body))
             consumer.callbacks[:] = []
             consumer.callbacks[:] = []
             cb = Mock(name='callback=')
             cb = Mock(name='callback=')
-            start_filter(app, conn, filter, tasks='add,mul', callback=cb)
+            start_filter(app, conn, filt, tasks='add,mul', callback=cb)
             for callback in consumer.callbacks:
             for callback in consumer.callbacks:
                 callback(body, Message(body))
                 callback(body, Message(body))
             self.assertTrue(cb.called)
             self.assertTrue(cb.called)
 
 
             on_declare_queue = Mock()
             on_declare_queue = Mock()
-            start_filter(app, conn, filter, tasks='add,mul', queues='foo',
+            start_filter(app, conn, filt, tasks='add,mul', queues='foo',
                          on_declare_queue=on_declare_queue)
                          on_declare_queue=on_declare_queue)
             self.assertTrue(on_declare_queue.called)
             self.assertTrue(on_declare_queue.called)
-            start_filter(app, conn, filter, queues=['foo', 'bar'])
+            start_filter(app, conn, filt, queues=['foo', 'bar'])
             consumer.callbacks[:] = []
             consumer.callbacks[:] = []
             state = State()
             state = State()
-            start_filter(app, conn, filter,
+            start_filter(app, conn, filt,
                          tasks='add,mul', callback=cb, state=state, limit=1)
                          tasks='add,mul', callback=cb, state=state, limit=1)
             stop_filtering_raised = False
             stop_filtering_raised = False
             for callback in consumer.callbacks:
             for callback in consumer.callbacks:
@@ -182,14 +182,14 @@ class test_filter_callback(Case):
 
 
     def test_filter(self):
     def test_filter(self):
         callback = Mock()
         callback = Mock()
-        filter = filter_callback(callback, ['add', 'mul'])
+        filt = filter_callback(callback, ['add', 'mul'])
         t1 = {'task': 'add'}
         t1 = {'task': 'add'}
         t2 = {'task': 'div'}
         t2 = {'task': 'div'}
 
 
         message = Mock()
         message = Mock()
-        filter(t2, message)
+        filt(t2, message)
         self.assertFalse(callback.called)
         self.assertFalse(callback.called)
-        filter(t1, message)
+        filt(t1, message)
         callback.assert_called_with(t1, message)
         callback.assert_called_with(t1, message)
 
 
 
 

+ 8 - 3
docs/_ext/literals_to_xrefs.py

@@ -7,6 +7,11 @@ import re
 import sys
 import sys
 import shelve
 import shelve
 
 
+try:
+    input = input
+except NameError:
+    input = raw_input  # noqa
+
 refre = re.compile(r'``([^`\s]+?)``')
 refre = re.compile(r'``([^`\s]+?)``')
 
 
 ROLES = (
 ROLES = (
@@ -76,7 +81,7 @@ def fixliterals(fname):
 
 
         replace_type = None
         replace_type = None
         while replace_type is None:
         while replace_type is None:
-            replace_type = raw_input(
+            replace_type = input(
                 colorize("Replace role: ", fg="yellow")).strip().lower()
                 colorize("Replace role: ", fg="yellow")).strip().lower()
             if replace_type and replace_type not in ROLES:
             if replace_type and replace_type not in ROLES:
                 replace_type = None
                 replace_type = None
@@ -94,7 +99,7 @@ def fixliterals(fname):
         if default.endswith("()") and \
         if default.endswith("()") and \
                 replace_type in ("class", "func", "meth"):
                 replace_type in ("class", "func", "meth"):
             default = default[:-2]
             default = default[:-2]
-        replace_value = raw_input(
+        replace_value = input(
             colorize("Text <target> [", fg="yellow") + default + \
             colorize("Text <target> [", fg="yellow") + default + \
                     colorize("]: ", fg="yellow")).strip()
                     colorize("]: ", fg="yellow")).strip()
         if not replace_value:
         if not replace_value:
@@ -154,7 +159,7 @@ def colorize(text='', opts=(), **kwargs):
     code_list = []
     code_list = []
     if text == '' and len(opts) == 1 and opts[0] == 'reset':
     if text == '' and len(opts) == 1 and opts[0] == 'reset':
         return '\x1b[%sm' % RESET
         return '\x1b[%sm' % RESET
-    for k, v in kwargs.iteritems():
+    for k, v in kwargs.items():
         if k == 'fg':
         if k == 'fg':
             code_list.append(foreground[v])
             code_list.append(foreground[v])
         elif k == 'bg':
         elif k == 'bg':

+ 4 - 4
docs/conf.py

@@ -66,8 +66,8 @@ source_suffix = '.rst'
 master_doc = 'index'
 master_doc = 'index'
 
 
 # General information about the project.
 # General information about the project.
-project = u'Celery'
-copyright = u'2009-2013, Ask Solem & Contributors'
+project = 'Celery'
+copyright = '2009-2013, Ask Solem & Contributors'
 
 
 # The version info for the project you're documenting, acts as replacement for
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
 # |version| and |release|, also used in various other places throughout the
@@ -116,8 +116,8 @@ html_use_modindex = True
 html_use_index = True
 html_use_index = True
 
 
 latex_documents = [
 latex_documents = [
-  ('index', 'Celery.tex', ur'Celery Documentation',
-   ur'Ask Solem & Contributors', 'manual'),
+  ('index', 'Celery.tex', 'Celery Documentation',
+   'Ask Solem & Contributors', 'manual'),
 ]
 ]
 
 
 html_theme = "celery"
 html_theme = "celery"

+ 1 - 0
examples/eventlet/README.rst

@@ -12,6 +12,7 @@ module (when this is installed all name lookups will be asynchronous)::
 
 
     $ pip install eventlet
     $ pip install eventlet
     $ pip install dnspython
     $ pip install dnspython
+    $ pip install requests
 
 
 Before you run any of the example tasks you need to start
 Before you run any of the example tasks you need to start
 the worker::
 the worker::

+ 4 - 3
examples/eventlet/tasks.py

@@ -1,12 +1,13 @@
+import requests
+
 from celery import task
 from celery import task
-from eventlet.green import urllib2
 
 
 
 
 @task()
 @task()
 def urlopen(url):
 def urlopen(url):
     print('Opening: {0}'.format(url))
     print('Opening: {0}'.format(url))
     try:
     try:
-        body = urllib2.urlopen(url).read()
+        response = requests.get(url)
     except Exception as exc:
     except Exception as exc:
         print('URL {0} gave error: {1!r}'.format(url, exc))
         print('URL {0} gave error: {1!r}'.format(url, exc))
-    return len(body)
+    return len(response.text)

+ 12 - 7
examples/eventlet/webcrawler.py

@@ -24,11 +24,16 @@ to "zlib", and the serializer to "pickle".
 
 
 import re
 import re
 import time
 import time
-import urlparse
+
+try:
+    from urllib.parse import urlsplit
+except ImportError:
+    from urlparse import urlsplit
+
+import requests
 
 
 from celery import task, group
 from celery import task, group
 from eventlet import Timeout
 from eventlet import Timeout
-from eventlet.green import urllib2
 
 
 from pybloom import BloomFilter
 from pybloom import BloomFilter
 
 
@@ -39,7 +44,7 @@ url_regex = re.compile(
 
 
 def domain(url):
 def domain(url):
     """Returns the domain part of an URL."""
     """Returns the domain part of an URL."""
-    return urlparse.urlsplit(url)[1].split(':')[0]
+    return urlsplit(url)[1].split(':')[0]
 
 
 
 
 @task(ignore_result=True, serializer='pickle', compression='zlib')
 @task(ignore_result=True, serializer='pickle', compression='zlib')
@@ -50,13 +55,13 @@ def crawl(url, seen=None):
 
 
     with Timeout(5, False):
     with Timeout(5, False):
         try:
         try:
-            data = urllib2.urlopen(url).read()
-        except (urllib2.HTTPError, IOError):
+            response = requests.get(url)
+        except Exception:
             return
             return
 
 
     location = domain(url)
     location = domain(url)
     wanted_urls = []
     wanted_urls = []
-    for url_match in url_regex.finditer(data):
+    for url_match in url_regex.finditer(response.text):
         url = url_match.group(0)
         url = url_match.group(0)
         # To not destroy the internet, we only fetch URLs on the same domain.
         # To not destroy the internet, we only fetch URLs on the same domain.
         if url not in seen and location in domain(url):
         if url not in seen and location in domain(url):
@@ -64,4 +69,4 @@ def crawl(url, seen=None):
             seen.add(url)
             seen.add(url)
 
 
     subtasks = group(crawl.s(url, seen) for url in wanted_urls)
     subtasks = group(crawl.s(url, seen) for url in wanted_urls)
-    subtasks.apply_async()
+    subtasks()

+ 2 - 2
examples/gevent/tasks.py

@@ -1,4 +1,4 @@
-import urllib2
+import requests
 
 
 from celery import task
 from celery import task
 
 
@@ -7,7 +7,7 @@ from celery import task
 def urlopen(url):
 def urlopen(url):
     print('Opening: {0}'.format(url))
     print('Opening: {0}'.format(url))
     try:
     try:
-        body = urllib2.urlopen(url).read()
+        _response = requests.get(url)
     except Exception as exc:
     except Exception as exc:
         print('Exception for {0}: {1!r}'.format(url, exc))
         print('Exception for {0}: {1!r}'.format(url, exc))
         return url, 0
         return url, 0

+ 1 - 1
examples/httpexample/manage.py

@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 #!/usr/bin/env python
 from django.core.management import execute_manager
 from django.core.management import execute_manager
 try:
 try:
-    import settings                 # Assumed to be in the same directory.
+    from . import settings  # Assumed to be in the same directory.
 except ImportError:
 except ImportError:
     import sys
     import sys
     sys.stderr.write(
     sys.stderr.write(

+ 1 - 1
examples/httpexample/urls.py

@@ -1,5 +1,5 @@
 from django.conf.urls.defaults import *
 from django.conf.urls.defaults import *
-import views
+from . import views
 
 
 # Uncomment the next two lines to enable the admin:
 # Uncomment the next two lines to enable the admin:
 # from django.contrib import admin
 # from django.contrib import admin

+ 2 - 2
extra/release/attribution.py

@@ -21,7 +21,7 @@ def proper_name(name):
 
 
 def find_missing_authors(seen):
 def find_missing_authors(seen):
     with open("AUTHORS") as authors:
     with open("AUTHORS") as authors:
-        known = map(author, authors.readlines())
+        known = [author(line) for line in authors.readlines()]
 
 
     seen_authors = set(filter(proper_name, (t[0] for t in seen)))
     seen_authors = set(filter(proper_name, (t[0] for t in seen)))
     seen_emails = set(t[1] for t in seen)
     seen_emails = set(t[1] for t in seen)
@@ -32,5 +32,5 @@ def find_missing_authors(seen):
 
 
 
 
 if __name__ == "__main__":
 if __name__ == "__main__":
-    find_missing_authors(map(author, fileinput.input()))
+    find_missing_authors([author(line) for line in fileinput.input()])
 
 

+ 4 - 2
extra/release/bump_version.py

@@ -14,6 +14,8 @@ from tempfile import NamedTemporaryFile
 
 
 rq = lambda s: s.strip("\"'")
 rq = lambda s: s.strip("\"'")
 
 
+str_t = str if sys.version_info[0] >= 3 else basestring
+
 
 
 def cmd(*args):
 def cmd(*args):
     return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0]
     return subprocess.Popen(args, stdout=subprocess.PIPE).communicate()[0]
@@ -23,7 +25,7 @@ def cmd(*args):
 def no_enoent():
 def no_enoent():
     try:
     try:
         yield
         yield
-    except OSError, exc:
+    except OSError as exc:
         if exc.errno != errno.ENOENT:
         if exc.errno != errno.ENOENT:
             raise
             raise
 
 
@@ -56,7 +58,7 @@ class TupleVersion(object):
         v = list(v)
         v = list(v)
 
 
         def quote(lit):
         def quote(lit):
-            if isinstance(lit, basestring):
+            if isinstance(lit, str_t):
                 return '"{0}"'.format(lit)
                 return '"{0}"'.format(lit)
             return str(lit)
             return str(lit)
 
 

+ 3 - 1
extra/release/sphinx-to-rst.py

@@ -3,6 +3,8 @@ import os
 import re
 import re
 import sys
 import sys
 
 
+from collections import Callable
+
 dirname = ""
 dirname = ""
 
 
 RE_CODE_BLOCK = re.compile(r'.. code-block:: (.+?)\s*$')
 RE_CODE_BLOCK = re.compile(r'.. code-block:: (.+?)\s*$')
@@ -51,7 +53,7 @@ def _process(lines):
     lines = list(lines)                                 # non-destructive
     lines = list(lines)                                 # non-destructive
     for i, line in enumerate(lines):
     for i, line in enumerate(lines):
         for regex, alt in TO_RST_MAP.items():
         for regex, alt in TO_RST_MAP.items():
-            if callable(alt):
+            if isinstance(alt, Callable):
                 match = regex.match(line)
                 match = regex.match(line)
                 if match:
                 if match:
                     alt(lines, i, match)
                     alt(lines, i, match)

+ 2 - 2
extra/release/verify_config_reference.py

@@ -1,6 +1,6 @@
 from __future__ import print_function
 from __future__ import print_function
 
 
-from fileinput import input
+from fileinput import input as _input
 from sys import exit, stderr
 from sys import exit, stderr
 
 
 from celery.app.defaults import NAMESPACES, flatten
 from celery.app.defaults import NAMESPACES, flatten
@@ -28,7 +28,7 @@ def find_undocumented_settings(directive='.. setting:: '):
     settings = dict(flatten(NAMESPACES))
     settings = dict(flatten(NAMESPACES))
     all = set(settings)
     all = set(settings)
     documented = set(line.strip()[len(directive):].strip()
     documented = set(line.strip()[len(directive):].strip()
-                        for line in input()
+                        for line in _input()
                             if line.strip().startswith(directive))
                             if line.strip().startswith(directive))
     return [setting for setting in all ^ documented
     return [setting for setting in all ^ documented
                 if not is_ignored(setting, settings[setting])]
                 if not is_ignored(setting, settings[setting])]

+ 1 - 2
funtests/benchmarks/req.py

@@ -1,11 +1,10 @@
 from celery import current_app, task, uuid
 from celery import current_app, task, uuid
-from celery.five import range
+from celery.five import Queue, range
 from celery.worker.consumer import Consumer
 from celery.worker.consumer import Consumer
 from celery.worker.job import Request
 from celery.worker.job import Request
 from celery.concurrency.solo import TaskPool
 from celery.concurrency.solo import TaskPool
 from celery.app.amqp import TASK_BARE
 from celery.app.amqp import TASK_BARE
 from time import time
 from time import time
-from Queue import Queue
 from librabbitmq import Message
 from librabbitmq import Message
 import socket
 import socket
 import sys
 import sys

+ 1 - 2
funtests/benchmarks/reqi.py

@@ -1,12 +1,11 @@
 from celery import current_app, task, uuid
 from celery import current_app, task, uuid
-from celery.five import range
+from celery.five import Queue, range
 from celery.worker.consumer import Consumer
 from celery.worker.consumer import Consumer
 #from celery.worker.job import Request
 #from celery.worker.job import Request
 from celery.app.task import Context
 from celery.app.task import Context
 from celery.concurrency.solo import TaskPool
 from celery.concurrency.solo import TaskPool
 from celery.app.amqp import TASK_BARE
 from celery.app.amqp import TASK_BARE
 from time import time
 from time import time
-from Queue import Queue
 from librabbitmq import Message
 from librabbitmq import Message
 from celery.utils.functional import noop
 from celery.utils.functional import noop
 from celery.worker.job import NEEDS_KWDICT
 from celery.worker.job import NEEDS_KWDICT

+ 2 - 1
funtests/benchmarks/timer.py

@@ -4,6 +4,7 @@ from __future__ import absolute_import
 import sys
 import sys
 
 
 from time import sleep
 from time import sleep
+from celery.five import range
 from celery.utils import timer2 as timer
 from celery.utils import timer2 as timer
 
 
 def noop(*args, **kwargs):
 def noop(*args, **kwargs):
@@ -11,7 +12,7 @@ def noop(*args, **kwargs):
 
 
 
 
 def insert(s, n=100000):
 def insert(s, n=100000):
-    for i in xrange(n):
+    for i in range(n):
         s.apply_after(1 + (i and i / 10.0), noop, (i, ))
         s.apply_after(1 + (i and i / 10.0), noop, (i, ))
 
 
 
 

+ 1 - 2
funtests/benchmarks/trace.py

@@ -1,11 +1,10 @@
 from celery import current_app, task, uuid
 from celery import current_app, task, uuid
-from celery.five import range
+from celery.five import Queue, range
 from celery.worker.consumer import Consumer
 from celery.worker.consumer import Consumer
 from celery.worker.job import Request
 from celery.worker.job import Request
 from celery.concurrency.solo import TaskPool
 from celery.concurrency.solo import TaskPool
 from celery.app.amqp import TASK_BARE
 from celery.app.amqp import TASK_BARE
 from time import time
 from time import time
-from Queue import Queue
 from librabbitmq import Message
 from librabbitmq import Message
 import socket
 import socket
 import sys
 import sys

+ 1 - 1
funtests/stress/stress/suite.py

@@ -117,7 +117,7 @@ class Suite(object):
         )
         )
 
 
     def manyshort(self):
     def manyshort(self):
-        self.join(group(add.s(i, i) for i in xrange(1000))(), propagate=True)
+        self.join(group(add.s(i, i) for i in range(1000))(), propagate=True)
 
 
     def runtest(self, fun, n=50, index=0, repeats=1):
     def runtest(self, fun, n=50, index=0, repeats=1):
         with blockdetection(self.block_timeout):
         with blockdetection(self.block_timeout):

+ 5 - 3
setup.py

@@ -145,10 +145,12 @@ py_version = sys.version_info
 def strip_comments(l):
 def strip_comments(l):
     return l.split('#', 1)[0].strip()
     return l.split('#', 1)[0].strip()
 
 
-
 def reqs(*f):
 def reqs(*f):
-    return list(filter(None, [strip_comments(l) for l in open(
-        os.path.join(os.getcwd(), 'requirements', *f)).readlines()]))
+    return [
+        r for r in (
+            strip_comments(l) for l in open(
+                os.path.join(os.getcwd(), 'requirements', *f)).readlines()
+        ) if r]
 
 
 install_requires = reqs('default.txt')
 install_requires = reqs('default.txt')
 if JYTHON:
 if JYTHON: