{ "info": { "author": "Thea Flowers", "author_email": "theaflowers@google.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: MacOS", "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Internet", "Topic :: Scientific/Engineering", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Distributed Computing" ], "description": "psq - Cloud Pub/Sub Task Queue for Python.\n==========================================\n\n|Build Status| |Coverage Status| |PyPI Version|\n\n.. Note:: this is not an official Google product, experimental or otherwise and\n is provided without support. It is intended as a sample library for\n demonstrating a set of use cases for Google Cloud Pub/Sub. The official\n Pub/Sub client library should be used for production applications.\n\n``psq`` is an example Python implementation of a simple distributed task\nqueue using `Google Cloud Pub/Sub `__.\n\n``psq`` requires minimal configuration and relies on Cloud Pub/Sub to\nprovide scalable and reliable messaging.\n\n``psq`` is intentionally similar to `rq `__ and\n`simpleq `__, and takes some\ninspiration from `celery `__ and `this\nblog\npost `__.\n\nInstallation\n------------\n\nInstall via `pip `__:\n\n::\n\n pip install psq\n\nPrerequisites\n-------------\n\n- A project on the `Google Developers\n Console `__.\n- The `Google Cloud SDK `__ installed\n locally.\n- You will need the `Cloud Pub/Sub API\n enabled `__\n on your project. The link will walk you through enabling the API.\n- You will need to run ``gcloud auth`` before running these examples so\n that authentication to Google Cloud Platform services is handled\n transparently.\n\nUsage\n-----\n\nFirst, create a task:\n\n.. code:: python\n\n def adder(a, b):\n return a + b\n\nThen, create a pubsub client and a queue:\n\n.. code:: python\n\n from google.cloud import pubsub_v1\n import psq\n\n\n project = 'your-project-id'\n\n publisher = pubsub_v1.PublisherClient()\n subscriber = pubsub_v1.SubscriberClient()\n\n q = psq.Queue(publisher, subscriber, project)\n\nNow you can enqueue tasks:\n\n.. code:: python\n\n from tasks import adder\n\n q.enqueue(adder)\n\nIn order to get task results, you have to configure storage:\n\n.. code:: python\n\n from google.cloud import pubsub_v1\n from google.cloud import datastore\n import psq\n\n\n project = 'your-project-id'\n\n publisher = pubsub_v1.PublisherClient()\n subscriber = pubsub_v1.SubscriberClient()\n ds_client = datastore.Client()\n\n q = psq.Queue(\n publisher, subscriber, project,\n storage=psq.DatastoreStorage(ds_client))\n\nWith storage configured, you can get the result of a task:\n\n.. code:: python\n\n r = q.enqueue(adder, 5, 6)\n r.result() # -> 11\n\nYou can also define multiple queues:\n\n.. code:: python\n\n fast = psq.Queue(publisher, subscriber, project, 'fast')\n slow = psq.Queue(publisher, subscriber, project, 'slow')\n\nThings to note\n--------------\n\nBecause ``psq`` is largely similar to ``rq``, similar rules around tasks\napply. You can put any Python function call on a queue, provided:\n\n- The function is importable by the worker. This means the\n ``__module__`` that the function lives in must be importable.\n Notably, you can't enqueue functions that are declared in the\n **main** module - such as tasks defined in a file that is run\n directly with ``python`` or via the interactive interpreter.\n- The function can be a string, but it must be the absolutely importable path\n to a function that the worker can import. Otherwise, the task will fail.\n- The worker and the applications queuing tasks must share exactly the\n same source code.\n- The function can't depend on global context such as global variables,\n current\\_request, etc. Pass any needed context into the worker at\n queue time.\n\nDelivery guarantees\n~~~~~~~~~~~~~~~~~~~\n\nPub/sub guarantees your tasks will be delivered to the workers, but\n``psq`` doesn't presently guarantee that a task completes execution or\nexactly-once semantics, though it does allow you to provide your own\nmechanisms for this. This is similar to Celery's\n`default `__\nconfiguration.\n\nTask completion guarantees can be provided via late ack support. Late\nack is possible with Cloud Pub/sub, but it currently not implemented in\nthis library. See `CONTRIBUTING.md`_.\n\nThere are many approaches for exactly-once semantics, such as\ndistributed locks. This is possible in systems such as\n`zookeeper `__\nand `redis `__.\n\nRunning a worker\n----------------\n\nExecute ``psqworker`` in the *same directory where you tasks are\ndefined*:\n\n::\n\n psqworker.py config.q\n\n``psqworker`` only operates on one queue at a time. If you want a server\nto listen to multiple queues, use something like\n`supervisord `__ to run multiple ``psqworker``\nprocesses.\n\nBroadcast queues\n----------------\n\nA normal queue will send a single task to a single worker, spreading\nyour tasks over all workers listening to the same queue. There are also\nbroadcast queues, which will deliver a copy of the task to *every*\nworker. This is useful in situations where you want every worker to\nexecute the same task, such as installing or upgrading software on every\nserver.\n\n.. code:: python\n\n broadcast_q = psq.BroadcastQueue(publisher, subscriber, project)\n\n def restart_apache_task():\n call([\"apachectl\", \"restart\"])\n\n broadcast_q.enqueue(restart_apache_task)\n\nBroadcast queues provide an implementation of the solution described in\n`Reliable Task Scheduling on Google Compute\nEngine `__.\n\n*Note*: broadcast queues do not currently support any form of storage\nand do not support return values.\n\nRetries\n-------\n\nRaising ``psq.Retry`` in your task will cause it to be retried.\n\n.. code:: python\n\n from psq import Retry\n\n def retry_if_fail(self):\n try:\n r = requests.get('http://some.flaky.service.com')\n except Exception as e:\n logging.error(e)\n raise Retry()\n\nFlask & other contexts\n----------------------\n\nYou can bind an extra context manager to the queue.\n\n.. code:: python\n\n app = Flask(__name__)\n\n q = psq.Queue(extra_context=app.app_context)\n\nThis will ensure that the context is available in your tasks, which is\nuseful for things such as database connections, etc.:\n\n.. code:: python\n\n from flask import current_app\n\n def flasky_task():\n backend = current_app.config['BACKEND']\n\nBypassing workers for testing\n-----------------------------\n\nDuring unit tests you most certainly don't want to spin up workers, but instead\nexecute the enqueued functions immediately and synchronously. To do this, pass\n`asynchronous=False` to the Queue's constructor (default is True). Also, you don't have\nto provide a publisher, subscriber or project arguments in this case,\njust pass None for all them to the queue.\n\n.. code:: python\n\n q = psq.Queue(None, None, project=None, asynchronous=False)\n r = q.enqueue(adder, 1, 2) # Will be run immediately\n\n\n\nIdeas for improvements\n----------------------\n\n- some sort of storage solution for broadcast queues.\n- Memcache/redis value store.\n- @task decorator that adds a delay/defer function.\n- Task chaining / groups / chords.\n- Late ack.\n- Gevent worker.\n- batch support for queueing.\n\nContributing changes\n--------------------\n\n- See `CONTRIBUTING.md`_\n\nLicensing\n---------\n\n- Apache 2.0 - See `LICENSE`_\n\n.. _LICENSE: https://github.com/GoogleCloudPlatform/psq/blob/master/LICENSE\n.. _CONTRIBUTING.md: https://github.com/GoogleCloudPlatform/psq/blob/master/CONTRIBUTING.md\n\n.. |Build Status| image:: https://travis-ci.org/GoogleCloudPlatform/psq.svg\n :target: https://travis-ci.org/GoogleCloudPlatform/psq\n.. |Coverage Status| image:: https://coveralls.io/repos/GoogleCloudPlatform/psq/badge.svg?branch=master&service=github\n :target: https://coveralls.io/github/GoogleCloudPlatform/psq?branch=master\n.. |PyPI Version| image:: https://img.shields.io/pypi/v/psq.svg\n :target: https://pypi.python.org/pypi/psq\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/GoogleCloudPlatform/psq", "keywords": "queue tasks background worker", "license": "Apache Software License", "maintainer": "", "maintainer_email": "", "name": "psq", "package_url": "https://pypi.org/project/psq/", "platform": "", "project_url": "https://pypi.org/project/psq/", "project_urls": { "Homepage": "https://github.com/GoogleCloudPlatform/psq" }, "release_url": "https://pypi.org/project/psq/0.8.0/", "requires_dist": [ "google-cloud-pubsub (>=0.35.2)", "google-cloud-datastore (<=2.0.0,>=1.0.0)", "werkzeug (<1.0.0,>=0.10.0)", "click (>=4.0)", "colorlog (<3.0.0,>=2.6.0)" ], "requires_python": "", "summary": "A simple task queue using Google Cloud Pub/Sub", "version": "0.8.0" }, "last_serial": 5700673, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "b3cc8998677e59d8a8ebbf1ba0c22250", "sha256": "322ce9d629d9094194592bf0e1ca36ac0ac00cf35d13889b804f4b591926cd99" }, "downloads": -1, "filename": "psq-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b3cc8998677e59d8a8ebbf1ba0c22250", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21743, "upload_time": "2015-07-29T17:26:48", "url": "https://files.pythonhosted.org/packages/e8/31/401b1a4ee98827a808376dceb62af65819470dc78a85dbc377461c951b84/psq-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b29f5b179a7c6e2d5f204974db123398", "sha256": "b26af676965fadd7e94a94e812ef5cb2333fac505611b5d11b359d151e666159" }, "downloads": -1, "filename": "psq-0.1.0.tar.gz", "has_sig": false, "md5_digest": "b29f5b179a7c6e2d5f204974db123398", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14095, "upload_time": "2015-07-29T17:26:52", "url": "https://files.pythonhosted.org/packages/60/3c/9343a865dbf4f1e0b7c33a8e78be8f2b12d9bfc118d9464d6d553fc52d86/psq-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "984e19cea4c177241c36dacbf721054f", "sha256": "e8b173db0fd66b0d552f94150d8ff4dcfff5d8420e5d37a890897a2958ed11fc" }, "downloads": -1, "filename": "psq-0.1.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "984e19cea4c177241c36dacbf721054f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21969, "upload_time": "2015-09-04T17:43:04", "url": "https://files.pythonhosted.org/packages/0d/e4/d831a0e51e373b66a0418cae429b937a2be55bda8cb9957faf68ba6eb8bb/psq-0.1.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a3048800a20d01ea96515dc6468cb20e", "sha256": "94868fc6d0542ef6d9955865b545ddec961ca11e50a97f7fd9096c4f16a00cfc" }, "downloads": -1, "filename": "psq-0.1.1.tar.gz", "has_sig": false, "md5_digest": "a3048800a20d01ea96515dc6468cb20e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11659, "upload_time": "2015-09-04T17:31:42", "url": "https://files.pythonhosted.org/packages/40/3b/6408e50461680ee570f3677d976af99f5a8346410a7174dc2b2d950dc564/psq-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "534f5110f19e75a0e4ffe40d14822a13", "sha256": "3dba656538f1410e7f8784cc3715508b111ff809aa00971326a7b2f33131cc80" }, "downloads": -1, "filename": "psq-0.1.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "534f5110f19e75a0e4ffe40d14822a13", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21968, "upload_time": "2015-09-04T17:46:49", "url": "https://files.pythonhosted.org/packages/f4/4d/6b513e9586d51e8e80f4a1340f8fc5c59907fe2d757e4a4fe998feeddef7/psq-0.1.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "97963108a0f4ec196b8dd90f6a566f58", "sha256": "4ac74fa5dad5bedbccbeb970a27d88d38fbdf8b3549a4420d32137f5ac4cd6c3" }, "downloads": -1, "filename": "psq-0.1.2.tar.gz", "has_sig": false, "md5_digest": "97963108a0f4ec196b8dd90f6a566f58", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11861, "upload_time": "2015-09-04T17:46:53", "url": "https://files.pythonhosted.org/packages/bd/22/e074dfe496fd2a81ae49bfa72d01098c6f749e9a9943918e11e3fe29775a/psq-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "039f8f53208283f88fd396b8a326a357", "sha256": "7596bf500b5056155a4314ec8964485119b57e264ef47dcce7eec4e4d72f92f2" }, "downloads": -1, "filename": "psq-0.1.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "039f8f53208283f88fd396b8a326a357", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 25255, "upload_time": "2015-12-04T23:51:25", "url": "https://files.pythonhosted.org/packages/fc/fd/7fe6b725bc1404601c7aabeafc84d1edc259655261ac0edc0c852739e0a7/psq-0.1.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f30b6031ab42a572e714d397a28ac08", "sha256": "babada982ebb0fac14e5b95541ed48d201f666240f193dfc9f6e4434d536dfb7" }, "downloads": -1, "filename": "psq-0.1.3.tar.gz", "has_sig": false, "md5_digest": "7f30b6031ab42a572e714d397a28ac08", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14047, "upload_time": "2015-12-04T23:51:30", "url": "https://files.pythonhosted.org/packages/cf/78/b2188ada1bb0c6bbabe767f6378e24e184268bdbe4edfbed865fc9eb6748/psq-0.1.3.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "449ff25fb697399aa1c082ebf9a76b0a", "sha256": "cf5c5a767126a2162166a19fd83206cc03e877570477305f39680184fc58c966" }, "downloads": -1, "filename": "psq-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "449ff25fb697399aa1c082ebf9a76b0a", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 25250, "upload_time": "2015-12-04T23:55:58", "url": "https://files.pythonhosted.org/packages/0f/dc/58b4d9c140308ab8bff4411010024c1c9c4d9ac8dc5033efccc272fe3101/psq-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "792e2525de97bbef783d4732ea48af81", "sha256": "9021f8be2502746c23c1041b44796d8db188b862537cb0aa63bd5159b771e6a1" }, "downloads": -1, "filename": "psq-0.2.0.tar.gz", "has_sig": false, "md5_digest": "792e2525de97bbef783d4732ea48af81", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14045, "upload_time": "2015-12-04T23:56:10", "url": "https://files.pythonhosted.org/packages/41/ec/201397aef13f63b536d2ea503360ca4ea8e65698e7851751e3d2cf258f4b/psq-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "bf72727cdc3667488e65f69e4114986c", "sha256": "8b327ecbbb98127367da9b7c3cb546882de2fc4e6a34b20d7fe54a13d5028121" }, "downloads": -1, "filename": "psq-0.2.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bf72727cdc3667488e65f69e4114986c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 26987, "upload_time": "2015-12-08T00:05:05", "url": "https://files.pythonhosted.org/packages/12/44/cb3368803f0f14af2e4d10b795cb41f75239e133c67cb17641fa16294bd2/psq-0.2.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "671f0fa5eec270fdf648a04a67136d8d", "sha256": "4cdd28e4a3a1ccf3cfad8bc9f79cc3b7bde535f28ef9cdad7a331152a0aa62d1" }, "downloads": -1, "filename": "psq-0.2.1.tar.gz", "has_sig": false, "md5_digest": "671f0fa5eec270fdf648a04a67136d8d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14546, "upload_time": "2015-12-08T00:05:15", "url": "https://files.pythonhosted.org/packages/b0/f7/ff3ce1d9a6033213dd2a3cac47271bf2ef88258f07a4f7feefabd1a3b802/psq-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "5d985ec7964c7b5bc03e6f22c4add721", "sha256": "b81a96ba20e647084943656779b7752c9bb7412028f71b6d04c32896d50b390c" }, "downloads": -1, "filename": "psq-0.3.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "5d985ec7964c7b5bc03e6f22c4add721", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27214, "upload_time": "2016-04-18T17:29:05", "url": "https://files.pythonhosted.org/packages/ef/bb/60506dbf895fe710c2c7a620d379ad84616f93b93d13f3112c3e63ccb408/psq-0.3.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6175b84b1931b617601b6e9f684988da", "sha256": "5fbdd2cf51f0dcc54a3ff7326cf69d84c2f816951c82b376b2081415c7a5fe0d" }, "downloads": -1, "filename": "psq-0.3.0.tar.gz", "has_sig": false, "md5_digest": "6175b84b1931b617601b6e9f684988da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15141, "upload_time": "2016-04-18T17:29:19", "url": "https://files.pythonhosted.org/packages/7a/41/d41b16aebd0cffe750930fb799724a5427815ef44c25648d6c3446507691/psq-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "7a769a01d950fb14204824d50a0d7631", "sha256": "8dceb05438efd48a10c857359c5ed1c72e78867931a60d18ee8516c2191539e7" }, "downloads": -1, "filename": "psq-0.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7a769a01d950fb14204824d50a0d7631", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27236, "upload_time": "2016-08-15T22:31:54", "url": "https://files.pythonhosted.org/packages/04/66/2fe0fd9ef01ed868a8a81a042d8141b312e18eacd1e56965704c3fbe94e9/psq-0.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c9a380acf452e0c17ae2b61e822f1379", "sha256": "e985addc8bce9be68545fc5390fd78716255d91f804554db1a4e703f2128c572" }, "downloads": -1, "filename": "psq-0.4.0.tar.gz", "has_sig": false, "md5_digest": "c9a380acf452e0c17ae2b61e822f1379", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15159, "upload_time": "2016-08-15T22:31:56", "url": "https://files.pythonhosted.org/packages/23/b4/4e5ad2c383c969c1eebfc894c43e5c05c8b2d29b9474bd51af702b80a28b/psq-0.4.0.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "f16f62b9d2d06308feecbf8da416c7a6", "sha256": "6394221328e56cb04c9ff452690b62b8dffc31a209f3a1c8c78b23354fb7424e" }, "downloads": -1, "filename": "psq-0.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f16f62b9d2d06308feecbf8da416c7a6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 29388, "upload_time": "2016-09-20T18:24:56", "url": "https://files.pythonhosted.org/packages/53/17/cd7e2d7ddd5c598b057201c0cea17ac5eab50cc0a99eb678c39ea6b964e7/psq-0.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6d72cb9d02f6cc0896792986a99bb554", "sha256": "35a2502c590e104eb145f9110479a5f0ff184d012d5f32754eebb11f8f033733" }, "downloads": -1, "filename": "psq-0.5.0.tar.gz", "has_sig": false, "md5_digest": "6d72cb9d02f6cc0896792986a99bb554", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15394, "upload_time": "2016-09-20T18:24:58", "url": "https://files.pythonhosted.org/packages/0c/49/654594a882c2b286f65170dbd3887498344320032545007648a7acffb465/psq-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "d01ff8d32268c1a7a55d6bc5d5513d02", "sha256": "b9c4dd75aa735da82562b642dbe77924f1882425cc2ce003344b76624c719de0" }, "downloads": -1, "filename": "psq-0.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d01ff8d32268c1a7a55d6bc5d5513d02", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27380, "upload_time": "2017-12-06T22:15:07", "url": "https://files.pythonhosted.org/packages/6b/dd/2366380f1e5a9914a0503dba2d3a608551371cec5c073da958c6a7c57ae8/psq-0.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1687e041e6642b118432e75f48c094aa", "sha256": "360a965a3f43852b2bee989701a2fe03dfcb4a0d09606ced9981b10a78f83ae5" }, "downloads": -1, "filename": "psq-0.6.0.tar.gz", "has_sig": false, "md5_digest": "1687e041e6642b118432e75f48c094aa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13940, "upload_time": "2017-12-06T22:15:08", "url": "https://files.pythonhosted.org/packages/5a/89/ac8db7601e73f54d7409ff383d881ae2661a695875792780b3d1676e4fc0/psq-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "982ec990eb5544854b1947de57f81f2d", "sha256": "cbbce8758cbf1ecd0d2b686eb635fb4d6561e729e5a9715b4b0a3d4f9b2a1d21" }, "downloads": -1, "filename": "psq-0.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "982ec990eb5544854b1947de57f81f2d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 23293, "upload_time": "2018-05-31T06:19:02", "url": "https://files.pythonhosted.org/packages/ea/32/0194ef1588880226e7af588b9da22c98b100cdfdb5114f861cab4353839e/psq-0.7.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8a46d58c42600bb4faf031983822c71a", "sha256": "522c448ae8183f32f88f80592a5b35a25ebe395d669e26471814f147dee9dc34" }, "downloads": -1, "filename": "psq-0.7.0.tar.gz", "has_sig": false, "md5_digest": "8a46d58c42600bb4faf031983822c71a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14043, "upload_time": "2018-05-31T06:19:03", "url": "https://files.pythonhosted.org/packages/6c/70/620b465e55a2106a521830e63e63defd7b2b56037f566cf7506ec0ce15af/psq-0.7.0.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "ad6f72c7cc426e47517352d73ac6f635", "sha256": "69608f691ecc5b8f0bfa633cf61d96db209342264d8f7d0833eda297a9cfe03c" }, "downloads": -1, "filename": "psq-0.8.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ad6f72c7cc426e47517352d73ac6f635", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27412, "upload_time": "2019-08-19T22:59:46", "url": "https://files.pythonhosted.org/packages/14/45/0a79c3f1e74a333ba8c92f40744d26b4b10af673df89e018c7915dda7474/psq-0.8.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2459210a958230f0454719cb1afe6799", "sha256": "c79de0aa7853799cb3dd06fa1b4076511aa9ec4e5db873a95001fc67abe8c381" }, "downloads": -1, "filename": "psq-0.8.0.tar.gz", "has_sig": false, "md5_digest": "2459210a958230f0454719cb1afe6799", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17454, "upload_time": "2019-08-19T22:59:47", "url": "https://files.pythonhosted.org/packages/11/f4/bf27d21679fd1558840c50cb8bc04348992a2d91d7b2be3c81a06f06a6ed/psq-0.8.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ad6f72c7cc426e47517352d73ac6f635", "sha256": "69608f691ecc5b8f0bfa633cf61d96db209342264d8f7d0833eda297a9cfe03c" }, "downloads": -1, "filename": "psq-0.8.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ad6f72c7cc426e47517352d73ac6f635", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 27412, "upload_time": "2019-08-19T22:59:46", "url": "https://files.pythonhosted.org/packages/14/45/0a79c3f1e74a333ba8c92f40744d26b4b10af673df89e018c7915dda7474/psq-0.8.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2459210a958230f0454719cb1afe6799", "sha256": "c79de0aa7853799cb3dd06fa1b4076511aa9ec4e5db873a95001fc67abe8c381" }, "downloads": -1, "filename": "psq-0.8.0.tar.gz", "has_sig": false, "md5_digest": "2459210a958230f0454719cb1afe6799", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17454, "upload_time": "2019-08-19T22:59:47", "url": "https://files.pythonhosted.org/packages/11/f4/bf27d21679fd1558840c50cb8bc04348992a2d91d7b2be3c81a06f06a6ed/psq-0.8.0.tar.gz" } ] }