{ "info": { "author": "Asko Soukka", "author_email": "asko.soukka@iki.fi", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Plone", "Framework :: Plone :: 4.3", "Framework :: Plone :: 5.0", "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "collective.taskqueue\n====================\n\n.. image:: https://secure.travis-ci.org/collective/collective.taskqueue.png\n :target: http://travis-ci.org/collective/collective.taskqueue\n\n*collective.taskqueue* enables asynchronous tasks in Plone add-ons by\nproviding a small framework for asynchronously queueing requests to\nZPublisher. With this approach, asynchronous tasks\nare just normal calls to normally registered browser views (or other\ntraversable callables) and they are authenticated using PAS as are all the other\nrequests.\n\nIn addition, it's possible to configure views so that they are visible only for\nasynchronous requests. Also, *collective.taskqueue* ships with a special\nPAS-plugin, which authenticates each request as the user who queued it.\n\nMinimal configuration:\n\n.. code:: ini\n\n zope-conf-additional =\n %import collective.taskqueue\n \n \n\nMinimal configuration gives you one volatile instance-local queue and\nconsumer, but no guarantee on delivery.\n\nMinimal configuration with multiple queues:\n\n.. code:: ini\n\n zope-conf-additional =\n %import collective.taskqueue\n \n \n\n \n queue mailhost\n \n \n queue mailhost\n \n\nPreferred minimal configration with Redis:\n\n.. code:: ini\n\n eggs =\n collective.taskqueue [redis]\n\n zope-conf-additional =\n %import collective.taskqueue\n \n type redis\n unix_socket_path ${buildout:directory}/var/redis.sock\n \n \n name ${:_buildout_section_name_}\n \n\nRedis-support gives you distributable queues, which can be shared between\ninstances. All instances should have queue-specific ``, but only\nthe consuming instance requires ``.\n\nExample Redis configuration with multiple queues:\n\n.. code:: ini\n\n eggs =\n collective.taskqueue [redis]\n\n zope-conf-additional =\n %import collective.taskqueue\n \n type redis\n unix_socket_path ${buildout:directory}/var/redis.sock\n \n \n name ${:_buildout_section_name_}\n \n \n type redis\n queue mailhost\n unix_socket_path ${buildout:directory}/var/redis.sock\n \n \n queue mailhost\n name ${:_buildout_section_name_}\n \n\nIt's recommended to only use local Redis-installations, because remote\nconnections can be killed by firewalls (there's no ping or heartbeat to keep\nthe connection alive through enterprise firewalls).\n\nQueue a task:\n\n.. code:: python\n\n from collective.taskqueue import taskqueue\n task_id = taskqueue.add('/Plone/path/to/my/view')\n\nTasks are queued (and consumed) after a successful transaction.\n\nTo make views visible only for asynchronous requests, views can be registered\nfor a special layer ``collective.taskqueue.interfaces.ITaskQueueLayer``, which\nis only found from requests dispatched by *collective.taskqueue*.\n\nBy default, ``taskqueue.add`` copies headers from the current requests to the\nasynchronous request. That should be enough to authenticate the requests in\nexactly the the same way as the current request was authenticated.\n\n``taskqueue.add`` returns uuid like id for the task, which can be used e.g. to\ntrack the task status later. Task id later provided as ``X-Task-Id`` header in\nthe queued request. You can get it in your task view with ``self.request.getHeader('X-Task-Id')``.\n\nMore robust authentication can be implemented with a custom PAS-plugin.\n*collective.taskqueue* ships with an optionally installable PAS-plugin, which\nauthenticates each request as the user who queued it. To achieve this,\n*collective.taskqueue* appends ``X-Task-User-Id``-header into the queued\nrequest.\n\nTaskqueue API has been inspired by `Google AppEngine Task Queue API`__.\n\n__ https://developers.google.com/appengine/docs/python/taskqueue/\n\n\nIntrospecting queues\n--------------------\n\nAs a minimalistic asynchronous framework for Plone, *collective.taskqueue*\ndoes not provider any user interface for observing or introspecting queues.\nYet, from trusted Python, it is possible to look up a current length of\na named queue (name of the default queue is \"default\"):\n\n.. code:: python\n\n from zope.component import getUtility\n from collective.taskqueue.interfaces import ITaskQueue\n\n len(getUtility(ITaskQueue, name='default'))\n\n\nAdvanced configuration\n----------------------\n\nSupported ````-settings are:\n\n``queue`` *(default=default)*\n Unique task queue name.\n\n``type`` *(default=local)*\n Task queue type ('local' or 'redis') or full class path to\n a custom type.\n\n``unix_socket_path``\n Redis server unix socket path (use instead of *host* and *port*).\n\nOther supported Redis-queue options are: *host*, *port*, *db* and *password*.\n\nSupported ````-settings are:\n\n``name`` *(default=default)*\n Consumer name, preferably instance name. Consumer is name used by\n Redis-queues for reserving messages from queue to achieve quaranteed\n delivery.\n\n``queue`` *(default=default)*\n Queue name for this consumer (consuming server). There must be a\n ```` with matching *queue*-value registered.\n\n``concurrent_limit`` *(default=1)*\n Maximum concurrent task limit for this consumer. It's recommend to\n set this smaller than *zserver-thread*-count. Leaving this to the\n default (``1``) should give the best results in terms of minimal\n ConflictErrors.\n\n``retry_max_count`` *(default=10)*\n Maximum ZPublisher retry count for requests dispatched by this\n consumer.\n\n .. note:: Once this limit has been exceeded by ZPublisher, the conflicting\n task is permanently trashed. (An alternative behavior is possible\n by implementing a custom queue class.)\n\n\nAdvanced usage\n--------------\n\n``taskqueue.add`` accepts the following arguments (with *default* value):\n\n``url`` *(required, no default)*\n Target path representing the task to be called.\n\n``method`` *(optional, default=GET)*\n HTTP-method for the call. Must be either *GET* or *POST*.\n\n``params`` *(optional, default=None)*\n A dictionary of optional task arguments, which are appended as query string\n after the given *url*.\n\n``headers`` *(optional, default=None)*\n A dictionary of optional HTTP-headers to be appended to (or used to replace)\n the headers copied from the active request.\n\n``payload`` *(optional, default=current)*\n An optional payload for *POST*-request. Payload from the active request\n will be copied by default. Copying the active payload can be prevented\n with *payload=None*.\n\n``queue`` *(optional, default=alphabetically-first-registered-queue)*\n An optional queue name, when more than one queue is registered.\n\n\nHow Redis queueing works\n------------------------\n\n1. ``taskqueue.add`` prepares a message, which will be pushed (``lpush``)\n into key ``collective.taskqueue.%(queue)s`` (where ``%(queue)s`` is the\n name of the queue) at the end of the transaction. If Redis connection is\n down during the transaction vote, the whole transaction is aborted.\n\n2. ```` reads each message (``rpoplpush``) from queue so\n that they will remain in key ``collective.taskqueue.%(queue)s.%(name)s``\n (where ``%(name)s`` is the name of the ````) until\n each asynchronous processing request has returned a HTTP response.\n\n3. On startup, and when all known messages have been processed,\n ```` purges ``collective.taskqueue.%(queue)s.%(name)s``\n into ``collective.taskqueue.%(queue)s`` (with ``rpoplpush``) and\n those tasks are processed again. (E.g. if Plone was forced to restart\n in middle of task handling request.)\n\nRedis integration uses PubSub to notify itself about new messages in queue\n(and get as instant handling as possible in terms of Plone's asyncore-loop).\n\nChangelog\n=========\n\n0.8.2 (2017-01-03)\n------------------\n\n- Fix issue where got bool header value caused error on task creationg\n [datakurre]\n\n0.8.1 (2017-01-02)\n------------------\n\n- Fix issue where task queue request with method POST created from GET method\n failed because of empty payload in the original request\n [datakurre]\n\n0.8.0 (2015-12-13)\n------------------\n\n- Add support for Plone 5\n [datakurre]\n- Fix issue where additional params could not be appended for url with query string\n [datakurre]\n\n0.7.1 (2015-01-26)\n------------------\n\n- Fix problems with conflicting transactions: only enqueue tasks when\n transaction is successfully finished.\n [jone]\n\n\n0.7.0 (2014-12-29)\n------------------\n\n- Replace NoRollbackSavepoint with rollback 'supporting' DummySavepoint\n [datakurre]\n\n0.6.2 (2014-12-19)\n------------------\n\n- Add minimal savepoint-support with NoRollbackSavepoint\n [datakurre]\n\n0.6.1 (2014-08-05)\n------------------\n\n- Fix issue where language bindings are not set for task queue requests,\n because the request is not HTTPRequest, but only inherits it\n [datakurre]\n\n0.6.0 (2014-05-19)\n------------------\n\n- Add taskqueue.add to return task id, which later matches\n request.getHeader('X-Task-Id')\n [datakurre]\n\n0.5.1 (2014-05-14)\n------------------\n\n- Fix issue where concurrent task counter mutex was not released due to\n uncaught exception\n [datakurre]\n- Fix issue where a socket in asyncore.map was closed during asyncore.poll\n [datakurre]\n\n0.5.0 (2014-04-03)\n------------------\n\n- Fix threading and execution order related issue where currently active\n Redis tasks were requeued (and processed more than once)\n [datakurre]\n- Add 'X-Task-Id'-header to help keeping track of tasks n consuming views\n [datakurre]\n\n0.4.4 (2013-11-25)\n------------------\n\n- Fix regression where redis+msgpack where accidentally always required [#7]\n [datakurre]\n- Update docs\n [Dylan Jay]\n- Fix default for 'unix_socket_path' [fixes #8]\n [Dylan Jay]\n\n0.4.3 (2013-11-15)\n------------------\n\n- Update README\n [datakurre]\n\n0.4.2 (2013-11-15)\n------------------\n\n- Updated README\n [datakurre]\n\n0.4.1 (2013-11-14)\n------------------\n\n- Updated README\n [datakurre]\n\n0.4.0 (2013-11-14)\n------------------\n\n- Refactor configuration by replacing explicit utilities and\n with -component\n [datakurre]\n\n0.3.1 (2013-11-13)\n------------------\n\n- Enhance acceptance testing support with the first acceptance tests\n [datakurre]\n\n0.3.0 (2013-11-10)\n------------------\n\n- Fix TaskQueueServer to re-connect to Redis after Redis restart\n [datakurre]\n- Fix to ping Redis on Zope start only in development mode\n [datakurre]\n- Add optional Task Queue PAS plugin to independently authenticate\n queued tasks as their creator\n [datakurre]\n\n0.2.2 (2013-11-09)\n------------------\n\n- Fix to flush Redis pub-notifications only when queue has been emptied\n to ensure that all messages will be processed\n [datakurre]\n\n0.2.1 (2013-11-09)\n------------------\n\n- Fix taskqueue socket to be not readable by default\n [datakurre]\n\n0.2.0 (2013-11-09)\n------------------\n\n- Enhance Redis-integration to connect redis notification pubsub-socket\n directly to asyncore on instant message handling\n [datakurre]\n- Fix to require redis >= 2.4.10 [fixes #2]\n [datakurre]\n- Fix to not start with clear error when clearly intending to use\n RedisTaskQueues without redis-dependencies. Also crash when cannot connect to\n Redis. [fixes #1]\n [datakurre]\n\n0.1.0 (2013-11-03)\n------------------\n\n- First release for experimental use.", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/datakurre/collective.taskqueue/", "keywords": "", "license": "GPL", "maintainer": "", "maintainer_email": "", "name": "collective.taskqueue", "package_url": "https://pypi.org/project/collective.taskqueue/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/collective.taskqueue/", "project_urls": { "Homepage": "https://github.com/datakurre/collective.taskqueue/" }, "release_url": "https://pypi.org/project/collective.taskqueue/0.8.2/", "requires_dist": null, "requires_python": "", "summary": "Asyncore-based asynchronous task queue for Plone", "version": "0.8.2" }, "last_serial": 2550965, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "6950470797185a03e6565112dda0764b", "sha256": "7c72476681c2d202267ece73c4aeb6b88d17360f1e2090883c8a030d92c6bd32" }, "downloads": -1, "filename": "collective.taskqueue-0.1.0.zip", "has_sig": false, "md5_digest": "6950470797185a03e6565112dda0764b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22968, "upload_time": "2013-11-03T19:40:55", "url": "https://files.pythonhosted.org/packages/f7/04/a03d9915812a971a194085fdd6f7168ebeaf04e72522784ba8004fbb946c/collective.taskqueue-0.1.0.zip" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "bb4a4619c3e7afeeff2202a338b76333", "sha256": "d360b3fd8d8d3ff257b6e2c62cdd471644df28ade9f0d37050e3ccb996b5ca65" }, "downloads": -1, "filename": "collective.taskqueue-0.2.0.zip", "has_sig": false, "md5_digest": "bb4a4619c3e7afeeff2202a338b76333", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27704, "upload_time": "2013-11-09T01:37:21", "url": "https://files.pythonhosted.org/packages/ee/5a/38db1d49160a3bb99e43fbd85b0c52986992d8c80b26767c28a7d16cf9f9/collective.taskqueue-0.2.0.zip" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "1ea16e5b430f48aa3dce43bd37141193", "sha256": "088fb89cdea17842218bdb69b47bc27e4e9de252bf23124fe3722e40d97cd3d4" }, "downloads": -1, "filename": "collective.taskqueue-0.2.1.zip", "has_sig": false, "md5_digest": "1ea16e5b430f48aa3dce43bd37141193", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27779, "upload_time": "2013-11-09T01:53:25", "url": "https://files.pythonhosted.org/packages/c7/fb/497884d0f12c38307ab2136751d930d331e172ec88fd5caee9d0025659b4/collective.taskqueue-0.2.1.zip" } ], "0.2.2": [ { "comment_text": "", "digests": { "md5": "40581f13d76a5f746b5368114c9d1b33", "sha256": "e95c27a7a1411df8791fa08c87fda8bd647ef9faea0da409a340b326335063ff" }, "downloads": -1, "filename": "collective.taskqueue-0.2.2.zip", "has_sig": false, "md5_digest": "40581f13d76a5f746b5368114c9d1b33", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27950, "upload_time": "2013-11-09T02:26:00", "url": "https://files.pythonhosted.org/packages/41/13/3753e003a0c81a6e5633de90e8897a874ac86a0c1f1536d336c2f00f2c0c/collective.taskqueue-0.2.2.zip" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "038d6615f05b975011a18e9c7e410c33", "sha256": "c9cdc84eed858301f1d1a6833096d061942f534d57194703474d31587ab54c84" }, "downloads": -1, "filename": "collective.taskqueue-0.3.0.zip", "has_sig": false, "md5_digest": "038d6615f05b975011a18e9c7e410c33", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32690, "upload_time": "2013-11-10T08:43:43", "url": "https://files.pythonhosted.org/packages/18/c9/32b762b786e82d6dea50f2f00de00dd4f4c63b16ce54ca5974342a1b1ce9/collective.taskqueue-0.3.0.zip" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "23f99f833cbe40cd42cdc48660cde166", "sha256": "602d686f267a97da12f3fc752c576e718d7218e1ee59092d903a67bd577677dd" }, "downloads": -1, "filename": "collective.taskqueue-0.3.1.zip", "has_sig": false, "md5_digest": "23f99f833cbe40cd42cdc48660cde166", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34703, "upload_time": "2013-11-13T12:18:03", "url": "https://files.pythonhosted.org/packages/07/a8/6fcf0cc21039f0ff45d03b67a8850da898f3804cfa3e0d4aa15e969e49ea/collective.taskqueue-0.3.1.zip" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "df5a1158657dc93814fd981693dee9d7", "sha256": "43eae9162bf0cb9573d478099e0baa5fdfa1381a239f0b9882863e1e255d7952" }, "downloads": -1, "filename": "collective.taskqueue-0.4.0.zip", "has_sig": false, "md5_digest": "df5a1158657dc93814fd981693dee9d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35816, "upload_time": "2013-11-14T02:14:34", "url": "https://files.pythonhosted.org/packages/5a/17/973814b5ca33082bba19dd12573f001ee10436e1a899d0d74bc4971ed074/collective.taskqueue-0.4.0.zip" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "4c5f4bcb29031f941a9c3edc77bc03c6", "sha256": "ba4a5d0647431be4ca054ed16364b496bf8a5e1f4c57eb1a482865f58f35008d" }, "downloads": -1, "filename": "collective.taskqueue-0.4.1.zip", "has_sig": false, "md5_digest": "4c5f4bcb29031f941a9c3edc77bc03c6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36338, "upload_time": "2013-11-14T02:35:36", "url": "https://files.pythonhosted.org/packages/17/be/539e0b28b0c7188ab19e16ac3cfd7496df9b3fbfa9821eb04f1d64f6789c/collective.taskqueue-0.4.1.zip" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "ca92267bb4ee075d2a18b16c03ee51d2", "sha256": "56a71fc4f56ba1f63aaa23d7d288379869f89050da2b62f496d794af76894c9f" }, "downloads": -1, "filename": "collective.taskqueue-0.4.2.zip", "has_sig": false, "md5_digest": "ca92267bb4ee075d2a18b16c03ee51d2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37472, "upload_time": "2013-11-15T09:59:21", "url": "https://files.pythonhosted.org/packages/7c/95/aecea1ffa921b29340177e75072b44b3e44f6328bfc319cf43fa67852446/collective.taskqueue-0.4.2.zip" } ], "0.4.3": [ { "comment_text": "", "digests": { "md5": "33949e38f83b9196c14feb1ace443eb7", "sha256": "d3ad8fb27c29ea80ad2762712d87bae118fe22479d6bd28ff80234238983529c" }, "downloads": -1, "filename": "collective.taskqueue-0.4.3.zip", "has_sig": false, "md5_digest": "33949e38f83b9196c14feb1ace443eb7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 38517, "upload_time": "2013-11-15T10:21:03", "url": "https://files.pythonhosted.org/packages/81/70/3fdc0ae514e73d5ea10560437061f97f93152a8e4cba0f7ad2a3089f1d7c/collective.taskqueue-0.4.3.zip" } ], "0.4.4": [ { "comment_text": "", "digests": { "md5": "af2cc0774e5f97d7ae132eb51c1c89df", "sha256": "dbccd16463cee83c2726051dea2ff023e91f90a6d429f04b90847e2740e6aca3" }, "downloads": -1, "filename": "collective.taskqueue-0.4.4.zip", "has_sig": false, "md5_digest": "af2cc0774e5f97d7ae132eb51c1c89df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 39376, "upload_time": "2013-11-25T05:45:39", "url": "https://files.pythonhosted.org/packages/55/a0/59e08064f7817590a2e7bcabb910ef20528708d332f59c29c7dba1e774a1/collective.taskqueue-0.4.4.zip" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "7816402ca79ada8a3c23186cd4e44412", "sha256": "554f01dd532abdad0f0e98aeaf282b283ae3c847ebbc3dc7c77837b797002685" }, "downloads": -1, "filename": "collective.taskqueue-0.5.0.zip", "has_sig": false, "md5_digest": "7816402ca79ada8a3c23186cd4e44412", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40172, "upload_time": "2014-04-03T06:32:05", "url": "https://files.pythonhosted.org/packages/86/51/53ce9d3f3e7ec76d0eec45439157d90604ea637f95561dd452318d9b59b9/collective.taskqueue-0.5.0.zip" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "4ae53b7e6af01ff496f3c7acc688befc", "sha256": "8a3c851371ee55e5f70715fe852da74feef1ade405b98f618a3148ca0150293f" }, "downloads": -1, "filename": "collective.taskqueue-0.5.1.zip", "has_sig": false, "md5_digest": "4ae53b7e6af01ff496f3c7acc688befc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40549, "upload_time": "2014-05-14T15:46:49", "url": "https://files.pythonhosted.org/packages/bc/35/31862fa20cd4b7cd85168c52e93f77bd8b54427445d64931d64913dc4c76/collective.taskqueue-0.5.1.zip" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "a1929bc3aafc60a72192b97296afb3e9", "sha256": "df7f02fccb9052a633f1fb27e6eeddcd28b02a962ca3a370be0a390b691418bf" }, "downloads": -1, "filename": "collective.taskqueue-0.6.0.zip", "has_sig": false, "md5_digest": "a1929bc3aafc60a72192b97296afb3e9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42050, "upload_time": "2014-05-19T18:26:49", "url": "https://files.pythonhosted.org/packages/41/bd/9907fdcb79ef7a7849ed2bdb73caf84e743d5e3903c521f139bae0cc33d7/collective.taskqueue-0.6.0.zip" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "608366c927541ef2c1181a952cf2f41b", "sha256": "6890acd622c12a400a2355f1669de876a58b4413987438d0741c112636f30004" }, "downloads": -1, "filename": "collective.taskqueue-0.6.1.zip", "has_sig": false, "md5_digest": "608366c927541ef2c1181a952cf2f41b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42939, "upload_time": "2014-08-05T13:25:28", "url": "https://files.pythonhosted.org/packages/4d/90/c7af7efc000561804698e819fc45633b9a77ade102010f15b9bafe5574a3/collective.taskqueue-0.6.1.zip" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "f6519aa1f5ce8abd09b1817778e61c2f", "sha256": "772322516df3867a7bb10f87426d636ca8ee68701d6bdfb9e22664dbfc57662d" }, "downloads": -1, "filename": "collective.taskqueue-0.6.2.zip", "has_sig": false, "md5_digest": "f6519aa1f5ce8abd09b1817778e61c2f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43175, "upload_time": "2014-12-19T12:14:47", "url": "https://files.pythonhosted.org/packages/8b/18/86ab1e3f6c4c80ee29de5a5147a04bb9e6e9e0126a41af5cb76eecd1f0f0/collective.taskqueue-0.6.2.zip" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "f417681f270456dde2e64d001348a086", "sha256": "890ea37ca9f2597e2077b06f4d28530448e0064aa04598e9cd734b66bcd405f0" }, "downloads": -1, "filename": "collective.taskqueue-0.7.0.zip", "has_sig": false, "md5_digest": "f417681f270456dde2e64d001348a086", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43319, "upload_time": "2014-12-29T21:07:27", "url": "https://files.pythonhosted.org/packages/ef/78/4b880c4d0953804ce43c9a18256ed45691c76ac79124963eebe26cc8b3d8/collective.taskqueue-0.7.0.zip" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "290721a665e57e545cb293dcfe24cd5f", "sha256": "be3c1cf9002d47f304ba35687fb4da81163b20ed96590b23f690dd89d68b72bf" }, "downloads": -1, "filename": "collective.taskqueue-0.7.1.zip", "has_sig": false, "md5_digest": "290721a665e57e545cb293dcfe24cd5f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 43504, "upload_time": "2015-01-26T14:25:37", "url": "https://files.pythonhosted.org/packages/43/a6/7db986ad5f8c8f4f1a7da591579cdf912e2a1929f24fa581cf4c39156d9d/collective.taskqueue-0.7.1.zip" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "4b7e056c62a560aedeea97b914046d7e", "sha256": "f4f686151a386040c0fbef8314c9229f4735eca3be83dcbc0219e153a0d7fe9d" }, "downloads": -1, "filename": "collective.taskqueue-0.8.0.tar.gz", "has_sig": false, "md5_digest": "4b7e056c62a560aedeea97b914046d7e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27993, "upload_time": "2015-12-12T22:28:56", "url": "https://files.pythonhosted.org/packages/bc/b6/23217dce2fab12e9b9159468c91b5b27e75377f267718aea36f7a5c1c633/collective.taskqueue-0.8.0.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "fb0b2c3e7b44e9a24e8a07ca32a106cf", "sha256": "d35e86303b41df6520651f47c7ff21a88990c0a9ff8dddde61a343a1b415d2bc" }, "downloads": -1, "filename": "collective.taskqueue-0.8.1.tar.gz", "has_sig": false, "md5_digest": "fb0b2c3e7b44e9a24e8a07ca32a106cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30076, "upload_time": "2017-01-02T08:09:10", "url": "https://files.pythonhosted.org/packages/30/98/befbd224777e877772ef9e023fe8d2d5b78378f14d5cf9092c5eab05ae47/collective.taskqueue-0.8.1.tar.gz" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "d6b3986ad5cc006b45c7676a6d2f6bac", "sha256": "e703347faa63ee5803edf6314eebd317ceb67be003c611bc50892b36eb10fd6d" }, "downloads": -1, "filename": "collective.taskqueue-0.8.2.tar.gz", "has_sig": false, "md5_digest": "d6b3986ad5cc006b45c7676a6d2f6bac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30220, "upload_time": "2017-01-03T04:20:41", "url": "https://files.pythonhosted.org/packages/5c/aa/b8711a721918afe9097afb8765427012a2843ecf0dff9be229ffd876d74f/collective.taskqueue-0.8.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d6b3986ad5cc006b45c7676a6d2f6bac", "sha256": "e703347faa63ee5803edf6314eebd317ceb67be003c611bc50892b36eb10fd6d" }, "downloads": -1, "filename": "collective.taskqueue-0.8.2.tar.gz", "has_sig": false, "md5_digest": "d6b3986ad5cc006b45c7676a6d2f6bac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30220, "upload_time": "2017-01-03T04:20:41", "url": "https://files.pythonhosted.org/packages/5c/aa/b8711a721918afe9097afb8765427012a2843ecf0dff9be229ffd876d74f/collective.taskqueue-0.8.2.tar.gz" } ] }