{ "info": { "author": "Dima Tisnek", "author_email": "dimaqq@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Framework :: AsyncIO", "License :: OSI Approved :: MIT License", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Software Development :: Debuggers" ], "description": "# Await, What?\n\nTells you what waits for what in an `async/await` program.\n\n### Python 3.10.0a1\n\nIt seems the API was changed in 3.10 and the C extension doesn't compile.\nI'll investigate...\n\n### Alpine\n\nYou'll need `apk add build-base openssl-dev libffi-dev`\n\n## 2019 Sprint Setup\n\nComms: https://gitter.im/awaitwhat/community\n\n* Python 3.9, Python 3.8 (preferred) or Python 3.7\n* Your platform dev tools (compiler, etc).\n* Ensure that `python` is 3.9 or 3.8 or 3.7\n* Install `poetry`\n* Install `graphviz`\n* Clone this repository\n* Look at [tests](https://github.com/dimaqq/awaitwhat/tree/master/test)\n* Look at [issues](https://github.com/dimaqq/awaitwhat/issues)\n\n```console\n> python --version\nPython 3.9.0b4 #\ud83e\udde1\nPython 3.8.4 #\ud83d\udc4c\n\n> dot -V\ndot - graphviz version 2.40.1\n\n> curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python\n# add ~/.poetry/bin to your PATH\n\n> git clone git@github.com:dimaqq/awaitwhat.git\n> cd awaitwhat\n~/awaitwhat (dev|\u2714) > poetry shell # creates a venv and drops you in it\n\n(awaitwhat-x-py3.9) ~/awaitwhat (dev|\u2714) > poetry install # installs projects dependencies in a venv\n(awaitwhat-x-py3.9) ~/awaitwhat (dev|\u2714) > poetry build # builds a C extension in this project\n\n(awaitwhat-x-py3.9) ~/awaitwhat (dev|\u2714) > env PYTHONPATH=. python examples/test_shield.py | tee graph.dot\n(awaitwhat-x-py3.9) ~/awaitwhat (dev|\u2714) > dot -Tsvg graph.dot -o graph.svg\n(awaitwhat-x-py3.9) ~/awaitwhat (dev|\u2714) > open graph.svg # or load it in a browser\n```\n\n### TL;DR\n\nSay you have this code:\n```py\n\nasync def job():\n await foo()\n\n\nasync def foo():\n await bar()\n\n\nasync def bar():\n await baz()\n\n\nasync def baz():\n await leaf()\n\n\nasync def leaf():\n await asyncio.sleep(1) # imagine you don't know this\n\n\nasync def work():\n await asyncio.gather(..., job())\n```\n\nNow that code is stuck and and you want to know why.\n\n#### Python built-in\n```py\nStack for wait_for=()]> cb=[\u2026]> (most recent call last):\n File \"test/test_stack.py\", line 34, in job\n await foo()\n```\n\n#### This library\n```py\nStack for wait_for=()]> cb=[\u2026]> (most recent call last):\n File \"test/test_stack.py\", line 34, in job\n await foo()\n File \"test/test_stack.py\", line 38, in foo\n await bar()\n File \"test/test_stack.py\", line 42, in bar\n await baz()\n File \"test/test_stack.py\", line 46, in baz\n await leaf()\n File \"test/test_stack.py\", line 50, in leaf\n await asyncio.sleep(1)\n File \"/\u2026/asyncio/tasks.py\", line 568, in sleep\n return await future\n File \"\", line 0, in <_asyncio.FutureIter object at 0x7fb6981690d8>: \u2026\n```\n\n### Dependency Graph\n\n\n\n### References\n\nhttps://mail.python.org/archives/list/async-sig@python.org/thread/6E2LRVLKYSMGEAZ7OYOYR3PMZUUYSS3K/\n\n> Hi group,\n>\n> I'm recently debugging a long-running asyncio program that appears to get stuck about once a week.\n>\n> The tools I've discovered so far are:\n> * high level: `asyncio.all_tasks()` + `asyncio.Task.get_stack()`\n> * low level: `loop._selector._fd_to_key`\n>\n> What's missing is the middle level, i.e. stack-like linkage of what is waiting for what. For a practical example, consider:\n>\n> ```py\n> async def leaf(): await somesocket.recv()\n> async def baz(): await leaf()\n> async def bar(): await baz()\n> async def foo(): await bar()\n> async def job(): await foo()\n> async def work(): await asyncio.gather(..., job())\n> async def main(): asyncio.run(work())\n> ```\n>\n> The task stack will contain:\n> * main and body of work with line number\n> * job task with line number pointing to foo\n>\n> The file descriptor mapping, socket fd, `loop._recv()` and a `Future`.\n>\n> What's missing are connections `foo->bar->baz->leaf`.\n> That is, I can't tell which task is waiting for what terminal `Future`.\n>\n> Is this problem solved in some way that I'm not aware of?\n> Is there a library or external tool for this already?\n>\n> Perhaps, if I could get a list of all pending coroutines, I could figure out what's wrong.\n>\n> If no such API exists, I'm thinking of the following:\n>\n> ```py\n> async def foo():\n> await bar()\n>\n> In [37]: dis.dis(foo)\n> 1 0 LOAD_GLOBAL 0 (bar)\n> 2 CALL_FUNCTION 0\n> 4 GET_AWAITABLE\n> 6 LOAD_CONST 0 (None)\n> 8 YIELD_FROM\n> 10 POP_TOP\n> 12 LOAD_CONST 0 (None)\n> 14 RETURN_VALUE\n> ```\n>\n> Starting from a pending task, I'd get it's coroutine and:\n>\n> Get the coroutine frame, and if current instruction is `YIELD_FROM`, then the reference to the awaitable should be on the top of the stack.\n> If that reference points to a pending coroutine, I'd add that to the \"forward trace\" and repeat.\n>\n> At some point I'd reach an awaitable that's not a pending coroutine, which may be: another `Task` (I already got those), a low-level `Future` (can be looked up in event loop), an `Event` (tough luck, shoulda logged all `Event`'s on creation) or a dozen other corner cases.\n>\n> What do y'all think of this approach?\n>\n> Thanks,\n> D.\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/dimaqq/awaitwhat", "keywords": "asyncio", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "awaitwhat", "package_url": "https://pypi.org/project/awaitwhat/", "platform": "", "project_url": "https://pypi.org/project/awaitwhat/", "project_urls": { "Documentation": "https://github.com/dimaqq/awaitwhat", "Homepage": "https://github.com/dimaqq/awaitwhat", "Repository": "https://github.com/dimaqq/awaitwhat" }, "release_url": "https://pypi.org/project/awaitwhat/21.1/", "requires_dist": null, "requires_python": ">=3.7,<3.10", "summary": "async/await introspection", "version": "21.1", "yanked": false, "yanked_reason": null }, "last_serial": 10904536, "releases": { "19.1a1": [ { "comment_text": "", "digests": { "md5": "45dbb724de2d158fa214e5fd4a465ec1", "sha256": "b65871e941f517fd74127bc10964d490c5347036eda5b5024da4d2cf4d915312" }, "downloads": -1, "filename": "awaitwhat-19.1a1-cp37-cp37m-macosx_10_9_x86_64.whl", "has_sig": false, "md5_digest": "45dbb724de2d158fa214e5fd4a465ec1", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.7", "size": 5722, "upload_time": "2019-08-29T00:55:41", "upload_time_iso_8601": "2019-08-29T00:55:41.224442Z", "url": "https://files.pythonhosted.org/packages/87/ad/a63094c52f26a6ed1bbe1ee86cd2e4d7607b031875b3df5b2754d1edd810/awaitwhat-19.1a1-cp37-cp37m-macosx_10_9_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "c862eea3a9fa5c0dd72cc9de7786f708", "sha256": "bb5fbfa16965def86e508b32260a8127438bc19e7963841257d50b39da56e4f9" }, "downloads": -1, "filename": "awaitwhat-19.1a1.tar.gz", "has_sig": false, "md5_digest": "c862eea3a9fa5c0dd72cc9de7786f708", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 4607, "upload_time": "2019-08-29T00:55:43", "upload_time_iso_8601": "2019-08-29T00:55:43.619321Z", "url": "https://files.pythonhosted.org/packages/7d/ae/c46abed435b69c762c8958934ff03de19780c50be9e7629d009f2f1e2759/awaitwhat-19.1a1.tar.gz", "yanked": false, "yanked_reason": null } ], "19.1a2": [ { "comment_text": "", "digests": { "md5": "894c9d0afbef373a872d6deabaa699c3", "sha256": "fcc9404246ee828891a7c55f83a477532b9218936a2db362abc9d383ed8033ef" }, "downloads": -1, "filename": "awaitwhat-19.1a2-cp37-cp37m-macosx_10_9_x86_64.whl", "has_sig": false, "md5_digest": "894c9d0afbef373a872d6deabaa699c3", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.7", "size": 8678, "upload_time": "2019-08-29T05:37:25", "upload_time_iso_8601": "2019-08-29T05:37:25.629322Z", "url": "https://files.pythonhosted.org/packages/72/ba/5a6241a96c9a74669565c8bb710c15213aa6d14e41829b7ae9e86a5307a4/awaitwhat-19.1a2-cp37-cp37m-macosx_10_9_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "9055491725b1bea3bfcbc9f410a7e0d8", "sha256": "cd4a88a68c8beee50862d0fc674ac20ce83549ea338a46c3c43d1b2a94937cf2" }, "downloads": -1, "filename": "awaitwhat-19.1a2.tar.gz", "has_sig": false, "md5_digest": "9055491725b1bea3bfcbc9f410a7e0d8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 6733, "upload_time": "2019-08-29T05:37:27", "upload_time_iso_8601": "2019-08-29T05:37:27.844012Z", "url": "https://files.pythonhosted.org/packages/bd/09/e754ca9583b94e33722eedbd89267c7ee2c26b90a0a65bf46f6f0213e69a/awaitwhat-19.1a2.tar.gz", "yanked": false, "yanked_reason": null } ], "19.1a3": [ { "comment_text": "", "digests": { "md5": "002c46dacaadd6f3a1d1fbe33302c637", "sha256": "8003764a27066dfba7be6db66a794ba535d641bf365f32df5e95413ac5eb3738" }, "downloads": -1, "filename": "awaitwhat-19.1a3-cp37-cp37m-macosx_10_9_x86_64.whl", "has_sig": false, "md5_digest": "002c46dacaadd6f3a1d1fbe33302c637", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">=3.7", "size": 8944, "upload_time": "2019-08-29T07:54:45", "upload_time_iso_8601": "2019-08-29T07:54:45.468841Z", "url": "https://files.pythonhosted.org/packages/0c/b5/bd6a15c4fb96015808f2461b9a93e9b1b91f682553b5bc23fa451d33a901/awaitwhat-19.1a3-cp37-cp37m-macosx_10_9_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "dfa87e94961dbc25e1a2a14d37b614b5", "sha256": "cc93532ad541e5a674b9931ce5f384a2686769680ad6b40e5a59f14c7349e834" }, "downloads": -1, "filename": "awaitwhat-19.1a3.tar.gz", "has_sig": false, "md5_digest": "dfa87e94961dbc25e1a2a14d37b614b5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 6981, "upload_time": "2019-08-29T07:54:47", "upload_time_iso_8601": "2019-08-29T07:54:47.161879Z", "url": "https://files.pythonhosted.org/packages/78/c4/6020c9f81989b248e3dff7c58682ba9e1c1922cca748db5ccea7ff8b1418/awaitwhat-19.1a3.tar.gz", "yanked": false, "yanked_reason": null } ], "19.1a5": [ { "comment_text": "", "digests": { "md5": "1a64a3dc88c987c7dd41b28aaf6bbe44", "sha256": "1106772ae2aff8dd759e9beca3fe2bb60521791c45d919b419796139d46925a8" }, "downloads": -1, "filename": "awaitwhat-19.1a5-cp38-cp38-macosx_10_9_x86_64.whl", "has_sig": false, "md5_digest": "1a64a3dc88c987c7dd41b28aaf6bbe44", "packagetype": "bdist_wheel", "python_version": "cp38", "requires_python": ">=3.7", "size": 10862, "upload_time": "2019-10-23T03:01:22", "upload_time_iso_8601": "2019-10-23T03:01:22.312138Z", "url": "https://files.pythonhosted.org/packages/12/e6/56e9035d3fbcfdafa37c9a5d7795c877b8f71b09b3e074a9592037cf6789/awaitwhat-19.1a5-cp38-cp38-macosx_10_9_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "3829dd16dd43d611f4d7c5d7c2a3edd0", "sha256": "bffbb4ef66c83278f7180229edb1f2ba688dcb2fd5395d413ccba1ce26b48829" }, "downloads": -1, "filename": "awaitwhat-19.1a5-cp39-cp39-macosx_10_9_x86_64.whl", "has_sig": false, "md5_digest": "3829dd16dd43d611f4d7c5d7c2a3edd0", "packagetype": "bdist_wheel", "python_version": "cp39", "requires_python": ">=3.7", "size": 10859, "upload_time": "2020-01-28T05:59:05", "upload_time_iso_8601": "2020-01-28T05:59:05.381330Z", "url": "https://files.pythonhosted.org/packages/19/bd/0a8c0a12c9267da9e532709984d7015dbdadc05e9772de964d36ac3f973f/awaitwhat-19.1a5-cp39-cp39-macosx_10_9_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "cad02ca09cdaa1c66ddae07e8ba395fa", "sha256": "12005c78b48af73922e7c0631041bc0003a5d9be9dfd059b4cdbfbc0ecc586da" }, "downloads": -1, "filename": "awaitwhat-19.1a5.tar.gz", "has_sig": false, "md5_digest": "cad02ca09cdaa1c66ddae07e8ba395fa", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 8374, "upload_time": "2019-10-23T03:01:23", "upload_time_iso_8601": "2019-10-23T03:01:23.605422Z", "url": "https://files.pythonhosted.org/packages/cb/7d/7427234da5f265a05d935b89756b2797f08ba6536a3f43b220b62976405c/awaitwhat-19.1a5.tar.gz", "yanked": false, "yanked_reason": null } ], "20.1": [ { "comment_text": "", "digests": { "md5": "58e4f39e8bce895147da3db2a79a3400", "sha256": "b0aada24f701cd492886a6791eb7587f7df7560c817a52e32016660f69c88188" }, "downloads": -1, "filename": "awaitwhat-20.1-cp38-cp38-macosx_10_9_x86_64.whl", "has_sig": false, "md5_digest": "58e4f39e8bce895147da3db2a79a3400", "packagetype": "bdist_wheel", "python_version": "cp38", "requires_python": ">=3.7", "size": 11574, "upload_time": "2020-01-28T07:10:26", "upload_time_iso_8601": "2020-01-28T07:10:26.133110Z", "url": "https://files.pythonhosted.org/packages/42/91/cd42c2140817f22f8f6e82bf841beba259a02bfef727d08fe6ad1bddccfa/awaitwhat-20.1-cp38-cp38-macosx_10_9_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "d3b6923326ea89ee4b32370388e99d3b", "sha256": "eb7fce0b1763747f60da0aa48bd77c0b8850b59cdf0d86007df943379661854a" }, "downloads": -1, "filename": "awaitwhat-20.1-cp39-cp39-macosx_10_9_x86_64.whl", "has_sig": false, "md5_digest": "d3b6923326ea89ee4b32370388e99d3b", "packagetype": "bdist_wheel", "python_version": "cp39", "requires_python": ">=3.7", "size": 11578, "upload_time": "2020-01-28T07:10:28", "upload_time_iso_8601": "2020-01-28T07:10:28.093406Z", "url": "https://files.pythonhosted.org/packages/75/3a/93a47a388884ce3b412f3c09d8e91ceabd474cbeb998a878ba8d047e3422/awaitwhat-20.1-cp39-cp39-macosx_10_9_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "620605f6267c54d0969e95489b11a8ac", "sha256": "99cd12111ab48e817edb7d1e285d16ffde99e42c4d335b8bbc5646bcd7a1e19b" }, "downloads": -1, "filename": "awaitwhat-20.1.tar.gz", "has_sig": false, "md5_digest": "620605f6267c54d0969e95489b11a8ac", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 8773, "upload_time": "2020-01-28T07:10:29", "upload_time_iso_8601": "2020-01-28T07:10:29.435539Z", "url": "https://files.pythonhosted.org/packages/c6/d9/f8c478053970fbb0b62259fd3cf25e9b4c864ab9cbf4294967c119f607dd/awaitwhat-20.1.tar.gz", "yanked": false, "yanked_reason": null } ], "20.3": [ { "comment_text": "", "digests": { "md5": "c44b7f16b67f454e73a48576c1895bb2", "sha256": "2e62bd91997bb63bfb20974397dd7e6ddda1a9430bc8ecf5969485061d78b0e0" }, "downloads": -1, "filename": "awaitwhat-20.3-cp38-cp38-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "c44b7f16b67f454e73a48576c1895bb2", "packagetype": "bdist_wheel", "python_version": "cp38", "requires_python": ">=3.7", "size": 23945, "upload_time": "2020-07-17T07:24:51", "upload_time_iso_8601": "2020-07-17T07:24:51.857733Z", "url": "https://files.pythonhosted.org/packages/2b/15/82a0a3ee4068fdc66e97191821f283c6fab47771ececd3fd1097ed9a0f4b/awaitwhat-20.3-cp38-cp38-manylinux1_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "0f0cb8c8a65179de4859535bd722e745", "sha256": "00b836c9ce06da7a682416bba89c9a01e592557972d25be99f91aeab1395e4cc" }, "downloads": -1, "filename": "awaitwhat-20.3-cp38-cp38-manylinux2014_x86_64.whl", "has_sig": false, "md5_digest": "0f0cb8c8a65179de4859535bd722e745", "packagetype": "bdist_wheel", "python_version": "cp38", "requires_python": ">=3.7", "size": 23946, "upload_time": "2020-07-17T07:24:53", "upload_time_iso_8601": "2020-07-17T07:24:53.406286Z", "url": "https://files.pythonhosted.org/packages/a5/06/dcda78cec47e8d92a80b7eedd88ff42011742923a621efbdd08cd218b749/awaitwhat-20.3-cp38-cp38-manylinux2014_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "33aee087465efeafa485bb24d228c1fb", "sha256": "adee6697092b03aa27c651adf8c0d581d2e71abdf707eb390ab8bfb86d0e2316" }, "downloads": -1, "filename": "awaitwhat-20.3-cp39-cp39-macosx_10_9_x86_64.whl", "has_sig": false, "md5_digest": "33aee087465efeafa485bb24d228c1fb", "packagetype": "bdist_wheel", "python_version": "cp39", "requires_python": ">=3.7", "size": 11675, "upload_time": "2020-07-16T04:26:54", "upload_time_iso_8601": "2020-07-16T04:26:54.958663Z", "url": "https://files.pythonhosted.org/packages/df/38/54ade0f1b720f59604ef53549cc8e6bd0a5ae735d77298b40fe9d2aae71e/awaitwhat-20.3-cp39-cp39-macosx_10_9_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "620116e44005da5acbb1b2b3cc6a4d78", "sha256": "9aae435a06872ee06854394a6836d85c2ef65aa7ec57591b55034178446d4467" }, "downloads": -1, "filename": "awaitwhat-20.3-cp39-cp39-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "620116e44005da5acbb1b2b3cc6a4d78", "packagetype": "bdist_wheel", "python_version": "cp39", "requires_python": ">=3.7", "size": 23791, "upload_time": "2020-07-17T07:24:54", "upload_time_iso_8601": "2020-07-17T07:24:54.766858Z", "url": "https://files.pythonhosted.org/packages/cb/e6/e70532dcf7aadd3fefd387fb8a3774bd74916ce0c797362440092417a474/awaitwhat-20.3-cp39-cp39-manylinux1_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "aa0cccf1a6831e6d23a1349ec6b3b23f", "sha256": "5171a4f6ef8993b2a8c47061b6bc169a00d1ab59e20dbcba398438254240eebe" }, "downloads": -1, "filename": "awaitwhat-20.3-cp39-cp39-manylinux2014_x86_64.whl", "has_sig": false, "md5_digest": "aa0cccf1a6831e6d23a1349ec6b3b23f", "packagetype": "bdist_wheel", "python_version": "cp39", "requires_python": ">=3.7", "size": 23793, "upload_time": "2020-07-17T07:24:56", "upload_time_iso_8601": "2020-07-17T07:24:56.067979Z", "url": "https://files.pythonhosted.org/packages/24/73/e1d2ad98dd9ac2e004cefe81561672ae1b33487543e39cf8a28beb5a9f0f/awaitwhat-20.3-cp39-cp39-manylinux2014_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "ac9ebebb25834902b466cabec52acecb", "sha256": "1cab9deac03b1672fe30e28e677a62467c1abd1fd47fc4164131cd1679e96b7d" }, "downloads": -1, "filename": "awaitwhat-20.3.tar.gz", "has_sig": false, "md5_digest": "ac9ebebb25834902b466cabec52acecb", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7", "size": 8856, "upload_time": "2020-07-16T04:26:56", "upload_time_iso_8601": "2020-07-16T04:26:56.604316Z", "url": "https://files.pythonhosted.org/packages/84/51/c98f5a58e6a0633751680540998ea3044076131cc77fb95506c09634e9db/awaitwhat-20.3.tar.gz", "yanked": false, "yanked_reason": null } ], "21.1": [ { "comment_text": "", "digests": { "md5": "85cbae56be6177029d9e2c0d1108b61c", "sha256": "dc2c534603878d44947511565fa638aa9af1b247a58cd2d6290def247372fd33" }, "downloads": -1, "filename": "awaitwhat-21.1-cp39-cp39-macosx_10_16_x86_64.whl", "has_sig": false, "md5_digest": "85cbae56be6177029d9e2c0d1108b61c", "packagetype": "bdist_wheel", "python_version": "cp39", "requires_python": ">=3.7,<3.10", "size": 17789, "upload_time": "2021-07-14T05:52:29", "upload_time_iso_8601": "2021-07-14T05:52:29.934244Z", "url": "https://files.pythonhosted.org/packages/bb/81/d0cdd07d4256cda4463dbec4a912d2f6a3947b7db97b9f986d0147fea222/awaitwhat-21.1-cp39-cp39-macosx_10_16_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "97a21d53e67f573eb70fa29d0312eda5", "sha256": "4c84ab717d1781c7ce01fcaa51cef35a63a10f3ce8f64609c8294c0fc6b6ae99" }, "downloads": -1, "filename": "awaitwhat-21.1.tar.gz", "has_sig": false, "md5_digest": "97a21d53e67f573eb70fa29d0312eda5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<3.10", "size": 9270, "upload_time": "2021-07-14T05:52:31", "upload_time_iso_8601": "2021-07-14T05:52:31.321325Z", "url": "https://files.pythonhosted.org/packages/08/fd/2c94a7ed767a24c73f1c85016825a1474d2f2ba27168658af81173d8068e/awaitwhat-21.1.tar.gz", "yanked": false, "yanked_reason": null } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "85cbae56be6177029d9e2c0d1108b61c", "sha256": "dc2c534603878d44947511565fa638aa9af1b247a58cd2d6290def247372fd33" }, "downloads": -1, "filename": "awaitwhat-21.1-cp39-cp39-macosx_10_16_x86_64.whl", "has_sig": false, "md5_digest": "85cbae56be6177029d9e2c0d1108b61c", "packagetype": "bdist_wheel", "python_version": "cp39", "requires_python": ">=3.7,<3.10", "size": 17789, "upload_time": "2021-07-14T05:52:29", "upload_time_iso_8601": "2021-07-14T05:52:29.934244Z", "url": "https://files.pythonhosted.org/packages/bb/81/d0cdd07d4256cda4463dbec4a912d2f6a3947b7db97b9f986d0147fea222/awaitwhat-21.1-cp39-cp39-macosx_10_16_x86_64.whl", "yanked": false, "yanked_reason": null }, { "comment_text": "", "digests": { "md5": "97a21d53e67f573eb70fa29d0312eda5", "sha256": "4c84ab717d1781c7ce01fcaa51cef35a63a10f3ce8f64609c8294c0fc6b6ae99" }, "downloads": -1, "filename": "awaitwhat-21.1.tar.gz", "has_sig": false, "md5_digest": "97a21d53e67f573eb70fa29d0312eda5", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7,<3.10", "size": 9270, "upload_time": "2021-07-14T05:52:31", "upload_time_iso_8601": "2021-07-14T05:52:31.321325Z", "url": "https://files.pythonhosted.org/packages/08/fd/2c94a7ed767a24c73f1c85016825a1474d2f2ba27168658af81173d8068e/awaitwhat-21.1.tar.gz", "yanked": false, "yanked_reason": null } ], "vulnerabilities": [] }