{
"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"
}
]
}