Browse Source

Merge branch 'master' into release23-maint

Ask Solem 13 years ago
parent
commit
dc92b4d19f

+ 2 - 3
Changelog

@@ -9,8 +9,7 @@
 
 2.3.0
 =====
-:release-date: TBA
-
+:release-date: 2011-08-05 12:00 P.M BST
 :tested: cPython: 2.5, 2.6, 2.7; PyPy: 1.5; Jython: 2.5.2
 
 .. _v230-important:
@@ -355,7 +354,7 @@ News
     * ``eventlet_pool_postshutdown``
     * ``eventlet_pool_apply``
 
-    See :ref:`signals` for more information.
+    See :mod:`celery.signals` for more information.
 
 * New :setting:`BROKER_TRANSPORT_OPTIONS` setting can be used to pass
   additional arguments to a particular broker transport.

+ 4 - 6
celery/backends/base.py

@@ -220,10 +220,9 @@ class BaseDictBackend(BaseBackend):
     def get_task_meta(self, task_id, cache=True):
         if cache and task_id in self._cache:
             try:
-              return self._cache[task_id]
+                return self._cache[task_id]
             except KeyError:
-              #The Backend has been emptied in the meantime
-              pass
+                pass   # backend emptied in the meantime
 
         meta = self._get_task_meta_for(task_id)
         if cache and meta.get("status") == states.SUCCESS:
@@ -240,10 +239,9 @@ class BaseDictBackend(BaseBackend):
     def get_taskset_meta(self, taskset_id, cache=True):
         if cache and taskset_id in self._cache:
             try:
-              return self._cache[taskset_id]
+                return self._cache[taskset_id]
             except KeyError:
-              #The Backend has been emptied in the meantime
-              pass
+                pass  # backend emptied in the meantime
 
         meta = self._restore_taskset(taskset_id)
         if cache and meta is not None:

+ 1 - 0
celery/beat.py

@@ -87,6 +87,7 @@ class ScheduleEntry(object):
         return self.__class__(**dict(self,
                                      last_run_at=last_run_at or datetime.now(),
                                      total_run_count=self.total_run_count + 1))
+    __next__ = next  # for 2to3
 
     def update(self, other):
         """Update values from another entry.

+ 1 - 1
celery/datastructures.py

@@ -311,7 +311,7 @@ class LocalCache(OrderedDict):
 
     def pop(self, key, *args):
         with self.lock:
-            self.pop(key, *args)
+            super(LocalCache, self).pop(key, *args)
 
 
 class TokenBucket(object):

+ 2 - 2
celery/tests/test_app/test_loaders.py

@@ -103,8 +103,8 @@ class TestLoaderBase(unittest.TestCase):
         self.assertEqual(self.loader.conf["foo"], "bar")
 
     def test_import_default_modules(self):
-        self.assertItemsEqual(self.loader.import_default_modules(),
-                              [os, sys, task])
+        self.assertEqual(sorted(self.loader.import_default_modules()),
+                         sorted([os, sys, task]))
 
     def test_import_from_cwd_custom_imp(self):
 

+ 2 - 2
celery/tests/test_backends/test_amqp.py

@@ -225,10 +225,10 @@ class test_AMQPBackend(unittest.TestCase):
                                     "traceback": None,
                                     "task_id": uuid})
                                 for i, uuid in enumerate(uuids)]
-        self.assertItemsEqual(res, expected_results)
+        self.assertEqual(sorted(res), sorted(expected_results))
         self.assertDictEqual(b._cache[res[0][0]], res[0][1])
         cached_res = list(b.get_many(uuids, timeout=1))
-        self.assertItemsEqual(cached_res, expected_results)
+        self.assertEqual(sorted(cached_res), sorted(expected_results))
         b._cache[res[0][0]]["status"] = states.RETRY
         self.assertRaises(socket.timeout, list,
                           b.get_many(uuids, timeout=0.01))

+ 7 - 7
celery/tests/test_events/test_events_state.py

@@ -105,14 +105,14 @@ class test_Task(unittest.TestCase):
                     received=time() - 10,
                     started=time() - 8,
                     succeeded=time())
-        self.assertItemsEqual(list(task._info_fields),
-                              task.info().keys())
+        self.assertEqual(sorted(list(task._info_fields)),
+                              sorted(task.info().keys()))
 
-        self.assertItemsEqual(list(task._info_fields + ("received", )),
-                              task.info(extra=("received", )))
+        self.assertEqual(sorted(list(task._info_fields + ("received", ))),
+                              sorted(task.info(extra=("received", ))))
 
-        self.assertItemsEqual(["args", "kwargs"],
-                              task.info(["args", "kwargs"]).keys())
+        self.assertEqual(sorted(["args", "kwargs"]),
+                         sorted(task.info(["args", "kwargs"]).keys()))
 
     def test_ready(self):
         task = Task(uuid="abcdefg",
@@ -278,7 +278,7 @@ class test_State(unittest.TestCase):
     def test_task_types(self):
         r = ev_snapshot(State())
         r.play()
-        self.assertItemsEqual(r.state.task_types(), ["task1", "task2"])
+        self.assertEqual(sorted(r.state.task_types()), ["task1", "task2"])
 
     def test_tasks_by_timestamp(self):
         r = ev_snapshot(State())

+ 1 - 1
celery/tests/test_slow/test_buckets.py

@@ -278,7 +278,7 @@ class test_TaskBucket(unittest.TestCase):
         x.buckets[TaskA.name].put(1)
         x.buckets[TaskB.name].put(2)
         x.buckets[TaskC.name].put(3)
-        self.assertItemsEqual(x.items, [1, 2, 3])
+        self.assertEqual(sorted(x.items), [1, 2, 3])
 
 
 class test_FastQueue(unittest.TestCase):

+ 2 - 2
celery/tests/test_utils/test_utils_info.py

@@ -39,5 +39,5 @@ class TestInfo(unittest.TestCase):
     def test_format_queues(self):
         celery = Celery(set_as_current=False)
         celery.amqp.queues = celery.amqp.Queues(QUEUES)
-        self.assertItemsEqual(celery.amqp.queues.format().split("\n"),
-                              [QUEUE_FORMAT1, QUEUE_FORMAT2])
+        self.assertEqual(sorted(celery.amqp.queues.format().split("\n")),
+                         sorted([QUEUE_FORMAT1, QUEUE_FORMAT2]))

+ 1 - 1
celery/tests/test_worker/test_worker.py

@@ -27,7 +27,7 @@ from celery.utils.timer2 import Timer
 
 from celery.tests.compat import catch_warnings
 from celery.tests.utils import unittest
-from celery.tests.utils import AppCase, skip
+from celery.tests.utils import AppCase
 
 
 class PlaceHolder(object):

+ 2 - 2
celery/tests/test_worker/test_worker_control.py

@@ -216,8 +216,8 @@ class test_ControlPanel(unittest.TestCase):
         state.revoked.add("a2")
 
         try:
-            self.assertItemsEqual(self.panel.handle("dump_revoked"),
-                                  ["a1", "a2"])
+            self.assertEqual(sorted(self.panel.handle("dump_revoked")),
+                             ["a1", "a2"])
         finally:
             state.revoked.clear()
 

+ 1 - 1
celery/utils/compat.py

@@ -21,7 +21,7 @@ except ImportError:
 try:
     from collections import OrderedDict
 except ImportError:
-    from ordereddict import OrderedDict
+    from ordereddict import OrderedDict  # noqa
 
 ############## logging.LoggerAdapter ########################################
 import logging

+ 1 - 0
celery/utils/timer2.py

@@ -173,6 +173,7 @@ class Timer(Thread):
                     self.not_empty.wait(1.0)
                 return delay
         return self.apply_entry(entry)
+    __next__ = next  # for 2to3
 
     def run(self):
         try:

+ 10 - 0
docs/cookbook/daemonizing.rst

@@ -262,3 +262,13 @@ launchd (OS X)
 
 .. _`contrib/mac/`:
     http://github.com/ask/celery/tree/master/contrib/mac/
+
+
+.. _daemon-windows:
+
+Windows
+=======
+
+See this excellent external tutorial:
+
+http://www.calazan.com/windows-tip-run-applications-in-the-background-using-task-scheduler/

BIN
docs/homepage/bg.png


BIN
docs/homepage/bg000000.png


BIN
docs/homepage/bg_conte.png


BIN
docs/homepage/bg_grass.png


BIN
docs/homepage/bg_top00.png


BIN
docs/homepage/black_10.png


+ 0 - 236
docs/homepage/celery_1.0_released.html

@@ -1,236 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<meta name="keywords" content="task queue, job queue, asynchronous, rabbitmq, amqp,
-redis, django, python, webhooks, queue, distributed">
-<meta name="description" content="open source distributed task queue" >
-<link rel="icon" type="image/png" href="favicon.png">
-<meta name="viewport" content="width=320, user-scalable=no">
-<link rel="apple-touch-icon" href="favicon_64.png"/>
-<title>Celery - The Distributed Task Queue</title>
-<link rel="stylesheet" href="main.css"/>
-<link rel="stylesheet" href="trac.css"/>
-<script type="text/javascript">
-var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
-document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
-</script>
-<script type="text/javascript">
-try {
-var pageTracker = _gat._getTracker("UA-12986238-1");
-pageTracker._trackPageview();
-} catch(err) {}</script>
-
-</head>
-
-<body>
-<div id="navbar">
-  <div class="iStretch">
-    <div class="link" id="current"><a href="/">Home</a></div>
-    <div class="link"><a href="http://github.com/ask/celery">Code</a></div>
-    <div class="link"><a href="docs/">Documentation</a></div>
-    <div class="link"><a href="http://ask.github.com/celery/getting-started/">Tutorials</a></div>
-    <div class="link"><a href="http://pypi.python.org/pypi/celery">Download</a></div>
-  </div>
-</div>
-
-<div class="iStretch">
-
-  <div id="topcontainer">
-  <ul>
-    <li>Background Processing
-    <li>Distributed
-    <li>Asynchronous/Synchronous
-    <li>Concurrency
-    <li>Periodic Tasks
-    <li>Retries
-  </ul>
-  </div>
-
-  <div id="contentcontainer">
-
-    <div class="column">
-<h1>Celery 1.0 has been released!</a></h1>
-<p>We&#8217;re happy to announce the release of Celery 1.0.</p>
-<div class="section" id="what-is-it">
-<h2>What is it?</h2>
-<p>Celery is a task queue/job queue based on distributed message passing.
-It is focused on real-time operation, but supports scheduling as well.</p>
-<p>The execution units, called tasks, are executed concurrently on one or
-more worker servers. Tasks can execute asynchronously (in the background) or synchronously
-(wait until ready).</p>
-<p>Celery is already used in production to process millions of tasks a day.</p>
-<p>Celery was originally created for use with Django, but is now usable
-from any Python project. It can
-also operate with other languages via webhooks.</p>
-<p>The recommended message broker is <a class="reference external" href="http://rabbitmq.org">RabbitMQ</a>, but support for Redis or
-database is also available.</p>
-<div class="section" id="features">
-<h3>Features</h3>
-<p>See <a class="reference external" href="http://ask.github.com/celery/getting-started/introduction.html#features">http://ask.github.com/celery/getting-started/introduction.html#features</a></p>
-</div>
-</div>
-<div class="section" id="stable-api">
-<h2>Stable API</a></h2>
-<p>From this version on the public API is considered stable. This means there won&#8217;t
-be any backwards incompatible changes in new minor versions. Changes to the
-API will be deprecated; so, for example, if we decided to remove a function
-that existed in Celery 1.0:</p>
-<ul class="simple">
-<li>Celery 1.2 will contain a backwards-compatible replica of the function which
-will raise a <tt class="docutils literal"><span class="pre">PendingDeprecationWarning</span></tt>.
-This warning is silent by default; you need to explicitly turn on display
-of these warnings.</li>
-<li>Celery 1.4 will contain the backwards-compatible replica, but the warning
-will be promoted to a full-fledged <tt class="docutils literal"><span class="pre">DeprecationWarning</span></tt>. This warning
-is loud by default, and will likely be quite annoying.</li>
-<li>Celery 1.6 will remove the feature outright.</li>
-</ul>
-<p>See the <a class="reference external" href="http://ask.github.com/celery/internals/deprecation.html">Celery Deprecation Timeline</a> for a list of pending removals.</p>
-</div>
-<div class="section" id="what-s-new">
-<h2>What&#8217;s new?</h2>
-<ul>
-<li><p class="first">Task decorators</p>
-<p>Write tasks as regular functions and decorate them.
-There are both <tt class="xref docutils literal"><span class="pre">task()</span></tt>, and <tt class="xref docutils literal"><span class="pre">periodic_task()</span></tt> decorators.</p>
-</li>
-<li><p class="first">Tasks are automatically registered</p>
-<p>Registering the tasks manually was getting tedious, so now you don&#8217;t have
-to anymore. You can still do it manually if you need to, just
-disable <tt class="xref docutils literal"><span class="pre">Task.autoregister</span></tt>. The concept of abstract task classes
-has also been introduced, this is like django models, where only the
-subclasses of an abstract task is registered.</p>
-</li>
-<li><p class="first">Events</p>
-<p>If enabled, the worker will send events, telling you what tasks it
-executes, their results, and how long it took to execute them. It also
-sends out heartbeats, so listeners are able to detect nonfunctional
-workers. This is the basis for the new real-time web monitor we&#8217;re working on
-(<a class="reference external" href="http://github.com/ask/celerymon/">celerymon</a>)</p>
-</li>
-</ul>
-<ul>
-<li><p class="first">Rate limiting</p>
-<p>Global and per task rate limits. 10 tasks a second? or one an hour? You
-decide. It&#8217;s using the awesome <a class="reference external" href="http://en.wikipedia.org/wiki/Token_bucket">token bucket algorithm</a>, which is
-commonly used for network traffic shaping. It accounts for bursts of
-activity, so your workers won&#8217;t be bored by having nothing to do.</p>
-</li>
-</ul>
-<ul>
-<li><p class="first">New periodic task service.</p>
-<p>Periodic tasks are no longer dispatched by <tt class="docutils literal"><span class="pre">celeryd</span></tt>, but instead by a
-separate service called <tt class="docutils literal"><span class="pre">celerybeat</span></tt>. This is an optimized, centralized
-service dedicated to your periodic tasks, which means you don&#8217;t have to
-worry about deadlocks or race conditions any more. But that does mean you
-have to make sure only one instance of this service is running at any one
-time.</p>
-<p><strong>TIP:</strong> If you&#8217;re only running a single <tt class="docutils literal"><span class="pre">celeryd</span></tt> server, you can embed
-<tt class="docutils literal"><span class="pre">celerybeat</span></tt> inside it. Just add the <tt class="docutils literal"><span class="pre">--beat</span></tt> argument.</p>
-</li>
-<li><p class="first">Broadcast commands</p>
-<p>If you change your mind and don&#8217;t want to run a task after all, you
-now have the option to revoke it.</p>
-<p>Also, you can rate limit tasks or even shut down the worker remotely.</p>
-<p>It doesn&#8217;t have many commands yet, but we&#8217;re waiting for broadcast
-commands to reach its full potential, so please share your ideas
-if you have any.</p>
-</li>
-<li><p class="first">Multiple queues</p>
-<p>The worker is able to receive tasks on multiple queues at once.
-This opens up a lot of new possibilities when combined with the impressive
-routing support in AMQP.</p>
-</li>
-<li><p class="first">Platform agnostic message format.</p>
-<p>The message format has been standardized and is now using the ISO-8601 format
-for dates instead of Python <tt class="docutils literal"><span class="pre">datetime</span></tt> objects. This means you can write task
-consumers in other languages than Python (<tt class="docutils literal"><span class="pre">eceleryd</span></tt> anyone?)</p>
-</li>
-<li><p class="first">Timely</p>
-<p>Periodic tasks are now scheduled on the clock, i.e. <tt class="docutils literal"><span class="pre">timedelta(hours=1)</span></tt>
-means every hour at :00 minutes, not every hour from the server starts.
-To revert to the previous behavior you have the option to enable
-<tt class="xref docutils literal"><span class="pre">PeriodicTask.relative</span></tt>.</p>
-</li>
-<li><p class="first">... and a lot more!</p>
-</li>
-</ul>
-<p>To read about these and other changes in detail, please refer to
-the <a class="reference external" href="http://ask.github.com/celery/changelog.html">changelog</a>. This document contains crucial information for those
-upgrading from a previous version of Celery, so be sure to read the entire
-change set before you continue.</p>
-<p><strong>TIP:</strong> If you install the <tt class="xref docutils literal"><span class="pre">setproctitle</span></tt> module you can see which
-task each worker process is currently executing in <tt class="docutils literal"><span class="pre">ps</span></tt> listings.
-Just install it using pip: <tt class="docutils literal"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">setproctitle</span></tt>.</p>
-</div>
-<div class="section" id="resources">
-<h2>Resources</h2>
-<ul class="simple">
-<li><a class="reference external" href="http://docs.celeryproject.org/">Documentation</a></li>
-<li><a class="reference external" href="http://docs.celeryproject.org/changelog.html">Changelog</a></li>
-<li><a class="reference external" href="http://ask.github.com/celery/faq.html">FAQ</a></li>
-<li><a class="reference external" href="http://groups.google.com/group/celery-users">Mailing-list</a></li>
-<li><a class="reference external" href="http://twitter.com/asksol">Twitter</a></li>
-<li>IRC: #celery on irc.freenode.net.</li>
-</ul>
-</div>
-
-
-    <div class="hidden">
-        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        </p>
-        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        </p>
-        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-        </p>
-    </div>
-    </div>
-
-    <div class="column">
-
-      <span class="newsitem">
-      <h2>Celery 1.0 released!</h2>
-      <h4>By <a href="http://twitter.com/asksol">@asksol</a> on 10.02.2010</h4>
-      <p>Celery 1.0 has finally been released! It is available on <a
-          href="http://pypi.python.org/pypi/celery/1.0.0">PyPI</a> for
-      downloading. You can also install it via <code>pip install
-          celery</code>. You can read the announcement <a href="celery_1.0_released.html">here</a>.
-      <hr>
-      </span>
-
-      <span class="newsitem">
-      <h2>1.0 is in beta.</h2>
-      <h4>By <a href="http://twitter.com/asksol">@asksol</a> on 08.02.2010</h4>
-      <p>1.0 is scheduled to be released this week! Please help us test the latest
-      <a href="http://github.com/ask/celery/tarball/v1.0.0-pre4">release
-          candiate</a> to make this happen. To upgrade from an earlier
-      version, please read the <a href="http://ask.github.com/celery/changelog.html">changelog</a>.
-      <hr>
-      </span>
-
-      <span class="newsitem">
-      <h2>New website.</h2>
-      <h4>By <a href="http://twitter.com/asksol">@asksol</a> on 08.02.2010</h4>
-      <p>We finally got a home page. Big thanks to <a href="http://helmersworks.com">Jan Henrik Helmers</a>
-      <hr>
-      </span>
-
-    </div>
-
-  </div>
-
- <div id="credits">
-     <div class="iStretch">Copyright (c) 2009-2011, <a href="http://twitter.com/asksol">Ask Solem</a> and
-         <a href="http://github.com/ask/celery/blob/master/AUTHORS">contributors</a>.<br>
- Page design by <a href="http://www.helmersworks.com/">Jan Henrik Helmers</a>
-   </div>
- </div>
-
-
-</div>
-</body>
-</html>

+ 0 - 316
docs/homepage/community.html

@@ -1,316 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<html>
-<head>
-<meta charset="utf-8">
-<meta name="keywords" content="task queue, job queue, asynchronous, rabbitmq, amqp,
-redis, django, python, webhooks, queue, distributed">
-<meta name="description" content="open source distributed task queue" >
-<link rel="icon" type="image/png" href="favicon0.png">
-<meta name="viewport" content="width=500, user-scalable=no">
-<link rel="apple-touch-icon" href="favicon_64.png"/>
-<title>Celery - The Distributed Task Queue</title>
-<link rel="stylesheet" href="main0000.css"/>
-<link rel="stylesheet" href="trac0000.css"/>
-<script type="text/javascript">
-var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
-document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
-</script>
-<script type="text/javascript">
-try {
-var pageTracker = _gat._getTracker("UA-12986238-1");
-pageTracker._trackPageview();
-} catch(err) {}</script>
-
-
-
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
-
-</head>
-
-<body>
-<div id="navbar">
-  <div class="iStretch">
-    <div class="link"><a href="index.html">Home</a></div>
-    <div class="link"><a href="http://github.com/ask/celery">Code</a></div>
-    <div class="link"><a href="docs/">Documentation</a></div>
-    <div class="link" id="current"><a href="community.html">Community</a></div>
-    <div class="link"><a href="http://pypi.python.org/pypi/celery">Download</a></div>
-  </div>
-</div>
-
-<div class="iStretch">
-
-  <div id="topcontainer">
-  <ul>
-    <li>Background Processing
-    <li>Distributed
-    <li>Asynchronous/Synchronous
-    <li>Concurrency
-    <li>Periodic Tasks
-    <li>Retries
-  </ul>
-  </div>
-
-  <div id="contentcontainer">
-
-    <div class="column">
-        <h2>Community Links</h2>
-
-<p class="communitylink"><a href="http://query7.com/tutorial-celery-with-django
-">Using Celery With Django Tutorial (query7.com)</a></p>
-<p class="communitylink"><a href="http://trespams.com/2011/04/03/celery-redis-and-django/
-">Celery, Redis and Django Tutorial (trespams.com)</a></p>
-<p class="communitylink"><a href="http://trespams.com/2011/04/03/celery-i-redis/
-">Celery i Redis (trespams.com) (Catalan)</a></p>
-<p class="communitylink"><a href="http://tomwardill.posterous.com/using-fabric-from-celery-in-django
-">Using Fabric from Celery in Django (tomwardill.posterous.com)</a></p>
-<p class="communitylink"><a href="http://blip.tv/file/4878746
-">PyCon-2011: Distributed Tasks with Celery (Video) (pycon.blip.tv)</a></p>
-<p class="communitylink"><a href="http://www.slideshare.net/zeeg/pycon-2011-scaling-disqus-7251315
-">PyCon-2011: Scaling Disqus (slideshare.net)</a></p>
-<p class="communitylink"><a href="http://www.quora.com/How-stable-is-Celery
-">How stable is Celery? (quora.com)</a></p>
-<p class="communitylink"><a href="https://getpantheon.com/news/behind-scenes-pantheon-api
-">Behind The Scenes: Pantheon as an API (getpantheon.com)</a></p>
-<p class="communitylink"><a href="http://eflorenzano.com/blog/post/technology-behind-convore/
-">The Technology Behind Convore (eflorenzano.com)</a></p>
-<p class="communitylink"><a href="http://buntin.org/2011/02/27/django-celery-for-non-blocking-django-signals/
-">django-celery for non-blocking Django signals. (buntin.org)</a></p>
-<p class="communitylink"><a href="http://www.whiskeymedia.com/news/the-whiskey-technology-stack/4/
-">The Whiskey Technology Stack (whiskeymedia.com)</a></p>
-<p class="communitylink"><a href="http://www.toforge.com/2011/02/a-simple-python-sandbox-for-celery-and-not/
-">A simple python sandbox for Celery and not (toforge.com)</a></p>
-<p class="communitylink"><a href="http://www.ep.io/blog/celery-ssl-and-loadbalancers/
-">Celery, SSL, and Load Balancers (ep.io)</a></p>
-<p class="communitylink"><a href="http://docs.dotcloud.com/tutorials/celery/
-">Deploying a Celery worker on DotCloud (dotcloud.com)</a></p>
-<p class="communitylink"><a href="http://joshbohde.com/blog/async-workers-in-django-with-celery
-">Async Workers in Django with Celery (joshbohde.com)</a></p>
-<p class="communitylink"><a href="http://www.colinhowe.co.uk/2011/02/08/celery-and-sentry-recording-errors/
-">Celery and Sentry - Recording Errors (colinhowe.co.uk)</a></p>
-<p class="communitylink"><a href="http://blog.apsl.net/2011/01/14/introduccion-a-celery/
-">Introducción a Celery (Spanish) (apsl.net)</a></p>
-<p class="communitylink"><a href="http://haltu.fi/en/b/qml_wrapper_service_explained.html
-">QML wrapper service explained (haltu.fi)</a></p>
-<p class="communitylink"><a href="http://bmbouter.github.com/CeleryManagement/getting-started/introduction.html
-">CeleryManagement - monitor and manage Celery installations (github.com)</a></p>
-<p class="communitylink"><a href="http://mindby.org/2011/02/celery-and-twisted/
-">Celery and Twisted (mindby.org)</a></p>
-<p class="communitylink"><a href="http://sci-blog.com/2010/11/celery-configuration-for-redis-backend/
-">Celery configuration for Redis backend (sci-blog.com)</a></p>
-<p class="communitylink"><a href="http://www.toforge.com/2011/01/run-celery-tasks-from-php/
-">Run Celery tasks from PHP (toforge.com)</a></p>
-<p class="communitylink"><a href="http://seeknuance.com/2010/12/17/celery-uses-spin-loops-gah/
-">Celery uses spin-loops. Gah! (seeknuance.com)</a></p>
-<p class="communitylink"><a href="http://richard.volpato.net/2011/01/10/architecture-of-statistically-powered-web-sites/
-">Architecture of Data Powered Web Sites (richard.volpato.net)</a></p>
-<p class="communitylink"><a href="http://blog.gridcentriclabs.com/2011/01/how-fast-can-you-add-more-worker-nodes.html
-">How fast can you add more worker nodes? (gridcentriclabs.com)</a></p>
-<p class="communitylink"><a href="http://bitkickers.blogspot.com/2011/01/getting-arbitrary-log-files-into.html
-">Getting arbitrary log files into Rsyslog (bitkickers)</a></p>
-<p class="communitylink"><a href="http://www.howsthe.com/blog/2010/dec/13/making-celery-pymongo-play-nicely/
-">Making Celery and PyMongo play nicely together (howsthe.com)</a></p>
-<p class="communitylink"><a href="http://trespams.com/2010/11/28/celery-mini-tutorial/
-">Celery: Mini Tutorial (Catalan) (trespams.com)</a></p>
-<p class="communitylink"><a href="http://ericholscher.com/blog/2010/nov/11/building-django-app-server-chef-part-4/
-">Building a Django App Server with Chef (ericholscher.com)</a></p>
-<p class="communitylink"><a href="http://trespams.com/2010/11/13/introduccio-celery/
-">Introducció a Celery (Catalan) (trespams.com)</a></p>
-
-<p class="communitylink"><a href="http://tensixtyone.com/django-and-celery-death-to-cron
-">Django and Celery - Death to Cron (tensixtyone.com)</a></p>
-
-<p class="communitylink"><a href="http://ericholscher.com/blog/2010/nov/2/celery-tips/
-">Celery Tips (ericholscher.com)</a></p>
-
-<p class="communitylink"><a href="http://jacobian.org/writing/favorite-apps/
-">What's your favorite Django app? (jacobian.org)</a></p>
-
-<p class="communitylink"><a href="http://ericholscher.com/blog/2010/nov/1/virtualenv-tips/
-">Virtualenv Tips (ericholscher.com)</a></p>
-
-<p class="communitylink"><a href="http://iamseb.com/seb/2010/10/10-django-tools/
-">10 Tools That Make Django Better (iamseb.com)</a></p>
-
-<p class="communitylink"><a href="http://www.loose-bits.com/2010_10_10_archive.html
-">Distributed Task Locking in Celery (loose-bits.com)</a></p>
-
-<p class="communitylink"><a href="http://www.bitbybit.ru/article/216
-">Celery — распределенные очереди задач на Python (Russian) (bitbybit.ru)</a></p>
-
-<p class="communitylink"><a href="http://vorushin.ru/blog/34-celery-described/
-">Подробнее о Celery (Russian) (vorushin.ru)</a></p>
-
-<p class="communitylink"><a href="http://blog.timc3.com/2010/10/17/celery-rabbitmq-and-sending-messages-directly/
-">Celery, RabbitMQ and sending messages directly. (timc3.com)</a></p>
-
-<p class="communitylink"><a href="http://blog.avelino.us/2010/10/cron-dentro-do-django-com-celery.html
-">Cron dentro do Django com Celery (Portugese) (avelino.us)</a></p>
-
-<p class="communitylink"><a href="http://d.hatena.ne.jp/yuku_t/
-">RabbitMQとCeleryを使ってDjangoでジョブキューしてみる (Japanese) (hatena.ne.jp)</a></p>
-
-<p class="communitylink"><a href="http://www.scribd.com/doc/37562923/Kaninchen-Schlangen-RabbitMQ-Python
-">Kaninchen & Schlangen: RabbitMQ & Python (German) (scribd.com)</a></p>
-
-<p class="communitylink"><a href="http://www.scribd.com/doc/39203296/Celery-Eine-asynchrone-Task-Queue-nicht-nur-fur-Django
-">Celery - Eine asynchrone Task Queue (nicht nur) für Django (German) (scribd.com) </a></p>
-
-<p class="communitylink"><a href="http://blog.historio.us/asynchronous-processing-using-celery
-">Asynchronous Processing Using Celery (historio.us)</a></p>
-
-<p class="communitylink"><a href="http://www.slideshare.net/shawnrider/massaging-the-pony-message-queues-and-you
-">"Massaging the Pony: Message Queues and You" (Djangocon 2010)</a></p>
-
-<p class="communitylink"><a href="http://www.slideshare.net/ericholscher/large-problems
-">"Large problems, Mostly Solved" (Djangocon 2010)</a></p>
-
-<p class="communitylink"><a href="http://shawnmilo.blogspot.com/2010/07/simple-celery-with-django-how-to.html
-">A Simple Celery with Django How-To (shawnmilo.blogspot.com)</a></p>
-
-<p class="communitylink"><a href="http://www.davidfischer.name/2010/09/django-and-asynchronous-jobs/
-">Django and asynchronous jobs (davidfischer.com)</a></p>
-
-<p class="communitylink"><a href="http://www.proft.com.ua/2010/09/4/celery-dobavlyaem-parallelizm-v-django/
-">Celery: добавляем параллелизм в Django (Russian) (proft.com.ua)</a></p>
-
-<p class="communitylink"><a href="http://in.pycon.org/2010/static/files/talks/50/mahendra-celery-pycon-2010.pdf
-">Celery presentation at PyCon India 2010 (PDF slides) (in.pycon.org)</a></p>
-
-<p class="communitylink"><a href="http://tumblr.whatupderek.com/post/1072002968/celery-django-and-virtualenv-playing-nice
-">celery, django and virtualenv playing nice. (whatupderek.com)</a></p>
-
-<p class="communitylink"><a href="http://justinvoss.wordpress.com/2010/06/22/django-task-queueing-with-celery/
-">Django Task Queueing with Celery (justinvoss.wordpress.com)</a></p>
-
-<p class="communitylink"><a href="http://www.slideshare.net/matclayton/django-celery
-">django-celery presentation at DJUGL 2010. (slideshare.net)</a></p>
-
-<p class="communitylink">
-<a href="http://bitkickers.blogspot.com/2010/07/djangocelery-quickstart-or-how-i.html
-">Django/Celery Quickstart (or, how I learned to stop using cron and love
-celery) (bitkickers.blogsport.com)</a></p>
-
-<p class="communitylink">
-<a href="http://blog.notdot.net/2010/06/Using-Python-magic-to-improve-the-deferred-API
-">Using Python magic to improve the deferred API (notdot.net)</a></p>
-
-<p class="communitylink">
-<a href="http://jasonmbaker.com/how-celery-carrot-and-your-messaging-stack-wo
-">How Celery, Carrot, and your messaging stack work (jasonmbaker.com)</a></p>
-
-<p class="communitylink">
-<a href="http://ericholscher.com/blog/2010/jun/23/large-problems-django-mostly-solved-delayed-execut/
-">Large Problems in Django, Mostly Solved: Delayed Execution (ericholscher.com)</a></p>
-
-<p class="communitylink">
-
-    <div style="width:425px;text-align:left" id="__ss_2089054">
-    <a style="font:14px Helvetica,Arial,Sans-serif;display:block;
-    margin:12px 0 3px 0;text-decoration:underline;" 
-    href="http://www.slideshare.net/idangazit/an-introduction-to-celery"
-    title="An Introduction to Celery">An Introduction to Celery</a>
-    <object style="margin:0px" width="425" height="355"> <param name="movie"
-    value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=pyweb-celery-090929081406-phpapp01&stripped_title=an-introduction-to-celery" />
-    <param name="allowFullScreen" value="true"/><param name="allowScriptAccess"
-    value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=pyweb-celery-090929081406-phpapp01&stripped_title=an-introduction-to-celery" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355">
-    </embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more
-    <a style="text-decoration:underline;"
-    href="http://www.slideshare.net/">documents</a>
-    from <a style="text-decoration:underline;"
-    href="http://www.slideshare.net/idangazit">Idan Gazit</a>.</div></div>
-</p>
-
-<p class="communitylink">
-<a href="http://robertpogorzelski.com/blog/2009/09/10/rabbitmq-celery-and-django/
-">RabbitMQ, Celery and Django (robertpogorzelski.com)</a>
-
-<p>
-Great Celery tutorial by Robert Pogorzelski at his blog "Happy Stream of
-Thoughts"</p>
-
-<p class="communitylink">
-<a href="http://mathematism.com/2010/feb/16/message-queues-django-and-celery-quick-start/
-">Message Queues, Django and Celery Quick Start (mathematism.com)</a>
-</p>
-
-<p class="communitylink">
-<a href="http://www.turnkeylinux.org/blog/django-celery-rabbitmq
-">Background task processing and deferred execution in Django (turnkeylinux.org)</a>.
-</p>
-
-<p class="communitylink">
-<a href="http://timbull.com/build-a-processing-queue-with-multi-threading
-">Build a processing queue [...] in less than a day using RabbitMQ and
-Celery (timbull.com)</a>
-
-<p class="communitylink">
-<a href="http://www.playingwithwire.com/2009/10/how-to-get-celeryd-to-work-on-freebsd/
-">How to get celeryd to work on FreeBSD (playingwithwire.com)</a>
-
-<p>
-Installing multiprocessing on FreeBSD isn't that easy, but thanks to Viktor Petersson
-we now have a step-to-step guide.
-</p>
-
-<p class="communitylink">
-<a href="http://ojs.pythonpapers.org/index.php/tppm/article/viewFile/105/122
-">Web-based 3D animation software (PDF) (ojs.pythonpapers.org)</a></p>
-<p>
-Indy Chang Liu at ThinkingCactus uses Celery to render animations
-asynchronously.
-</p>
-
-<p class="communitylink">
-<a href="http://stepsandnumbers.com/archive/2010/01/04/queued-storage-backend-for-django/
-">Queued Storage Backend for Django (stepsandnumbers.com)</a>
-</p>
-
-<p class="communitylink">
-<a href="http://www.slideshare.net/hungryblank/rabbitmq-with-python-and-ruby-rupy-2009
-">RabbitMQ with Python and Ruby (RuPy 2009) (slideshare.net)</a>
-</p>
-    </div>
-
-
-<div class="column side">
-    <h2>Resources</h2>
-
-    <ul>
-        <li><a
-            href="http://wiki.github.com/ask/celery">Who's using Celery</a></li>
-        <li><a href="http://wiki.github.com/ask/celery/">Celery
-            Wiki</a></li>
-        <li><a
-            href="http://stackoverflow.com/search?q=celery&tab=newest">Celery
-            questions on Stack Overflow</a></li>
-        <li><a
-            href="http://blog.gmane.org/gmane.comp.python.amqp.celery.user">celery-users
-            mailing list archive</a></li>
-        <li><a href="http://botland.oebfare.com/logger/celery/">IRC Logs
-            for the <code>#celery</code> channel</a></li>
-    </ul>
-    </div>
-    <div style="clear:both"></div>
-    </div>
-
- <div id="credits">
-   <ul>
-     <li>
-       <strong>Copyright (c) 2009, 2011</strong>
-       <span><a href="http://twitter.com/asksol">Ask Solem</a> and
-         <a href="http://github.com/ask/celery/blob/master/AUTHORS">contributors</a>.</span>
-     </li>
-     <li>
-       <strong>Web Design</strong>
-       <span><a href="http://www.helmersworks.com/">Jan Henrik Helmers</a></span>
-     </li>
-   </ul>
- </div>
-
-
-</div>
-</body>
-</html>
-
-<!-- This document saved from http://celeryproject.org/ -->

BIN
docs/homepage/documentation.png


+ 0 - 4
docs/homepage/examplerun.txt

@@ -1,4 +0,0 @@
-
->>> result = add.delay(8, 8)
->>> result.wait() # wait for and return the result
-16

+ 0 - 6
docs/homepage/exampletask.txt

@@ -1,6 +0,0 @@
-from celery.task import task
-
-
-@task
-def add(x, y):
-    return x + y

BIN
docs/homepage/favicon.png


BIN
docs/homepage/favicon0.png


BIN
docs/homepage/favicon_128.png


BIN
docs/homepage/favicon_32.png


BIN
docs/homepage/favicon_64.png


File diff suppressed because it is too large
+ 0 - 39
docs/homepage/index.html


BIN
docs/homepage/logo0000.png


+ 0 - 209
docs/homepage/main0000.css

@@ -1,209 +0,0 @@
-body {
-  background: #9aa090 url(bg.png) 50% 0 repeat;
-  color: #230;
-  font: 15px/1.75em Georgia, serif;
-  margin: 0;
-  overflow-x: hidden;
-  overflow-y: scroll;
-}
-
-a {
-  color: #230;
-  text-decoration: none;
-  border-bottom: 2px solid #959989;
-  -webkit-transition: 0.2s;
-  background-color: rgba(0,0,0,0.05);
-}
-
-a:hover {
-  color: #2c3c00;
-  background-color: #c3dc64;
-  border-color: #779820;
-}
-
-.iStretch {
-  margin: 0 auto;
-  width: 820px;
-}
-
-.highlight {
-  background: #222;
-  border: 5px solid #222;
-  border-radius: 3px;
-}
-
-#navbar {
-  font-size: 0.85em;
-  line-height: 1.7em;
-  position: fixed;
-  height: 23px;
-  top: 0;
-  left: 0;
-  right: 0;
-  overflow: hidden;
-}
-
-#navbar .iStretch {
- height: 23px;
- overflow: hidden;
-}
-
-#navbar .iStretch div {
-  float: right;
-  padding: 1px 10px;
-  margin: 0;
-  text-align: center;
-  -webkit-transition: 0.2s;
-}
-
-#navbar .iStretch div:hover {
-  color: #2c3c00;
-  background-color: #c3dc64;
-}
-
-#navbar a {
-  background-color: transparent;
-  border: none;
-}
-
-#navbar .iStretch div#current {
-  float: left;
-  background-color: #959989;
-}
-
-#topcontainer {
-  padding: 65px 0 25px 0;
-  text-align: right;
-  background: transparent url(logo0000.png) 0% 50% no-repeat;
-}
-
-#topcontainer ul{
-  display: inline-block;
-  width: 420px;
-  height: 100px;
-  padding: 0;
-  margin: 0;
-  list-style: none;
-  overflow: hidden;
-}
-
-#topcontainer ul li{
-  display: inline-block;
-  text-align: center;
-  padding: 0 10px;
-  width: 190px;
-  color: rgba(0,0,0,0.5);
-  text-shadow: 0 2px 5px rgba(0,0,0,0.5);
-}
-
-#contentcontainer, #navbar {
-  background: transparent url(white_50.png);
-  outline: 1px solid #797e6c;
-  box-shadow: 0 0 5px #4e543f;
-  -webkit-box-shadow: 0 0 5px #4e543f;
-  -moz-box-shadow: 0 0 5px #4e543f;
-}
-
-.column {
-  line-height: 1.6em;
-  width: 440px;
-  padding: 40px 20px 0 40px;
-  font-size: 0.9em;
-  vertical-align: top;
-  padding-bottom: 30px;
-  display: block;
-  float: left;
-}
-
-.column.side {
-  width: 250px;
-  float: right;
-  padding: 40px 36px 0 30px;
-  background: transparent url(black_10.png);
-}
-
-#credits ul {
-  list-style: none;
-  margin: 0;
-  padding: 0;
-}
-
-#credits ul li {
-  font-size: 0.85em;
-  float: left;
-  vertical-align: top;
-  width: 185px;
-  padding: 10px;
-}
-
-#credits ul li strong{
-  display: block;
-}
-
-
-/* Restyling default elements */
-h2 {
-  margin-top: 0;
-  margin-bottom: 0;
-  font-size: 1.7em;
-  font-weight: normal;
-  line-height: 1em;
-}
-
-h3 {
-  margin-bottom: 0;
-  font-size: 1.2em;
-}
-
-.newsitem h2 {
-  text-shadow: none;
-}
-
-.newsitem h4 {
-  font-size: 0.8em;
-  margin: 0;
-  margin-bottom: 1.15em;
-  font-weight: normal;
-}
-
-p.introduction {
-  line-height: 1.6em;
-  font-weight: bold;
-}
-
-hr {
-  border-top: 1px dashed #547a1a;
-  border-bottom: none;
-  margin-top: 20px;
-}
-
-.hidden {
-    color: #e1edc1;
-}
-
-
-/* Adapting to small screens */
-
-@media (max-width: 500px) {
-  .iStretch {
-    width: 90%;
-  }
-
-  .column, .column.side {
-    width: 88%;
-    padding: 7%;
-    overflow: hidden;
-  }
-
-  #topcontainer {
-    background-position: 50% 50%;
-  }
-
-  #topcontainer ul{
-    visibility: hidden;
-  }
-
-  #contentcontainer {
-    overflow: hidden;
-  }
-}

+ 0 - 9
docs/homepage/point0.html

@@ -1,9 +0,0 @@
-      <span class="newsitem">
-      <h2>Celery 1.0 released</h2>
-      <h4>By Ask on 06.02.2010</h4>
-      <p>Celery 1.0 has finally been released! It's available on <a
-          href="#">PyPI</a> for downloading. You can also install it via <code>pip install -U
-          celery</code>. You can read the announcement <a href="#">here</a></p>
-      <hr>
-      </span>
-

+ 0 - 69
docs/homepage/trac0000.css

@@ -1,69 +0,0 @@
-.hll { background-color: #404040 }
-.c { color: #999999; font-style: italic } /* Comment */
-.err { color: #a61717; background-color: #e3d2d2 } /* Error */
-.g { color: #d0d0d0 } /* Generic */
-.k { color: #6ab825; font-weight: bold } /* Keyword */
-.l { color: #d0d0d0 } /* Literal */
-.n { color: #d0d0d0 } /* Name */
-.o { color: #d0d0d0 } /* Operator */
-.x { color: #d0d0d0 } /* Other */
-.p { color: #d0d0d0 } /* Punctuation */
-.cm { color: #999999; font-style: italic } /* Comment.Multiline */
-.cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */
-.c1 { color: #999999; font-style: italic } /* Comment.Single */
-.cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
-.gd { color: #d22323 } /* Generic.Deleted */
-.ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
-.gr { color: #d22323 } /* Generic.Error */
-.gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
-.gi { color: #589819 } /* Generic.Inserted */
-.go { color: #cccccc } /* Generic.Output */
-.gp { color: #aaaaaa } /* Generic.Prompt */
-.gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
-.gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
-.gt { color: #d22323 } /* Generic.Traceback */
-.kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */
-.kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */
-.kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */
-.kp { color: #6ab825 } /* Keyword.Pseudo */
-.kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */
-.kt { color: #6ab825; font-weight: bold } /* Keyword.Type */
-.ld { color: #d0d0d0 } /* Literal.Date */
-.m { color: #3677a9 } /* Literal.Number */
-.s { color: #ed9d13 } /* Literal.String */
-.na { color: #bbbbbb } /* Name.Attribute */
-.nb { color: #24909d } /* Name.Builtin */
-.nc { color: #447fcf; text-decoration: underline } /* Name.Class */
-.no { color: #40ffff } /* Name.Constant */
-.nd { color: #ffa500 } /* Name.Decorator */
-.ni { color: #d0d0d0 } /* Name.Entity */
-.ne { color: #bbbbbb } /* Name.Exception */
-.nf { color: #447fcf } /* Name.Function */
-.nl { color: #d0d0d0 } /* Name.Label */
-.nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */
-.nx { color: #d0d0d0 } /* Name.Other */
-.py { color: #d0d0d0 } /* Name.Property */
-.nt { color: #6ab825; font-weight: bold } /* Name.Tag */
-.nv { color: #40ffff } /* Name.Variable */
-.ow { color: #6ab825; font-weight: bold } /* Operator.Word */
-.w { color: #666666 } /* Text.Whitespace */
-.mf { color: #3677a9 } /* Literal.Number.Float */
-.mh { color: #3677a9 } /* Literal.Number.Hex */
-.mi { color: #3677a9 } /* Literal.Number.Integer */
-.mo { color: #3677a9 } /* Literal.Number.Oct */
-.sb { color: #ed9d13 } /* Literal.String.Backtick */
-.sc { color: #ed9d13 } /* Literal.String.Char */
-.sd { color: #ed9d13 } /* Literal.String.Doc */
-.s2 { color: #ed9d13 } /* Literal.String.Double */
-.se { color: #ed9d13 } /* Literal.String.Escape */
-.sh { color: #ed9d13 } /* Literal.String.Heredoc */
-.si { color: #ed9d13 } /* Literal.String.Interpol */
-.sx { color: #ffa500 } /* Literal.String.Other */
-.sr { color: #ed9d13 } /* Literal.String.Regex */
-.s1 { color: #ed9d13 } /* Literal.String.Single */
-.ss { color: #ed9d13 } /* Literal.String.Symbol */
-.bp { color: #24909d } /* Name.Builtin.Pseudo */
-.vc { color: #40ffff } /* Name.Variable.Class */
-.vg { color: #40ffff } /* Name.Variable.Global */
-.vi { color: #40ffff } /* Name.Variable.Instance */
-.il { color: #3677a9 } /* Literal.Number.Integer.Long */

BIN
docs/homepage/white_50.png


+ 1 - 0
requirements/test.txt

@@ -7,3 +7,4 @@ mock>=0.7.0
 pytyrant
 redis
 pymongo
+SQLAlchemy

+ 5 - 0
requirements/test_py3k.txt

@@ -0,0 +1,5 @@
+nose
+nose-cover3
+coverage>=3.0
+mock>=0.7.0
+SQLAlchemy

+ 7 - 1
setup.py

@@ -7,7 +7,8 @@ import platform
 
 extra = {}
 tests_require = ["nose", "nose-cover3", "sqlalchemy", "mock"]
-if sys.version_info >= (3, 0):
+is_py3k  = sys.version_info >= (3, 0)
+if is_py3k:
     extra.update(use_2to3=True)
 elif sys.version_info < (2, 7):
     tests_require.append("unittest2")
@@ -52,6 +53,11 @@ install_requires.extend([
     "kombu>=1.2.1,<2.0.0",
     "pyparsing>=1.5.0,<2.0.0",
 ])
+if is_py3k:
+    install_requires.append("python-dateutil>2.0.0")
+else:
+    install_requires.append("python-dateutil>1.5.0,<2.0.0")
+
 py_version = sys.version_info
 is_jython = sys.platform.startswith("java")
 is_pypy = hasattr(sys, "pypy_version_info")

Some files were not shown because too many files changed in this diff