diff --git a/src/fetchcode/pypi.py b/src/fetchcode/pypi.py index b8c4038..1aaf4f2 100644 --- a/src/fetchcode/pypi.py +++ b/src/fetchcode/pypi.py @@ -14,45 +14,90 @@ # CONDITIONS OF ANY KIND, either express or implied. See the License for the # specific language governing permissions and limitations under the License. -from urllib.parse import urljoin - from packageurl import PackageURL from fetchcode import fetch_json_response class Pypi: - """ - This class handles Pypi PURLs. - """ + """Handle PyPI Package URL (PURL) resolution and download URL retrieval.""" purl_pattern = "pkg:pypi/.*" - base_url = "https://pypi.org/pypi/" + base_url = "https://pypi.org/pypi" @classmethod - def get_download_url(cls, purl): + def get_package_data(cls, purl: str) -> dict: """ - Return the download URL for a Pypi PURL. + Fetch package data from PyPI API. + + If no version is specified in the PURL, fetches the latest version. + + Args: + purl: A Package URL string (e.g., "pkg:pypi/requests@2.28.0") + + Returns: + The full JSON response from PyPI API. """ - purl = PackageURL.from_string(purl) + parsed_purl = PackageURL.from_string(purl) - name = purl.name - version = purl.version + if parsed_purl.version: + api_url = f"{cls.base_url}/{parsed_purl.name}/{parsed_purl.version}/json" + else: + api_url = f"{cls.base_url}/{parsed_purl.name}/json" - if not name or not version: - raise ValueError("Pypi PURL must specify a name and version") + return fetch_json_response(api_url) - url = urljoin(cls.base_url, f"{name}/{version}/json") - data = fetch_json_response(url) + @classmethod + def get_urls_info(cls, purl: str) -> list[dict]: + """ + Collect URL info dicts from PyPI API. - download_urls = data.get("urls", [{}]) + If no version is specified in the PURL, fetches the latest version. - if not download_urls: - raise ValueError(f"No download URLs found for {name} version {version}") + Returns: + List of URL info dicts from PyPI API, or empty list if none found. + """ + data = cls.get_package_data(purl) + return data.get("urls", []) - download_url = next((url["url"] for url in download_urls if url.get("url")), None) + @classmethod + def get_download_url(cls, purl: str, preferred_type: str = "sdist") -> str | None: + """ + Get a single download URL from PyPI API. - if not download_url: - raise ValueError(f"No download URL found for {name} version {version}") + If no version is specified in the PURL, fetches the latest version. - return download_url + Args: + purl: A Package URL string (e.g., "pkg:pypi/requests@2.28.0") + preferred_type: Preferred package type (e.g., "sdist", "bdist_wheel"). + Falls back to first available if preferred type not found. + + Returns: + The download URL, or None if not found. + """ + urls_info = cls.get_urls_info(purl) + + if not urls_info: + return + + for url_info in urls_info: + if url_info.get("packagetype") == preferred_type: + return url_info["url"] + + return urls_info[0]["url"] + + @classmethod + def get_all_download_urls(cls, purl: str) -> list[str]: + """ + Get all download URLs from PyPI API. + + If no version is specified in the PURL, fetches the latest version. + + Args: + purl: A Package URL string (e.g., "pkg:pypi/requests@2.28.0") + + Returns: + List of all available download URLs. + """ + urls_info = cls.get_urls_info(purl) + return [url_info["url"] for url_info in urls_info if "url" in url_info] diff --git a/tests/data/pypi/asgiref-3.11.0.json b/tests/data/pypi/asgiref-3.11.0.json new file mode 100644 index 0000000..d6a418e --- /dev/null +++ b/tests/data/pypi/asgiref-3.11.0.json @@ -0,0 +1,115 @@ +{ + "info": { + "author": "Django Software Foundation", + "author_email": "foundation@djangoproject.com", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 5 - Production/Stable", + "Environment :: Web Environment", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.9", + "Topic :: Internet :: WWW/HTTP" + ], + "description": "asgiref\n=======\n\n.. image:: https://github.com/django/asgiref/actions/workflows/tests.yml/badge.svg\n :target: https://github.com/django/asgiref/actions/workflows/tests.yml\n\n.. image:: https://img.shields.io/pypi/v/asgiref.svg\n :target: https://pypi.python.org/pypi/asgiref\n\nASGI is a standard for Python asynchronous web apps and servers to communicate\nwith each other, and positioned as an asynchronous successor to WSGI. You can\nread more at https://asgi.readthedocs.io/en/latest/\n\nThis package includes ASGI base libraries, such as:\n\n* Sync-to-async and async-to-sync function wrappers, ``asgiref.sync``\n* Server base classes, ``asgiref.server``\n* A WSGI-to-ASGI adapter, in ``asgiref.wsgi``\n\n\nFunction wrappers\n-----------------\n\nThese allow you to wrap or decorate async or sync functions to call them from\nthe other style (so you can call async functions from a synchronous thread,\nor vice-versa).\n\nIn particular:\n\n* AsyncToSync lets a synchronous subthread stop and wait while the async\n function is called on the main thread's event loop, and then control is\n returned to the thread when the async function is finished.\n\n* SyncToAsync lets async code call a synchronous function, which is run in\n a threadpool and control returned to the async coroutine when the synchronous\n function completes.\n\nThe idea is to make it easier to call synchronous APIs from async code and\nasynchronous APIs from synchronous code so it's easier to transition code from\none style to the other. In the case of Channels, we wrap the (synchronous)\nDjango view system with SyncToAsync to allow it to run inside the (asynchronous)\nASGI server.\n\nNote that exactly what threads things run in is very specific, and aimed to\nkeep maximum compatibility with old synchronous code. See\n\"Synchronous code & Threads\" below for a full explanation. By default,\n``sync_to_async`` will run all synchronous code in the program in the same\nthread for safety reasons; you can disable this for more performance with\n``@sync_to_async(thread_sensitive=False)``, but make sure that your code does\nnot rely on anything bound to threads (like database connections) when you do.\n\n\nThreadlocal replacement\n-----------------------\n\nThis is a drop-in replacement for ``threading.local`` that works with both\nthreads and asyncio Tasks. Even better, it will proxy values through from a\ntask-local context to a thread-local context when you use ``sync_to_async``\nto run things in a threadpool, and vice-versa for ``async_to_sync``.\n\nIf you instead want true thread- and task-safety, you can set\n``thread_critical`` on the Local object to ensure this instead.\n\n\nServer base classes\n-------------------\n\nIncludes a ``StatelessServer`` class which provides all the hard work of\nwriting a stateless server (as in, does not handle direct incoming sockets\nbut instead consumes external streams or sockets to work out what is happening).\n\nAn example of such a server would be a chatbot server that connects out to\na central chat server and provides a \"connection scope\" per user chatting to\nit. There's only one actual connection, but the server has to separate things\ninto several scopes for easier writing of the code.\n\nYou can see an example of this being used in `frequensgi \u003Chttps://github.com/andrewgodwin/frequensgi\u003E`_.\n\n\nWSGI-to-ASGI adapter\n--------------------\n\nAllows you to wrap a WSGI application so it appears as a valid ASGI application.\n\nSimply wrap it around your WSGI application like so::\n\n asgi_application = WsgiToAsgi(wsgi_application)\n\nThe WSGI application will be run in a synchronous threadpool, and the wrapped\nASGI application will be one that accepts ``http`` class messages.\n\nPlease note that not all extended features of WSGI may be supported (such as\nfile handles for incoming POST bodies).\n\n\nDependencies\n------------\n\n``asgiref`` requires Python 3.9 or higher.\n\n\nContributing\n------------\n\nPlease refer to the\n`main Channels contributing docs \u003Chttps://github.com/django/channels/blob/master/CONTRIBUTING.rst\u003E`_.\n\n\nTesting\n'''''''\n\nTo run tests, make sure you have installed the ``tests`` extra with the package::\n\n cd asgiref/\n pip install -e .[tests]\n pytest\n\n\nBuilding the documentation\n''''''''''''''''''''''''''\n\nThe documentation uses `Sphinx \u003Chttp://www.sphinx-doc.org\u003E`_::\n\n cd asgiref/docs/\n pip install sphinx\n\nTo build the docs, you can use the default tools::\n\n sphinx-build -b html . _build/html # or `make html`, if you've got make set up\n cd _build/html\n python -m http.server\n\n...or you can use ``sphinx-autobuild`` to run a server and rebuild/reload\nyour documentation changes automatically::\n\n pip install sphinx-autobuild\n sphinx-autobuild . _build/html\n\n\nReleasing\n'''''''''\n\nTo release, first add details to CHANGELOG.txt and update the version number in ``asgiref/__init__.py``.\n\nThen, build and push the packages::\n\n python -m build\n twine upload dist/*\n rm -r asgiref.egg-info dist\n\n\nImplementation Details\n----------------------\n\nSynchronous code & threads\n''''''''''''''''''''''''''\n\nThe ``asgiref.sync`` module provides two wrappers that let you go between\nasynchronous and synchronous code at will, while taking care of the rough edges\nfor you.\n\nUnfortunately, the rough edges are numerous, and the code has to work especially\nhard to keep things in the same thread as much as possible. Notably, the\nrestrictions we are working with are:\n\n* All synchronous code called through ``SyncToAsync`` and marked with\n ``thread_sensitive`` should run in the same thread as each other (and if the\n outer layer of the program is synchronous, the main thread)\n\n* If a thread already has a running async loop, ``AsyncToSync`` can't run things\n on that loop if it's blocked on synchronous code that is above you in the\n call stack.\n\nThe first compromise you get to might be that ``thread_sensitive`` code should\njust run in the same thread and not spawn in a sub-thread, fulfilling the first\nrestriction, but that immediately runs you into the second restriction.\n\nThe only real solution is to essentially have a variant of ThreadPoolExecutor\nthat executes any ``thread_sensitive`` code on the outermost synchronous\nthread - either the main thread, or a single spawned subthread.\n\nThis means you now have two basic states:\n\n* If the outermost layer of your program is synchronous, then all async code\n run through ``AsyncToSync`` will run in a per-call event loop in arbitrary\n sub-threads, while all ``thread_sensitive`` code will run in the main thread.\n\n* If the outermost layer of your program is asynchronous, then all async code\n runs on the main thread's event loop, and all ``thread_sensitive`` synchronous\n code will run in a single shared sub-thread.\n\nCrucially, this means that in both cases there is a thread which is a shared\nresource that all ``thread_sensitive`` code must run on, and there is a chance\nthat this thread is currently blocked on its own ``AsyncToSync`` call. Thus,\n``AsyncToSync`` needs to act as an executor for thread code while it's blocking.\n\nThe ``CurrentThreadExecutor`` class provides this functionality; rather than\nsimply waiting on a Future, you can call its ``run_until_future`` method and\nit will run submitted code until that Future is done. This means that code\ninside the call can then run code on your thread.\n\n\nMaintenance and Security\n------------------------\n\nTo report security issues, please contact security@djangoproject.com. For GPG\nsignatures and more security process information, see\nhttps://docs.djangoproject.com/en/dev/internals/security/.\n\nTo report bugs or request new features, please open a new GitHub issue.\n\nThis repository is part of the Channels project. For the shepherd and maintenance team, please see the\n`main Channels readme \u003Chttps://github.com/django/channels/blob/master/README.rst\u003E`_.\n", + "description_content_type": null, + "docs_url": null, + "download_url": null, + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": [ + "License-File" + ], + "home_page": "https://github.com/django/asgiref/", + "keywords": null, + "license": "BSD-3-Clause", + "license_expression": null, + "license_files": [ + "LICENSE" + ], + "maintainer": null, + "maintainer_email": null, + "name": "asgiref", + "package_url": "https://pypi.org/project/asgiref/", + "platform": null, + "project_url": "https://pypi.org/project/asgiref/", + "project_urls": { + "Changelog": "https://github.com/django/asgiref/blob/master/CHANGELOG.txt", + "Documentation": "https://asgi.readthedocs.io/", + "Further Documentation": "https://docs.djangoproject.com/en/stable/topics/async/#async-adapter-functions", + "Homepage": "https://github.com/django/asgiref/" + }, + "provides_extra": [ + "tests" + ], + "release_url": "https://pypi.org/project/asgiref/3.11.0/", + "requires_dist": [ + "typing_extensions\u003E=4; python_version \u003C \"3.11\"", + "pytest; extra == \"tests\"", + "pytest-asyncio; extra == \"tests\"", + "mypy\u003E=1.14.0; extra == \"tests\"" + ], + "requires_python": "\u003E=3.9", + "summary": "ASGI specs, helper code, and adapters", + "version": "3.11.0", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 32495228, + "urls": [ + { + "comment_text": null, + "digests": { + "blake2b_256": "91be317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea", + "md5": "659fe6bbd7e43c8bde0b7ca065be0f6c", + "sha256": "1db9021efadb0d9512ce8ffaf72fcef601c7b73a8807a1bb2ef143dc6b14846d" + }, + "downloads": -1, + "filename": "asgiref-3.11.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "659fe6bbd7e43c8bde0b7ca065be0f6c", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.9", + "size": 24096, + "upload_time": "2025-11-19T15:32:19", + "upload_time_iso_8601": "2025-11-19T15:32:19.004742Z", + "url": "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": null, + "digests": { + "blake2b_256": "76b94db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b", + "md5": "554794453502d266a90d2254fcb1f7c3", + "sha256": "13acff32519542a1736223fb79a715acdebe24286d98e8b164a73085f40da2c4" + }, + "downloads": -1, + "filename": "asgiref-3.11.0.tar.gz", + "has_sig": false, + "md5_digest": "554794453502d266a90d2254fcb1f7c3", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.9", + "size": 37969, + "upload_time": "2025-11-19T15:32:20", + "upload_time_iso_8601": "2025-11-19T15:32:20.106038Z", + "url": "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/data/pypi/asgiref.json b/tests/data/pypi/asgiref.json new file mode 100644 index 0000000..f9cf932 --- /dev/null +++ b/tests/data/pypi/asgiref.json @@ -0,0 +1,3069 @@ +{ + "info": { + "author": "Django Software Foundation", + "author_email": "foundation@djangoproject.com", + "bugtrack_url": null, + "classifiers": [ + "Development Status :: 5 - Production/Stable", + "Environment :: Web Environment", + "Intended Audience :: Developers", + "License :: OSI Approved :: BSD License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.9", + "Topic :: Internet :: WWW/HTTP" + ], + "description": "asgiref\n=======\n\n.. image:: https://github.com/django/asgiref/actions/workflows/tests.yml/badge.svg\n :target: https://github.com/django/asgiref/actions/workflows/tests.yml\n\n.. image:: https://img.shields.io/pypi/v/asgiref.svg\n :target: https://pypi.python.org/pypi/asgiref\n\nASGI is a standard for Python asynchronous web apps and servers to communicate\nwith each other, and positioned as an asynchronous successor to WSGI. You can\nread more at https://asgi.readthedocs.io/en/latest/\n\nThis package includes ASGI base libraries, such as:\n\n* Sync-to-async and async-to-sync function wrappers, ``asgiref.sync``\n* Server base classes, ``asgiref.server``\n* A WSGI-to-ASGI adapter, in ``asgiref.wsgi``\n\n\nFunction wrappers\n-----------------\n\nThese allow you to wrap or decorate async or sync functions to call them from\nthe other style (so you can call async functions from a synchronous thread,\nor vice-versa).\n\nIn particular:\n\n* AsyncToSync lets a synchronous subthread stop and wait while the async\n function is called on the main thread's event loop, and then control is\n returned to the thread when the async function is finished.\n\n* SyncToAsync lets async code call a synchronous function, which is run in\n a threadpool and control returned to the async coroutine when the synchronous\n function completes.\n\nThe idea is to make it easier to call synchronous APIs from async code and\nasynchronous APIs from synchronous code so it's easier to transition code from\none style to the other. In the case of Channels, we wrap the (synchronous)\nDjango view system with SyncToAsync to allow it to run inside the (asynchronous)\nASGI server.\n\nNote that exactly what threads things run in is very specific, and aimed to\nkeep maximum compatibility with old synchronous code. See\n\"Synchronous code & Threads\" below for a full explanation. By default,\n``sync_to_async`` will run all synchronous code in the program in the same\nthread for safety reasons; you can disable this for more performance with\n``@sync_to_async(thread_sensitive=False)``, but make sure that your code does\nnot rely on anything bound to threads (like database connections) when you do.\n\n\nThreadlocal replacement\n-----------------------\n\nThis is a drop-in replacement for ``threading.local`` that works with both\nthreads and asyncio Tasks. Even better, it will proxy values through from a\ntask-local context to a thread-local context when you use ``sync_to_async``\nto run things in a threadpool, and vice-versa for ``async_to_sync``.\n\nIf you instead want true thread- and task-safety, you can set\n``thread_critical`` on the Local object to ensure this instead.\n\n\nServer base classes\n-------------------\n\nIncludes a ``StatelessServer`` class which provides all the hard work of\nwriting a stateless server (as in, does not handle direct incoming sockets\nbut instead consumes external streams or sockets to work out what is happening).\n\nAn example of such a server would be a chatbot server that connects out to\na central chat server and provides a \"connection scope\" per user chatting to\nit. There's only one actual connection, but the server has to separate things\ninto several scopes for easier writing of the code.\n\nYou can see an example of this being used in `frequensgi \u003Chttps://github.com/andrewgodwin/frequensgi\u003E`_.\n\n\nWSGI-to-ASGI adapter\n--------------------\n\nAllows you to wrap a WSGI application so it appears as a valid ASGI application.\n\nSimply wrap it around your WSGI application like so::\n\n asgi_application = WsgiToAsgi(wsgi_application)\n\nThe WSGI application will be run in a synchronous threadpool, and the wrapped\nASGI application will be one that accepts ``http`` class messages.\n\nPlease note that not all extended features of WSGI may be supported (such as\nfile handles for incoming POST bodies).\n\n\nDependencies\n------------\n\n``asgiref`` requires Python 3.9 or higher.\n\n\nContributing\n------------\n\nPlease refer to the\n`main Channels contributing docs \u003Chttps://github.com/django/channels/blob/master/CONTRIBUTING.rst\u003E`_.\n\n\nTesting\n'''''''\n\nTo run tests, make sure you have installed the ``tests`` extra with the package::\n\n cd asgiref/\n pip install -e .[tests]\n pytest\n\n\nBuilding the documentation\n''''''''''''''''''''''''''\n\nThe documentation uses `Sphinx \u003Chttp://www.sphinx-doc.org\u003E`_::\n\n cd asgiref/docs/\n pip install sphinx\n\nTo build the docs, you can use the default tools::\n\n sphinx-build -b html . _build/html # or `make html`, if you've got make set up\n cd _build/html\n python -m http.server\n\n...or you can use ``sphinx-autobuild`` to run a server and rebuild/reload\nyour documentation changes automatically::\n\n pip install sphinx-autobuild\n sphinx-autobuild . _build/html\n\n\nReleasing\n'''''''''\n\nTo release, first add details to CHANGELOG.txt and update the version number in ``asgiref/__init__.py``.\n\nThen, build and push the packages::\n\n python -m build\n twine upload dist/*\n rm -r asgiref.egg-info dist\n\n\nImplementation Details\n----------------------\n\nSynchronous code & threads\n''''''''''''''''''''''''''\n\nThe ``asgiref.sync`` module provides two wrappers that let you go between\nasynchronous and synchronous code at will, while taking care of the rough edges\nfor you.\n\nUnfortunately, the rough edges are numerous, and the code has to work especially\nhard to keep things in the same thread as much as possible. Notably, the\nrestrictions we are working with are:\n\n* All synchronous code called through ``SyncToAsync`` and marked with\n ``thread_sensitive`` should run in the same thread as each other (and if the\n outer layer of the program is synchronous, the main thread)\n\n* If a thread already has a running async loop, ``AsyncToSync`` can't run things\n on that loop if it's blocked on synchronous code that is above you in the\n call stack.\n\nThe first compromise you get to might be that ``thread_sensitive`` code should\njust run in the same thread and not spawn in a sub-thread, fulfilling the first\nrestriction, but that immediately runs you into the second restriction.\n\nThe only real solution is to essentially have a variant of ThreadPoolExecutor\nthat executes any ``thread_sensitive`` code on the outermost synchronous\nthread - either the main thread, or a single spawned subthread.\n\nThis means you now have two basic states:\n\n* If the outermost layer of your program is synchronous, then all async code\n run through ``AsyncToSync`` will run in a per-call event loop in arbitrary\n sub-threads, while all ``thread_sensitive`` code will run in the main thread.\n\n* If the outermost layer of your program is asynchronous, then all async code\n runs on the main thread's event loop, and all ``thread_sensitive`` synchronous\n code will run in a single shared sub-thread.\n\nCrucially, this means that in both cases there is a thread which is a shared\nresource that all ``thread_sensitive`` code must run on, and there is a chance\nthat this thread is currently blocked on its own ``AsyncToSync`` call. Thus,\n``AsyncToSync`` needs to act as an executor for thread code while it's blocking.\n\nThe ``CurrentThreadExecutor`` class provides this functionality; rather than\nsimply waiting on a Future, you can call its ``run_until_future`` method and\nit will run submitted code until that Future is done. This means that code\ninside the call can then run code on your thread.\n\n\nMaintenance and Security\n------------------------\n\nTo report security issues, please contact security@djangoproject.com. For GPG\nsignatures and more security process information, see\nhttps://docs.djangoproject.com/en/dev/internals/security/.\n\nTo report bugs or request new features, please open a new GitHub issue.\n\nThis repository is part of the Channels project. For the shepherd and maintenance team, please see the\n`main Channels readme \u003Chttps://github.com/django/channels/blob/master/README.rst\u003E`_.\n", + "description_content_type": null, + "docs_url": null, + "download_url": null, + "downloads": { + "last_day": -1, + "last_month": -1, + "last_week": -1 + }, + "dynamic": [ + "License-File" + ], + "home_page": "https://github.com/django/asgiref/", + "keywords": null, + "license": "BSD-3-Clause", + "license_expression": null, + "license_files": [ + "LICENSE" + ], + "maintainer": null, + "maintainer_email": null, + "name": "asgiref", + "package_url": "https://pypi.org/project/asgiref/", + "platform": null, + "project_url": "https://pypi.org/project/asgiref/", + "project_urls": { + "Changelog": "https://github.com/django/asgiref/blob/master/CHANGELOG.txt", + "Documentation": "https://asgi.readthedocs.io/", + "Further Documentation": "https://docs.djangoproject.com/en/stable/topics/async/#async-adapter-functions", + "Homepage": "https://github.com/django/asgiref/" + }, + "provides_extra": [ + "tests" + ], + "release_url": "https://pypi.org/project/asgiref/3.11.0/", + "requires_dist": [ + "typing_extensions\u003E=4; python_version \u003C \"3.11\"", + "pytest; extra == \"tests\"", + "pytest-asyncio; extra == \"tests\"", + "mypy\u003E=1.14.0; extra == \"tests\"" + ], + "requires_python": "\u003E=3.9", + "summary": "ASGI specs, helper code, and adapters", + "version": "3.11.0", + "yanked": false, + "yanked_reason": null + }, + "last_serial": 32495228, + "releases": { + "0.10.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "a437d098cb5d7273de91d8c6fe29af04a6feb04a936721338d9eade3f594bd3d", + "md5": "0727843634a38a078b2a8dd396376cd3", + "sha256": "5d8c375b6362653ceb542e65b20fc19f4d1e09472d2effeef356a8c71abe13ad" + }, + "downloads": -1, + "filename": "asgiref-0.10.0.tar.gz", + "has_sig": false, + "md5_digest": "0727843634a38a078b2a8dd396376cd3", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 6199, + "upload_time": "2016-03-21T23:33:35", + "upload_time_iso_8601": "2016-03-21T23:33:35.622600Z", + "url": "https://files.pythonhosted.org/packages/a4/37/d098cb5d7273de91d8c6fe29af04a6feb04a936721338d9eade3f594bd3d/asgiref-0.10.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.11.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "bbdedacef231797dac113172fbd69911d869160a6db99d750beff7adae83d691", + "md5": "b512a009b4df5f9ffdd30ede30b629a1", + "sha256": "8b9bb494e77b773c8d7579b80a58a7e361084c7496ba7dd72343fa858744f1ff" + }, + "downloads": -1, + "filename": "asgiref-0.11.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "b512a009b4df5f9ffdd30ede30b629a1", + "packagetype": "bdist_wheel", + "python_version": "3.4", + "requires_python": null, + "size": 9293, + "upload_time": "2016-03-27T18:09:44", + "upload_time_iso_8601": "2016-03-27T18:09:44.685932Z", + "url": "https://files.pythonhosted.org/packages/bb/de/dacef231797dac113172fbd69911d869160a6db99d750beff7adae83d691/asgiref-0.11.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "3d8f50c12a2fffd6057909cb08573b83ab6b0859ed44d21ba254467174545320", + "md5": "11e8adad12e003c8dc84f51b9b5137c6", + "sha256": "57920248678e9111404d0797edd1b4014d8e13b3da47e01ab6fe540402874eae" + }, + "downloads": -1, + "filename": "asgiref-0.11.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "11e8adad12e003c8dc84f51b9b5137c6", + "packagetype": "bdist_wheel", + "python_version": "3.4", + "requires_python": null, + "size": 9291, + "upload_time": "2016-03-27T18:08:32", + "upload_time_iso_8601": "2016-03-27T18:08:32.807679Z", + "url": "https://files.pythonhosted.org/packages/3d/8f/50c12a2fffd6057909cb08573b83ab6b0859ed44d21ba254467174545320/asgiref-0.11.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "b3bae77410b06fa51377b26ff6ff7a0cc3bad65d0987f3b827814baf51fae325", + "md5": "eca525601a8c90fde7932314be5e7a0b", + "sha256": "9c847a435e220ab7ad6cadc9cec8fd02f731d387f9c60dcbee4b6e461997b112" + }, + "downloads": -1, + "filename": "asgiref-0.11.0.tar.gz", + "has_sig": false, + "md5_digest": "eca525601a8c90fde7932314be5e7a0b", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 6565, + "upload_time": "2016-03-27T18:08:15", + "upload_time_iso_8601": "2016-03-27T18:08:15.391942Z", + "url": "https://files.pythonhosted.org/packages/b3/ba/e77410b06fa51377b26ff6ff7a0cc3bad65d0987f3b827814baf51fae325/asgiref-0.11.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.11.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "7a56cd5d86491740b5ca7163cbc2ea78cb04fecaef78c4ee9492d2cd49d1a867", + "md5": "30bf38dd9861dd0a6b2ddeecbce9df08", + "sha256": "6a689c38e7d94c0d2dba11fecb4db2155bd9a58a64a2b348609354a6964b46f7" + }, + "downloads": -1, + "filename": "asgiref-0.11.1-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "30bf38dd9861dd0a6b2ddeecbce9df08", + "packagetype": "bdist_wheel", + "python_version": "3.4", + "requires_python": null, + "size": 9621, + "upload_time": "2016-03-27T20:27:34", + "upload_time_iso_8601": "2016-03-27T20:27:34.292302Z", + "url": "https://files.pythonhosted.org/packages/7a/56/cd5d86491740b5ca7163cbc2ea78cb04fecaef78c4ee9492d2cd49d1a867/asgiref-0.11.1-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "9ad03434a948687146a295c73cb7b835eeb04ce2b4329f08a44664339617dcbd", + "md5": "104204df38d772d243e3041cf674b908", + "sha256": "ddec508e294b973db07bf09bb7400c62af05db5da24a09b787f7fda7b62ab088" + }, + "downloads": -1, + "filename": "asgiref-0.11.1.tar.gz", + "has_sig": false, + "md5_digest": "104204df38d772d243e3041cf674b908", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 6879, + "upload_time": "2016-03-27T20:27:29", + "upload_time_iso_8601": "2016-03-27T20:27:29.459438Z", + "url": "https://files.pythonhosted.org/packages/9a/d0/3434a948687146a295c73cb7b835eeb04ce2b4329f08a44664339617dcbd/asgiref-0.11.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.11.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "000e3bcbf43baed415a625cf7c15985c5fc3f8f821592562fc4a3b295a513271", + "md5": "71f115d1e008e7cdbb882da7cfede785", + "sha256": "e074ff7f55708faae9f01d521f5e9f93762be41ddbe0fda120af24592c2344b4" + }, + "downloads": -1, + "filename": "asgiref-0.11.2-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "71f115d1e008e7cdbb882da7cfede785", + "packagetype": "bdist_wheel", + "python_version": "3.4", + "requires_python": null, + "size": 9897, + "upload_time": "2016-03-29T09:47:30", + "upload_time_iso_8601": "2016-03-29T09:47:30.239762Z", + "url": "https://files.pythonhosted.org/packages/00/0e/3bcbf43baed415a625cf7c15985c5fc3f8f821592562fc4a3b295a513271/asgiref-0.11.2-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "f89855233ebeedb8cb7978101c1034b884c1f576f213e265d4e1f6b297c7bd6d", + "md5": "3d2ca654cab9c4fca10d0b983f6e1788", + "sha256": "d053d0b5680ad681b0d9ac2ab0cd00b31e9ba77d87054fcdb6bbdc2211704550" + }, + "downloads": -1, + "filename": "asgiref-0.11.2.tar.gz", + "has_sig": false, + "md5_digest": "3d2ca654cab9c4fca10d0b983f6e1788", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 6993, + "upload_time": "2016-03-29T09:47:24", + "upload_time_iso_8601": "2016-03-29T09:47:24.798263Z", + "url": "https://files.pythonhosted.org/packages/f8/98/55233ebeedb8cb7978101c1034b884c1f576f213e265d4e1f6b297c7bd6d/asgiref-0.11.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.12.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "6565e951eadcd15c23a776781b1e2cf0597855d46f3da293d9b56b6e227bf324", + "md5": "8cd0c2e0ea8b70ada9787444b98d9a5a", + "sha256": "797a62a2a089ccd3c413578bde87730d4e200c066a02cae58627696503d66412" + }, + "downloads": -1, + "filename": "asgiref-0.12.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "8cd0c2e0ea8b70ada9787444b98d9a5a", + "packagetype": "bdist_wheel", + "python_version": "2.7", + "requires_python": null, + "size": 10281, + "upload_time": "2016-05-06T05:54:46", + "upload_time_iso_8601": "2016-05-06T05:54:46.787941Z", + "url": "https://files.pythonhosted.org/packages/65/65/e951eadcd15c23a776781b1e2cf0597855d46f3da293d9b56b6e227bf324/asgiref-0.12.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "a9005230348163f4f0a9234c87dab2abf521dc62e15b6b650c1f4dc132bd873e", + "md5": "a8db0f77556954d2779b4c1926d163f0", + "sha256": "d65671aa25e8485824d1797d5b588c9d9d214e1d5674e5b79a1ffa75f32faaff" + }, + "downloads": -1, + "filename": "asgiref-0.12.0.tar.gz", + "has_sig": false, + "md5_digest": "a8db0f77556954d2779b4c1926d163f0", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 7333, + "upload_time": "2016-05-06T05:54:58", + "upload_time_iso_8601": "2016-05-06T05:54:58.290741Z", + "url": "https://files.pythonhosted.org/packages/a9/00/5230348163f4f0a9234c87dab2abf521dc62e15b6b650c1f4dc132bd873e/asgiref-0.12.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.12.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "f7f8d0e02e4c4333661a954e45b9bdbe19cc7121cf6b04db4a82ba044c007d6e", + "md5": "73f648d23793f1f04f277cfdce7ebf32", + "sha256": "5682166790b727530de5e7d1636f1c677df0228993cceb3996287beee9489006" + }, + "downloads": -1, + "filename": "asgiref-0.12.1-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "73f648d23793f1f04f277cfdce7ebf32", + "packagetype": "bdist_wheel", + "python_version": "2.7", + "requires_python": null, + "size": 10231, + "upload_time": "2016-05-07T01:34:42", + "upload_time_iso_8601": "2016-05-07T01:34:42.418351Z", + "url": "https://files.pythonhosted.org/packages/f7/f8/d0e02e4c4333661a954e45b9bdbe19cc7121cf6b04db4a82ba044c007d6e/asgiref-0.12.1-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "20e879c0bb95ca282500344d76b0337364874f58313150b12958e4fef0ef39cc", + "md5": "75c560f11eca2dabffb8b4c6c98d2afa", + "sha256": "1a2f6c388379e40dc477e49418a9e6346c2af1b46df7b551708c98e57b540d24" + }, + "downloads": -1, + "filename": "asgiref-0.12.1.tar.gz", + "has_sig": false, + "md5_digest": "75c560f11eca2dabffb8b4c6c98d2afa", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 7287, + "upload_time": "2016-05-07T01:34:48", + "upload_time_iso_8601": "2016-05-07T01:34:48.417510Z", + "url": "https://files.pythonhosted.org/packages/20/e8/79c0bb95ca282500344d76b0337364874f58313150b12958e4fef0ef39cc/asgiref-0.12.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.13.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "dc4140dc641061f7ccd00d9a99e17156ce00551724ca5892354e228f5637c96b", + "md5": "c41bd0b520a163720141db2072c7dc08", + "sha256": "e1ee297f1e8bd3a1618b4398d448a8632ff164e27e3ff4208879c426da2648b4" + }, + "downloads": -1, + "filename": "asgiref-0.13.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "c41bd0b520a163720141db2072c7dc08", + "packagetype": "bdist_wheel", + "python_version": "3.4", + "requires_python": null, + "size": 12201, + "upload_time": "2016-05-07T19:26:17", + "upload_time_iso_8601": "2016-05-07T19:26:17.512930Z", + "url": "https://files.pythonhosted.org/packages/dc/41/40dc641061f7ccd00d9a99e17156ce00551724ca5892354e228f5637c96b/asgiref-0.13.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "6f63f038c7c63d52f07b2d68ad8d003fe3c6e64cdc5ad833418bfb52755bbbdd", + "md5": "27634fb9b9ff4a222873bc24cd8ae883", + "sha256": "47b72ba687c18103e0c7e2914c55d1f81d2e380955b9ed78b453bc19347bec88" + }, + "downloads": -1, + "filename": "asgiref-0.13.0.tar.gz", + "has_sig": false, + "md5_digest": "27634fb9b9ff4a222873bc24cd8ae883", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 8235, + "upload_time": "2016-05-07T19:26:09", + "upload_time_iso_8601": "2016-05-07T19:26:09.118881Z", + "url": "https://files.pythonhosted.org/packages/6f/63/f038c7c63d52f07b2d68ad8d003fe3c6e64cdc5ad833418bfb52755bbbdd/asgiref-0.13.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.13.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "936efb3fc8e2ba5f34432989460e4a545311588fdf7cf3e42fe3522f6df99bf8", + "md5": "8ff1f73fe369174c18be50394bfc42ef", + "sha256": "90bc4419f24065db8fc1a6306d82c2a4d65affbb0070b8e78e3bf20dfdb4fe3e" + }, + "downloads": -1, + "filename": "asgiref-0.13.2-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "8ff1f73fe369174c18be50394bfc42ef", + "packagetype": "bdist_wheel", + "python_version": "2.7", + "requires_python": null, + "size": 12926, + "upload_time": "2016-06-08T23:57:02", + "upload_time_iso_8601": "2016-06-08T23:57:02.546819Z", + "url": "https://files.pythonhosted.org/packages/93/6e/fb3fc8e2ba5f34432989460e4a545311588fdf7cf3e42fe3522f6df99bf8/asgiref-0.13.2-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "ca7ed379d6e2fbc40ee07bea813214fc90392c9e82a2eda6ab858927abbcfd79", + "md5": "3019bcebc4ec336ccf616fbf1508dfe6", + "sha256": "9509f6ad066e623d863f0572c968535d50ef95934cd9299f642fad63bcc6617c" + }, + "downloads": -1, + "filename": "asgiref-0.13.2.tar.gz", + "has_sig": false, + "md5_digest": "3019bcebc4ec336ccf616fbf1508dfe6", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 8731, + "upload_time": "2016-06-08T23:44:10", + "upload_time_iso_8601": "2016-06-08T23:44:10.220256Z", + "url": "https://files.pythonhosted.org/packages/ca/7e/d379d6e2fbc40ee07bea813214fc90392c9e82a2eda6ab858927abbcfd79/asgiref-0.13.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.13.3": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "a3b6e14cacc567065ac79b87c7f51f11dd4d482f27ff583e4a84da64c241570a", + "md5": "ba697ab6fae2b892a5915cd15f1b3113", + "sha256": "6afc1a2807d5e106762aee44c46fc8ec1e6f8c4dd0487645b1710e9ec58bb686" + }, + "downloads": -1, + "filename": "asgiref-0.13.3.tar.gz", + "has_sig": false, + "md5_digest": "ba697ab6fae2b892a5915cd15f1b3113", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 8728, + "upload_time": "2016-06-09T00:07:01", + "upload_time_iso_8601": "2016-06-09T00:07:01.231883Z", + "url": "https://files.pythonhosted.org/packages/a3/b6/e14cacc567065ac79b87c7f51f11dd4d482f27ff583e4a84da64c241570a/asgiref-0.13.3.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.14.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "11363301407c337fca6c2c619e64e937f3ac4281ea381dae942e0f9888a437a1", + "md5": "4ed35213a178783192a37387ae99ae5c", + "sha256": "8c30206bb66d83d8f941c0a21661e21676fdb3f3994d85787da794f6aa78dcbd" + }, + "downloads": -1, + "filename": "asgiref-0.14.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "4ed35213a178783192a37387ae99ae5c", + "packagetype": "bdist_wheel", + "python_version": "3.4", + "requires_python": null, + "size": 12745, + "upload_time": "2016-07-17T05:44:32", + "upload_time_iso_8601": "2016-07-17T05:44:32.151501Z", + "url": "https://files.pythonhosted.org/packages/11/36/3301407c337fca6c2c619e64e937f3ac4281ea381dae942e0f9888a437a1/asgiref-0.14.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "33dd62fe8bb04e92c5a8be83642c151a1f80d519bee5b1446bf47024fa734ca5", + "md5": "77c219393004f63043985946b8c855e9", + "sha256": "8c0e920b9162a1b2d1999c828860aa3a031733a97d7b5b3eafe29d7649f884f3" + }, + "downloads": -1, + "filename": "asgiref-0.14.0.tar.gz", + "has_sig": false, + "md5_digest": "77c219393004f63043985946b8c855e9", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 8781, + "upload_time": "2016-07-17T05:44:29", + "upload_time_iso_8601": "2016-07-17T05:44:29.528728Z", + "url": "https://files.pythonhosted.org/packages/33/dd/62fe8bb04e92c5a8be83642c151a1f80d519bee5b1446bf47024fa734ca5/asgiref-0.14.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.8": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "c0c656e967493d35d7baf033b60c133e847832c659e5018fc9aeda892fb60945", + "md5": "35b4fff7f04caf49ac4874f8e7517c06", + "sha256": "ba30a973c12b58b5e7cc254af0f781dffbe9bfbcf3a73bec6ffac17c5ac4190c" + }, + "downloads": -1, + "filename": "asgiref-0.8.tar.gz", + "has_sig": false, + "md5_digest": "35b4fff7f04caf49ac4874f8e7517c06", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 2433, + "upload_time": "2016-01-03T06:46:35", + "upload_time_iso_8601": "2016-01-03T06:46:35.715334Z", + "url": "https://files.pythonhosted.org/packages/c0/c6/56e967493d35d7baf033b60c133e847832c659e5018fc9aeda892fb60945/asgiref-0.8.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.9": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "646edca52fec3e4b906e9b8c9dbd5de50b2f516f810f6401d828692cccc03345", + "md5": "c461411b4641acff9f88b5b400b22636", + "sha256": "7df6d9dd26ab295063b8a911bc0f24b48bb55dfcc62e0fd579b1f92a77ad91d0" + }, + "downloads": -1, + "filename": "asgiref-0.9.tar.gz", + "has_sig": false, + "md5_digest": "c461411b4641acff9f88b5b400b22636", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 4470, + "upload_time": "2016-02-06T00:21:46", + "upload_time_iso_8601": "2016-02-06T00:21:46.088472Z", + "url": "https://files.pythonhosted.org/packages/64/6e/dca52fec3e4b906e9b8c9dbd5de50b2f516f810f6401d828692cccc03345/asgiref-0.9.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "0.9.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "5433f2f8b993f64f67859a46494dc39b8886fa193b03a833840c2baf4201f34c", + "md5": "d36136521ff500e688c8d33a6e15af5a", + "sha256": "682a87cd5ec86c4f4ea2dacdcbcf5483a3d7c5a7acc238d688ade4e72ad14b1d" + }, + "downloads": -1, + "filename": "asgiref-0.9.1.tar.gz", + "has_sig": false, + "md5_digest": "d36136521ff500e688c8d33a6e15af5a", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 6168, + "upload_time": "2016-03-04T01:26:06", + "upload_time_iso_8601": "2016-03-04T01:26:06.731370Z", + "url": "https://files.pythonhosted.org/packages/54/33/f2f8b993f64f67859a46494dc39b8886fa193b03a833840c2baf4201f34c/asgiref-0.9.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.0.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "52843404065fdd4c834ab4b8a3533822672a608c6ad73226cfec9d90265b94ec", + "md5": "13819815930d2916dc4bfd5cc1e28624", + "sha256": "b7d118253c23545707a540a9e9f54f99dc75df4df8ddd62eac6415da0a306581" + }, + "downloads": -1, + "filename": "asgiref-1.0.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "13819815930d2916dc4bfd5cc1e28624", + "packagetype": "bdist_wheel", + "python_version": "3.4", + "requires_python": null, + "size": 13533, + "upload_time": "2016-11-04T13:26:25", + "upload_time_iso_8601": "2016-11-04T13:26:25.680171Z", + "url": "https://files.pythonhosted.org/packages/52/84/3404065fdd4c834ab4b8a3533822672a608c6ad73226cfec9d90265b94ec/asgiref-1.0.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "51e92cf275a4145e7feef53d5370e7e7fe738f7120d61cc0a5f9b11f606f34e4", + "md5": "82a269dba15c1a95383b249abcfe4822", + "sha256": "f13c68118e7623938db2def36eea29d66b5381691d9c30da26cc1eab65b7e4c9" + }, + "downloads": -1, + "filename": "asgiref-1.0.0.tar.gz", + "has_sig": false, + "md5_digest": "82a269dba15c1a95383b249abcfe4822", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 9343, + "upload_time": "2016-11-04T13:26:23", + "upload_time_iso_8601": "2016-11-04T13:26:23.000828Z", + "url": "https://files.pythonhosted.org/packages/51/e9/2cf275a4145e7feef53d5370e7e7fe738f7120d61cc0a5f9b11f606f34e4/asgiref-1.0.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.0.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "d61e9c954831e1c0f297980984b0506fdb05eec76e08ce5efe492b23456c1e9b", + "md5": "acc9dbe91b529089948776a1f6a7b717", + "sha256": "dac4b6782ae55a5e7bb03cfc51e76e71e6cc7a4deb3bd1303c6b6cdc510387e8" + }, + "downloads": -1, + "filename": "asgiref-1.0.1-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "acc9dbe91b529089948776a1f6a7b717", + "packagetype": "bdist_wheel", + "python_version": "3.4", + "requires_python": null, + "size": 13848, + "upload_time": "2017-03-19T18:22:52", + "upload_time_iso_8601": "2017-03-19T18:22:52.428409Z", + "url": "https://files.pythonhosted.org/packages/d6/1e/9c954831e1c0f297980984b0506fdb05eec76e08ce5efe492b23456c1e9b/asgiref-1.0.1-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "e894ef3fd720c5913a4e038829fb3435efea9314731b11484764a9df64e48a20", + "md5": "8665d245233e033f90126c7a3544f1ff", + "sha256": "0979f2bb6294ab0b55f19882bd85defb279349a2e538ce351b14eaa6d8e28fff" + }, + "downloads": -1, + "filename": "asgiref-1.0.1.tar.gz", + "has_sig": false, + "md5_digest": "8665d245233e033f90126c7a3544f1ff", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 8375, + "upload_time": "2017-03-19T18:22:50", + "upload_time_iso_8601": "2017-03-19T18:22:50.599871Z", + "url": "https://files.pythonhosted.org/packages/e8/94/ef3fd720c5913a4e038829fb3435efea9314731b11484764a9df64e48a20/asgiref-1.0.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.1.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "fd2fc93a39158e5037dab47c076fc5cfabd2f3332253ffd6c70d85604d67690d", + "md5": "3cdd6120157528989a2b13c83a548f1a", + "sha256": "e688711135ffbde7f8157ed314198c972b171d4a01dfe874eec8c92334d6e67c" + }, + "downloads": -1, + "filename": "asgiref-1.1.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "3cdd6120157528989a2b13c83a548f1a", + "packagetype": "bdist_wheel", + "python_version": "3.4", + "requires_python": null, + "size": 14554, + "upload_time": "2017-04-01T14:04:24", + "upload_time_iso_8601": "2017-04-01T14:04:24.929077Z", + "url": "https://files.pythonhosted.org/packages/fd/2f/c93a39158e5037dab47c076fc5cfabd2f3332253ffd6c70d85604d67690d/asgiref-1.1.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "294c9c6a071704413189f92374e635314e8a2ae5f72047c86fff79efa4e3c3f9", + "md5": "6a9e16c5b5c9728118a3de787c9a0495", + "sha256": "fb251d65f15e95f14e706592480f6aad4c4dba6b48b9f8ad12b5b13cdd0f1397" + }, + "downloads": -1, + "filename": "asgiref-1.1.0.tar.gz", + "has_sig": false, + "md5_digest": "6a9e16c5b5c9728118a3de787c9a0495", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 9072, + "upload_time": "2017-04-01T14:04:23", + "upload_time_iso_8601": "2017-04-01T14:04:23.000920Z", + "url": "https://files.pythonhosted.org/packages/29/4c/9c6a071704413189f92374e635314e8a2ae5f72047c86fff79efa4e3c3f9/asgiref-1.1.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.1.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "a6e955c236797474fc534863ca4da2cca75a708c718d80b811266450c0cfa182", + "md5": "231418216fe59bb24501ef036038cf12", + "sha256": "aaf199524607300b7e3489bc0b3ca9391d9e055c7fd7bcb60147f46aa2742450" + }, + "downloads": -1, + "filename": "asgiref-1.1.1-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "231418216fe59bb24501ef036038cf12", + "packagetype": "bdist_wheel", + "python_version": "3.4", + "requires_python": null, + "size": 14583, + "upload_time": "2017-04-02T14:19:51", + "upload_time_iso_8601": "2017-04-02T14:19:51.755596Z", + "url": "https://files.pythonhosted.org/packages/a6/e9/55c236797474fc534863ca4da2cca75a708c718d80b811266450c0cfa182/asgiref-1.1.1-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "0de79fc51765849c89d1ddc7528ec06659dba460a7bf7de1e7b37d685b532fcd", + "md5": "91560c23d3ee340d49ccfeff5ece27ac", + "sha256": "3aabdc84b483172191536d08f51fccb69556ab8875cfb23a448fdba9bded5e3d" + }, + "downloads": -1, + "filename": "asgiref-1.1.1.tar.gz", + "has_sig": false, + "md5_digest": "91560c23d3ee340d49ccfeff5ece27ac", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 9096, + "upload_time": "2017-04-02T14:19:48", + "upload_time_iso_8601": "2017-04-02T14:19:48.535814Z", + "url": "https://files.pythonhosted.org/packages/0d/e7/9fc51765849c89d1ddc7528ec06659dba460a7bf7de1e7b37d685b532fcd/asgiref-1.1.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "1.1.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "ee6d67f79a9567de5ba4419c3e8d39622bed0d974d704075d09df765b5ddb5ce", + "md5": "16411e2d9c2f7b617f427b3ba5190b69", + "sha256": "d69847e3164957f4e6da51d2f1192b920c6c7d626bd3fc55f47aa1295702a0ed" + }, + "downloads": -1, + "filename": "asgiref-1.1.2-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "16411e2d9c2f7b617f427b3ba5190b69", + "packagetype": "bdist_wheel", + "python_version": "2.7", + "requires_python": null, + "size": 12610, + "upload_time": "2017-05-16T22:45:47", + "upload_time_iso_8601": "2017-05-16T22:45:47.178904Z", + "url": "https://files.pythonhosted.org/packages/ee/6d/67f79a9567de5ba4419c3e8d39622bed0d974d704075d09df765b5ddb5ce/asgiref-1.1.2-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "e11b48e71f2a8b874a0dbd33b587827ee320cfb9dcbfaf1ed92a028be81bb86a", + "md5": "323b849cb9a73f770ed96f3d5d46e43b", + "sha256": "8b46c3d6e2ad354d9da3cfb9873f9bd46fe1b768fbc11065275ba5430a46700c" + }, + "downloads": -1, + "filename": "asgiref-1.1.2.tar.gz", + "has_sig": false, + "md5_digest": "323b849cb9a73f770ed96f3d5d46e43b", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 10196, + "upload_time": "2017-05-16T22:45:44", + "upload_time_iso_8601": "2017-05-16T22:45:44.933328Z", + "url": "https://files.pythonhosted.org/packages/e1/1b/48e71f2a8b874a0dbd33b587827ee320cfb9dcbfaf1ed92a028be81bb86a/asgiref-1.1.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.0.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "a82e07563da320cd9c6fa93dab85450e9c58ea387f91a8a472dbc411f9d27367", + "md5": "3e994da67a95539915d543cd6b199ea1", + "sha256": "e291b776488961afe6989222fc221ba5dbf5d492ab1958df3c68c128040d0c74" + }, + "downloads": -1, + "filename": "asgiref-2.0.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "3e994da67a95539915d543cd6b199ea1", + "packagetype": "bdist_wheel", + "python_version": "3.5", + "requires_python": null, + "size": 19461, + "upload_time": "2017-11-29T00:59:46", + "upload_time_iso_8601": "2017-11-29T00:59:46.792915Z", + "url": "https://files.pythonhosted.org/packages/a8/2e/07563da320cd9c6fa93dab85450e9c58ea387f91a8a472dbc411f9d27367/asgiref-2.0.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "ae633bdb07b484b202cf8c57a166cf0bb6597980007bb62e6af58e910f2eb084", + "md5": "4f35331455a3fef3b6121eace8aa58cd", + "sha256": "6aa24e9ea5020409e7e9ef39095527c174e49f36452ae3251033cb26b46293d3" + }, + "downloads": -1, + "filename": "asgiref-2.0.0.tar.gz", + "has_sig": false, + "md5_digest": "4f35331455a3fef3b6121eace8aa58cd", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 7059, + "upload_time": "2017-11-29T00:59:45", + "upload_time_iso_8601": "2017-11-29T00:59:45.236766Z", + "url": "https://files.pythonhosted.org/packages/ae/63/3bdb07b484b202cf8c57a166cf0bb6597980007bb62e6af58e910f2eb084/asgiref-2.0.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.0.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "49acaa69932e176a5cae851a268c4ba58e6ff0bd6414396560a97f34c528418a", + "md5": "21268cf21071cf4f661b16d2a0cb5bc1", + "sha256": "5defc29c696578183d70c631e345b33517e41050e089552464e4af1f11ba4a2c" + }, + "downloads": -1, + "filename": "asgiref-2.0.1-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "21268cf21071cf4f661b16d2a0cb5bc1", + "packagetype": "bdist_wheel", + "python_version": "3.5", + "requires_python": null, + "size": 19133, + "upload_time": "2017-11-29T01:21:19", + "upload_time_iso_8601": "2017-11-29T01:21:19.495468Z", + "url": "https://files.pythonhosted.org/packages/49/ac/aa69932e176a5cae851a268c4ba58e6ff0bd6414396560a97f34c528418a/asgiref-2.0.1-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "2b3411c5278278d7bc88f60fb8970ec5ffe240356b6a39c7701df34f9aa0979d", + "md5": "d3cc9ea405098a6e6328c7a723f615ef", + "sha256": "c3d70c473a2b7e525e18e68504630943e107f5b32f440c00c8543f94f565c855" + }, + "downloads": -1, + "filename": "asgiref-2.0.1.tar.gz", + "has_sig": false, + "md5_digest": "d3cc9ea405098a6e6328c7a723f615ef", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 6920, + "upload_time": "2017-11-29T01:21:18", + "upload_time_iso_8601": "2017-11-29T01:21:18.044207Z", + "url": "https://files.pythonhosted.org/packages/2b/34/11c5278278d7bc88f60fb8970ec5ffe240356b6a39c7701df34f9aa0979d/asgiref-2.0.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.1.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "75688207f2d83ab6d6401be4f562b6b6b83b8d432438efb0eca369a8e86d4549", + "md5": "1d19bc3ee42a30ab9a8cff550b763e1d", + "sha256": "95f55cea1409db99b41fe6458b3d754712805a887b6a1ec2ebc661cc5b878555" + }, + "downloads": -1, + "filename": "asgiref-2.1.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "1d19bc3ee42a30ab9a8cff550b763e1d", + "packagetype": "bdist_wheel", + "python_version": "3.5", + "requires_python": null, + "size": 10737, + "upload_time": "2018-01-20T06:31:10", + "upload_time_iso_8601": "2018-01-20T06:31:10.800393Z", + "url": "https://files.pythonhosted.org/packages/75/68/8207f2d83ab6d6401be4f562b6b6b83b8d432438efb0eca369a8e86d4549/asgiref-2.1.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "9a1a34d117e8a64e8ea91d9fd96032bc41242cc58eb8d94a8d924415d3d5282e", + "md5": "764587a032612e33a9333d3be812b5dc", + "sha256": "2bfd70fcc51df4036768b91d7b13524090dc8f366d79fa44ba2b0aeb47306344" + }, + "downloads": -1, + "filename": "asgiref-2.1.0.tar.gz", + "has_sig": false, + "md5_digest": "764587a032612e33a9333d3be812b5dc", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 7544, + "upload_time": "2018-01-20T06:31:04", + "upload_time_iso_8601": "2018-01-20T06:31:04.557769Z", + "url": "https://files.pythonhosted.org/packages/9a/1a/34d117e8a64e8ea91d9fd96032bc41242cc58eb8d94a8d924415d3d5282e/asgiref-2.1.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.1.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "2c535fa61fddda18081e32a5d145ce08f1dbd5a2b792600dd40c54e0fcd58430", + "md5": "beda20ac1cf6c9004aaaf1d06d62c225", + "sha256": "222ae0a5bfd787f0c102db70566592966e86df28965b81597952576390dc6ec0" + }, + "downloads": -1, + "filename": "asgiref-2.1.1-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "beda20ac1cf6c9004aaaf1d06d62c225", + "packagetype": "bdist_wheel", + "python_version": "3.5", + "requires_python": null, + "size": 10952, + "upload_time": "2018-02-03T07:19:54", + "upload_time_iso_8601": "2018-02-03T07:19:54.853194Z", + "url": "https://files.pythonhosted.org/packages/2c/53/5fa61fddda18081e32a5d145ce08f1dbd5a2b792600dd40c54e0fcd58430/asgiref-2.1.1-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "1bedd4fd440471d1e9a4a74a0e7680ef5189fbd5f5dbd9d937d826d4a4059be8", + "md5": "d90e0b3b650f4010081697a8cfa40918", + "sha256": "112828022d772925b47b22caf8108dadd3b26bb0af719eb01b2c3a807795429d" + }, + "downloads": -1, + "filename": "asgiref-2.1.1.tar.gz", + "has_sig": false, + "md5_digest": "d90e0b3b650f4010081697a8cfa40918", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 7732, + "upload_time": "2018-02-03T07:19:53", + "upload_time_iso_8601": "2018-02-03T07:19:53.354291Z", + "url": "https://files.pythonhosted.org/packages/1b/ed/d4fd440471d1e9a4a74a0e7680ef5189fbd5f5dbd9d937d826d4a4059be8/asgiref-2.1.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.1.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "7b74bb6ca144819bbe2f4f23e7d2dcbb25a76ffc2c0252decb2bfe429ccd3026", + "md5": "78d30cdbfb376c7a4c68f0dae9a28317", + "sha256": "3db42f644737aa03b405c2b1a397e07629974c0b0d62bfc2e56d3f3bbc8cdf25" + }, + "downloads": -1, + "filename": "asgiref-2.1.2-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "78d30cdbfb376c7a4c68f0dae9a28317", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 10983, + "upload_time": "2018-02-04T07:46:09", + "upload_time_iso_8601": "2018-02-04T07:46:09.121538Z", + "url": "https://files.pythonhosted.org/packages/7b/74/bb6ca144819bbe2f4f23e7d2dcbb25a76ffc2c0252decb2bfe429ccd3026/asgiref-2.1.2-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "5447df08000d066b197bd94d6158b22a3e8fd6b95b53f495024dcc2c13180baf", + "md5": "7fdc1c1f2c1c5972de191b06851ca25d", + "sha256": "01087b9abedc58001ae05d9b60ce8c02a45695a11233e27d6dc2e8aa8064fcea" + }, + "downloads": -1, + "filename": "asgiref-2.1.2.tar.gz", + "has_sig": false, + "md5_digest": "7fdc1c1f2c1c5972de191b06851ca25d", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 7730, + "upload_time": "2018-02-04T07:46:10", + "upload_time_iso_8601": "2018-02-04T07:46:10.650246Z", + "url": "https://files.pythonhosted.org/packages/54/47/df08000d066b197bd94d6158b22a3e8fd6b95b53f495024dcc2c13180baf/asgiref-2.1.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.1.3": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "3a9be0565463469ccd293f3ed3081ba9b5703b4148a2ec162343ba8da70412f4", + "md5": "f407f35377f998f56da0f45fea394a91", + "sha256": "deef2ee1281d827bfa69cb8676dfc6e53bd1ed8951c66f5e870abd767b7cb7fa" + }, + "downloads": -1, + "filename": "asgiref-2.1.3-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "f407f35377f998f56da0f45fea394a91", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 11024, + "upload_time": "2018-02-04T19:14:00", + "upload_time_iso_8601": "2018-02-04T19:14:00.790089Z", + "url": "https://files.pythonhosted.org/packages/3a/9b/e0565463469ccd293f3ed3081ba9b5703b4148a2ec162343ba8da70412f4/asgiref-2.1.3-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "ddeb4321a88ca5ed73ca27d648aea0810666e2c3f76b80d1809fa0f084c514c6", + "md5": "e062952c19fa25617146fc0cb84f0a70", + "sha256": "12773070ab13460af191a34fbc665f5a0f090a15bce7da31ec5e289c6ce8a1c6" + }, + "downloads": -1, + "filename": "asgiref-2.1.3.tar.gz", + "has_sig": false, + "md5_digest": "e062952c19fa25617146fc0cb84f0a70", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 7776, + "upload_time": "2018-02-04T19:14:01", + "upload_time_iso_8601": "2018-02-04T19:14:01.650830Z", + "url": "https://files.pythonhosted.org/packages/dd/eb/4321a88ca5ed73ca27d648aea0810666e2c3f76b80d1809fa0f084c514c6/asgiref-2.1.3.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.1.4": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "8635a8b1a07551419d314a34e890118ec0631f331f80bdc56dc150deb3fb0aad", + "md5": "abe71593b70d7ded6a54b649cc6a210d", + "sha256": "5992e60a40c77d143c65c2057a93112510141eb18042924c8f80704ef892a7c2" + }, + "downloads": -1, + "filename": "asgiref-2.1.4-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "abe71593b70d7ded6a54b649cc6a210d", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 11053, + "upload_time": "2018-02-08T01:13:47", + "upload_time_iso_8601": "2018-02-08T01:13:47.263133Z", + "url": "https://files.pythonhosted.org/packages/86/35/a8b1a07551419d314a34e890118ec0631f331f80bdc56dc150deb3fb0aad/asgiref-2.1.4-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "012ab81d679baf0b79ed9677ccd64cbd23da0376753533408bd60e628da1dc5a", + "md5": "29e75110155eaa07502746044d635a06", + "sha256": "758bed82647d7f6e50bad5f332fd5801014d8cb39c777b6c0f35374db6b57bc1" + }, + "downloads": -1, + "filename": "asgiref-2.1.4.tar.gz", + "has_sig": false, + "md5_digest": "29e75110155eaa07502746044d635a06", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 7808, + "upload_time": "2018-02-08T01:13:48", + "upload_time_iso_8601": "2018-02-08T01:13:48.393647Z", + "url": "https://files.pythonhosted.org/packages/01/2a/b81d679baf0b79ed9677ccd64cbd23da0376753533408bd60e628da1dc5a/asgiref-2.1.4.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.1.5": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "61f8324b42e78798ca20e1a28d46582657fc723589b14b6dbd2741cbd170c301", + "md5": "0b918cf14fc01e8b00668318d5cd6ada", + "sha256": "b0feae8ce0cee06b649a0e6090bef7fed4c87f90214105b2c3bcb4a90adb846f" + }, + "downloads": -1, + "filename": "asgiref-2.1.5-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "0b918cf14fc01e8b00668318d5cd6ada", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 11154, + "upload_time": "2018-02-14T23:45:38", + "upload_time_iso_8601": "2018-02-14T23:45:38.950186Z", + "url": "https://files.pythonhosted.org/packages/61/f8/324b42e78798ca20e1a28d46582657fc723589b14b6dbd2741cbd170c301/asgiref-2.1.5-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "0a15085243c3e6e1eefbd7afe478d1f137b03bfeda7a2f0148ca1ee7384fcd13", + "md5": "45e1edf2996139828d34edbe70efe1ad", + "sha256": "1a46196df28c67e046a54cc537ce5a8f6a59eb68649f54680d7e4fc3b113ab1b" + }, + "downloads": -1, + "filename": "asgiref-2.1.5.tar.gz", + "has_sig": false, + "md5_digest": "45e1edf2996139828d34edbe70efe1ad", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 7897, + "upload_time": "2018-02-14T23:45:39", + "upload_time_iso_8601": "2018-02-14T23:45:39.943314Z", + "url": "https://files.pythonhosted.org/packages/0a/15/085243c3e6e1eefbd7afe478d1f137b03bfeda7a2f0148ca1ee7384fcd13/asgiref-2.1.5.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.1.6": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "851e31c9b6f73e08a758fb07aa7115d60dd170bab072c222fd0075bdb4470967", + "md5": "90958d63d42455b06896d410367321c4", + "sha256": "8d8a2380ed0cdf553986e6184355e6e81886965b104ebbfbf8b4dbb91826ae9b" + }, + "downloads": -1, + "filename": "asgiref-2.1.6-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "90958d63d42455b06896d410367321c4", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 11176, + "upload_time": "2018-02-19T20:12:09", + "upload_time_iso_8601": "2018-02-19T20:12:09.667710Z", + "url": "https://files.pythonhosted.org/packages/85/1e/31c9b6f73e08a758fb07aa7115d60dd170bab072c222fd0075bdb4470967/asgiref-2.1.6-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "b89a9fa2c3b48bfa3e9d14b090a6fdcc468ce1ca8a9645cbc85069e571adc6b0", + "md5": "aa640bcb742123dfda6207a6c2f07e6a", + "sha256": "882ca28d791e5c9c624b25849d59191fe44b760a35f88726d7248700ce84bfa0" + }, + "downloads": -1, + "filename": "asgiref-2.1.6.tar.gz", + "has_sig": false, + "md5_digest": "aa640bcb742123dfda6207a6c2f07e6a", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 7919, + "upload_time": "2018-02-19T20:12:12", + "upload_time_iso_8601": "2018-02-19T20:12:12.179348Z", + "url": "https://files.pythonhosted.org/packages/b8/9a/9fa2c3b48bfa3e9d14b090a6fdcc468ce1ca8a9645cbc85069e571adc6b0/asgiref-2.1.6.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.2.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "755551b9825959692d775dcc65cc81e34befca5f920a518c4168b657d6508135", + "md5": "dfed467186b0e6cb4046549626b2bd49", + "sha256": "dae829002a586d96c37333562d78b78f7536cf49e1c189e151be6a62c5806ab0" + }, + "downloads": -1, + "filename": "asgiref-2.2.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "dfed467186b0e6cb4046549626b2bd49", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 11571, + "upload_time": "2018-03-07T02:35:55", + "upload_time_iso_8601": "2018-03-07T02:35:55.370816Z", + "url": "https://files.pythonhosted.org/packages/75/55/51b9825959692d775dcc65cc81e34befca5f920a518c4168b657d6508135/asgiref-2.2.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "2dc2493f91b49e2938cd0f333d78d7ccec024646bdfbc13d0d96431b89c4f2b4", + "md5": "a92a1fea8242af0bde8773707a49bd09", + "sha256": "9bf5cd9c9cabfb04e19b96fd44ea17723d111067f9ed1d2d8bbc6398c869b9ba" + }, + "downloads": -1, + "filename": "asgiref-2.2.0.tar.gz", + "has_sig": false, + "md5_digest": "a92a1fea8242af0bde8773707a49bd09", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 8182, + "upload_time": "2018-03-07T02:35:56", + "upload_time_iso_8601": "2018-03-07T02:35:56.195066Z", + "url": "https://files.pythonhosted.org/packages/2d/c2/493f91b49e2938cd0f333d78d7ccec024646bdfbc13d0d96431b89c4f2b4/asgiref-2.2.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.3.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "9a09188bc4155309e2fabdabec588ec33f629d7512c7f3c44520f146c1fe8003", + "md5": "c1597d4ff7c5c255f403f9737508415e", + "sha256": "6de821aa503a1b028cc590d8ad06a2995eacfd945c0b4d1dc285d0a304d611cc" + }, + "downloads": -1, + "filename": "asgiref-2.3.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "c1597d4ff7c5c255f403f9737508415e", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 9266, + "upload_time": "2018-04-12T03:50:31", + "upload_time_iso_8601": "2018-04-12T03:50:31.436981Z", + "url": "https://files.pythonhosted.org/packages/9a/09/188bc4155309e2fabdabec588ec33f629d7512c7f3c44520f146c1fe8003/asgiref-2.3.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "a91752c6eaa07a4babd1c0260d42f659266313ac90be88f1f8805b93f5ec072d", + "md5": "45233198d645be2bf2e9fa11517603f0", + "sha256": "4ee4b06686715291945fd6caffbf97f2a1cf5626a8d875f1a3aee244b672225e" + }, + "downloads": -1, + "filename": "asgiref-2.3.0.tar.gz", + "has_sig": false, + "md5_digest": "45233198d645be2bf2e9fa11517603f0", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 8301, + "upload_time": "2018-04-12T03:50:32", + "upload_time_iso_8601": "2018-04-12T03:50:32.257279Z", + "url": "https://files.pythonhosted.org/packages/a9/17/52c6eaa07a4babd1c0260d42f659266313ac90be88f1f8805b93f5ec072d/asgiref-2.3.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.3.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "d3dc4cb440a69d3e26dfe430955520057c1cde51bc2fd9208215cf6b5662634f", + "md5": "2f6a8818d6dcdaef71a9506522e05a25", + "sha256": "ee8e376af0420d85c7cefeae3677e44080b403709448a1288b6e21ff40ba2505" + }, + "downloads": -1, + "filename": "asgiref-2.3.1-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "2f6a8818d6dcdaef71a9506522e05a25", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 9274, + "upload_time": "2018-05-23T08:19:30", + "upload_time_iso_8601": "2018-05-23T08:19:30.373616Z", + "url": "https://files.pythonhosted.org/packages/d3/dc/4cb440a69d3e26dfe430955520057c1cde51bc2fd9208215cf6b5662634f/asgiref-2.3.1-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "9c598afdd7e9c1e2b4b3a8aa716b579d39470f9afad23b69ab072ed7b5f6086d", + "md5": "8a54d559632047fa256757fcb86c7af4", + "sha256": "a77d0d5c8914ca3fbb396be7fda238bf479207cee77d6075dd7474cfeff821a4" + }, + "downloads": -1, + "filename": "asgiref-2.3.1.tar.gz", + "has_sig": false, + "md5_digest": "8a54d559632047fa256757fcb86c7af4", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 8307, + "upload_time": "2018-05-23T08:19:31", + "upload_time_iso_8601": "2018-05-23T08:19:31.547135Z", + "url": "https://files.pythonhosted.org/packages/9c/59/8afdd7e9c1e2b4b3a8aa716b579d39470f9afad23b69ab072ed7b5f6086d/asgiref-2.3.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "2.3.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "6acac141dc77da60230e393d33b5b29afbca718b7e6ce07921c42cf08af907f8", + "md5": "52d5c846ab250f4e2d5ca5a88f00aac9", + "sha256": "9b05dcd41a6a89ca8c6e7f7e4089c3f3e76b5af60aebb81ae6d455ad81989c97" + }, + "downloads": -1, + "filename": "asgiref-2.3.2-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "52d5c846ab250f4e2d5ca5a88f00aac9", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 9318, + "upload_time": "2018-05-23T12:16:05", + "upload_time_iso_8601": "2018-05-23T12:16:05.443138Z", + "url": "https://files.pythonhosted.org/packages/6a/ca/c141dc77da60230e393d33b5b29afbca718b7e6ce07921c42cf08af907f8/asgiref-2.3.2-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "2c0da569ab76f6dcec1f1c9946c3ed1e65bb1aa853e620c7626729e1f84b9b2d", + "md5": "b9841f9afbebfb85adc185bfc5ae3927", + "sha256": "b21dc4c43d7aba5a844f4c48b8f49d56277bc34937fd9f9cb93ec97fde7e3082" + }, + "downloads": -1, + "filename": "asgiref-2.3.2.tar.gz", + "has_sig": false, + "md5_digest": "b9841f9afbebfb85adc185bfc5ae3927", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 8348, + "upload_time": "2018-05-23T12:16:06", + "upload_time_iso_8601": "2018-05-23T12:16:06.437064Z", + "url": "https://files.pythonhosted.org/packages/2c/0d/a569ab76f6dcec1f1c9946c3ed1e65bb1aa853e620c7626729e1f84b9b2d/asgiref-2.3.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.0.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "ededab1178f0848145c86c2d7c54cfb12d3baf35d76237a2d5c60039c883d8a2", + "md5": "4d6bfb00e60e621e1c7656a700084b2c", + "sha256": "c7a9f05e8bf5db5ce582aa4c4622621fc23c110ee79202e45dd5218ed5eba9f5" + }, + "downloads": -1, + "filename": "asgiref-3.0.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "4d6bfb00e60e621e1c7656a700084b2c", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 11281, + "upload_time": "2019-03-20T21:38:19", + "upload_time_iso_8601": "2019-03-20T21:38:19.804878Z", + "url": "https://files.pythonhosted.org/packages/ed/ed/ab1178f0848145c86c2d7c54cfb12d3baf35d76237a2d5c60039c883d8a2/asgiref-3.0.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "1f13a51fa79bf4067fa3d2a282b17871f428d8f505f5885b0bef4e1cab12f5d5", + "md5": "adbe48e27ded6fe7cd6e01ca600a7330", + "sha256": "bd5a17ca8742dd131b64b7cb67c79daec290d3feb46c9084a3a94cfbe5d62089" + }, + "downloads": -1, + "filename": "asgiref-3.0.0.tar.gz", + "has_sig": false, + "md5_digest": "adbe48e27ded6fe7cd6e01ca600a7330", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 11737, + "upload_time": "2019-03-20T21:38:21", + "upload_time_iso_8601": "2019-03-20T21:38:21.399513Z", + "url": "https://files.pythonhosted.org/packages/1f/13/a51fa79bf4067fa3d2a282b17871f428d8f505f5885b0bef4e1cab12f5d5/asgiref-3.0.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.1.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "e71ff9386bf64e2420e2a0b501344a237b6bb03e84c3b97f7cbf7fe30e945b93", + "md5": "4e9d642ef406c42724e0dfa104ff4261", + "sha256": "55eef5c0582093ca37dcf4937f66fc6ffbedee662e1dadd263c8877236d5c156" + }, + "downloads": -1, + "filename": "asgiref-3.1.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "4e9d642ef406c42724e0dfa104ff4261", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 12438, + "upload_time": "2019-04-13T12:04:33", + "upload_time_iso_8601": "2019-04-13T12:04:33.279378Z", + "url": "https://files.pythonhosted.org/packages/e7/1f/f9386bf64e2420e2a0b501344a237b6bb03e84c3b97f7cbf7fe30e945b93/asgiref-3.1.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "03abc84dce4e8cf6978fd7f3a124b8bd6d27e551a0be0fc85aeb780a8428552d", + "md5": "919e197b27ebf2566befda279e1a2beb", + "sha256": "bc2b34037b19ced9df35a6890f4658f657e078e3d595496b01430f07256cfbf5" + }, + "downloads": -1, + "filename": "asgiref-3.1.0.tar.gz", + "has_sig": false, + "md5_digest": "919e197b27ebf2566befda279e1a2beb", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 12685, + "upload_time": "2019-04-13T12:04:34", + "upload_time_iso_8601": "2019-04-13T12:04:34.530570Z", + "url": "https://files.pythonhosted.org/packages/03/ab/c84dce4e8cf6978fd7f3a124b8bd6d27e551a0be0fc85aeb780a8428552d/asgiref-3.1.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.1.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "3ad0eebc135bba4be8137096c6a99778ac3a27cf4203a69dfa02010a1dfb10ce", + "md5": "f7c5215e162580e795401d17dfa139de", + "sha256": "0822b68bc98f59cfa536e314cfe1586d4cdaa45da92937cc69061dd9209a8bfe" + }, + "downloads": -1, + "filename": "asgiref-3.1.1-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "f7c5215e162580e795401d17dfa139de", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 12697, + "upload_time": "2019-04-13T12:34:54", + "upload_time_iso_8601": "2019-04-13T12:34:54.973129Z", + "url": "https://files.pythonhosted.org/packages/3a/d0/eebc135bba4be8137096c6a99778ac3a27cf4203a69dfa02010a1dfb10ce/asgiref-3.1.1-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "b321cb2e49fe7780a68c688c59ae0839b4a45af75159bc029b7dd6d43d699b4d", + "md5": "7f6251f3d9778b3d2e64cac9d2f6b027", + "sha256": "fa83f1bb89020d9e7c8361a41e8a8ccbfcf3b9df2e9e47a320bdc4821a9c3dcd" + }, + "downloads": -1, + "filename": "asgiref-3.1.1.tar.gz", + "has_sig": false, + "md5_digest": "7f6251f3d9778b3d2e64cac9d2f6b027", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 12977, + "upload_time": "2019-04-13T12:34:56", + "upload_time_iso_8601": "2019-04-13T12:34:56.373925Z", + "url": "https://files.pythonhosted.org/packages/b3/21/cb2e49fe7780a68c688c59ae0839b4a45af75159bc029b7dd6d43d699b4d/asgiref-3.1.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.1.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "07caf4633cdd580ef37eaf38e2e7a85cd49066ec4e8c62da339f927d462ca46e", + "md5": "10a27ba118a42e69f99b8ae906a98dd1", + "sha256": "48afe222aefece5814ae90aae394964eada5a4604e67f9397f7858e8957e9fdf" + }, + "downloads": -1, + "filename": "asgiref-3.1.2-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "10a27ba118a42e69f99b8ae906a98dd1", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 13431, + "upload_time": "2019-04-18T02:29:56", + "upload_time_iso_8601": "2019-04-18T02:29:56.102586Z", + "url": "https://files.pythonhosted.org/packages/07/ca/f4633cdd580ef37eaf38e2e7a85cd49066ec4e8c62da339f927d462ca46e/asgiref-3.1.2-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "7d1228cf907457f35a85c98498cbe9fd0792484eb6beba76c642f040c2399ae4", + "md5": "ba9457e74714083784cfa43e120cbe56", + "sha256": "60c783a7994246b2e710aa2f0a2f7fcfacf156cffc7b50f7074bfd97c9046db3" + }, + "downloads": -1, + "filename": "asgiref-3.1.2.tar.gz", + "has_sig": false, + "md5_digest": "ba9457e74714083784cfa43e120cbe56", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 13720, + "upload_time": "2019-04-18T02:29:57", + "upload_time_iso_8601": "2019-04-18T02:29:57.318301Z", + "url": "https://files.pythonhosted.org/packages/7d/12/28cf907457f35a85c98498cbe9fd0792484eb6beba76c642f040c2399ae4/asgiref-3.1.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.1.3": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "c2c4db607d2dcdd1d88763528de1066dec9f36cca470c1d101de5cc35c90b0b9", + "md5": "191c48da47674b5dd2a2b9a14af056d1", + "sha256": "34227987327d13bc4b19d338faa6fed8a25cea79cca2e9e50490d212f56470f8" + }, + "downloads": -1, + "filename": "asgiref-3.1.3-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "191c48da47674b5dd2a2b9a14af056d1", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 15090, + "upload_time": "2019-07-05T19:35:13", + "upload_time_iso_8601": "2019-07-05T19:35:13.632473Z", + "url": "https://files.pythonhosted.org/packages/c2/c4/db607d2dcdd1d88763528de1066dec9f36cca470c1d101de5cc35c90b0b9/asgiref-3.1.3-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "a26cae3f69d30aad753f8ade8925f8c9f30f2dce5dfe3b44e8b7db414bf4a2ea", + "md5": "00ab05aeb739ebc676d3e788b9adddeb", + "sha256": "566126b4cbf190c315121965253ecb2159499197ff4afd686e0921f4dd987999" + }, + "downloads": -1, + "filename": "asgiref-3.1.3.tar.gz", + "has_sig": false, + "md5_digest": "00ab05aeb739ebc676d3e788b9adddeb", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 13136, + "upload_time": "2019-07-05T19:35:15", + "upload_time_iso_8601": "2019-07-05T19:35:15.349845Z", + "url": "https://files.pythonhosted.org/packages/a2/6c/ae3f69d30aad753f8ade8925f8c9f30f2dce5dfe3b44e8b7db414bf4a2ea/asgiref-3.1.3.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.1.4": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "ce2edd4b5afc37d595fc44def4f365cc8ee080a4962a0eb1e05e79da65a8e074", + "md5": "5adc873661629f62b969b53da1bef204", + "sha256": "b718a9d35e204a96e2456c2271b0ef12e36124c363b3a8fd1d626744f23192aa" + }, + "downloads": -1, + "filename": "asgiref-3.1.4-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "5adc873661629f62b969b53da1bef204", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 15099, + "upload_time": "2019-07-07T16:04:42", + "upload_time_iso_8601": "2019-07-07T16:04:42.251206Z", + "url": "https://files.pythonhosted.org/packages/ce/2e/dd4b5afc37d595fc44def4f365cc8ee080a4962a0eb1e05e79da65a8e074/asgiref-3.1.4-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "e44dc9079a9b0efd6755adc12413301ab6ad413d0629aa366028712ea22b0f5d", + "md5": "ce9b15c6f74a70990820f1e462334153", + "sha256": "865b7ccce5a6e815607b08d9059fe9c058cd75c77f896f5e0b74ff6c1ba81818" + }, + "downloads": -1, + "filename": "asgiref-3.1.4.tar.gz", + "has_sig": false, + "md5_digest": "ce9b15c6f74a70990820f1e462334153", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 13148, + "upload_time": "2019-07-07T16:04:44", + "upload_time_iso_8601": "2019-07-07T16:04:44.043959Z", + "url": "https://files.pythonhosted.org/packages/e4/4d/c9079a9b0efd6755adc12413301ab6ad413d0629aa366028712ea22b0f5d/asgiref-3.1.4.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.10.0": [ + { + "comment_text": null, + "digests": { + "blake2b_256": "179cfc2331f538fbf7eedba64b2052e99ccf9ba9d6888e2f41441ee28847004b", + "md5": "b3ab18457914d7cdc3e77eaa97a115f8", + "sha256": "aef8a81283a34d0ab31630c9b7dfe70c812c95eba78171367ca8745e88124734" + }, + "downloads": -1, + "filename": "asgiref-3.10.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "b3ab18457914d7cdc3e77eaa97a115f8", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.9", + "size": 24050, + "upload_time": "2025-10-05T09:15:05", + "upload_time_iso_8601": "2025-10-05T09:15:05.110106Z", + "url": "https://files.pythonhosted.org/packages/17/9c/fc2331f538fbf7eedba64b2052e99ccf9ba9d6888e2f41441ee28847004b/asgiref-3.10.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": null, + "digests": { + "blake2b_256": "46084dfec9b90758a59acc6be32ac82e98d1fbfc321cb5cfa410436dbacf821c", + "md5": "6799fce19314e0aaeb789a6d0f6d45fa", + "sha256": "d89f2d8cd8b56dada7d52fa7dc8075baa08fb836560710d38c292a7a3f78c04e" + }, + "downloads": -1, + "filename": "asgiref-3.10.0.tar.gz", + "has_sig": false, + "md5_digest": "6799fce19314e0aaeb789a6d0f6d45fa", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.9", + "size": 37483, + "upload_time": "2025-10-05T09:15:06", + "upload_time_iso_8601": "2025-10-05T09:15:06.557840Z", + "url": "https://files.pythonhosted.org/packages/46/08/4dfec9b90758a59acc6be32ac82e98d1fbfc321cb5cfa410436dbacf821c/asgiref-3.10.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.11.0": [ + { + "comment_text": null, + "digests": { + "blake2b_256": "91be317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea", + "md5": "659fe6bbd7e43c8bde0b7ca065be0f6c", + "sha256": "1db9021efadb0d9512ce8ffaf72fcef601c7b73a8807a1bb2ef143dc6b14846d" + }, + "downloads": -1, + "filename": "asgiref-3.11.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "659fe6bbd7e43c8bde0b7ca065be0f6c", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.9", + "size": 24096, + "upload_time": "2025-11-19T15:32:19", + "upload_time_iso_8601": "2025-11-19T15:32:19.004742Z", + "url": "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": null, + "digests": { + "blake2b_256": "76b94db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b", + "md5": "554794453502d266a90d2254fcb1f7c3", + "sha256": "13acff32519542a1736223fb79a715acdebe24286d98e8b164a73085f40da2c4" + }, + "downloads": -1, + "filename": "asgiref-3.11.0.tar.gz", + "has_sig": false, + "md5_digest": "554794453502d266a90d2254fcb1f7c3", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.9", + "size": 37969, + "upload_time": "2025-11-19T15:32:20", + "upload_time_iso_8601": "2025-11-19T15:32:20.106038Z", + "url": "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.2.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "fb5827f90221f17bbda171d345f06009749004b60aea53a723443903bd99673d", + "md5": "d64cb417136943949f855951bf26c641", + "sha256": "abfe78df4bdefdbdc6902b1900c14e60b4cd7fea2ce218b5f12d998a46a9eb18" + }, + "downloads": -1, + "filename": "asgiref-3.2.0-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "d64cb417136943949f855951bf26c641", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 18464, + "upload_time": "2019-07-29T17:07:23", + "upload_time_iso_8601": "2019-07-29T17:07:23.556128Z", + "url": "https://files.pythonhosted.org/packages/fb/58/27f90221f17bbda171d345f06009749004b60aea53a723443903bd99673d/asgiref-3.2.0-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "65efe357b3e3d418f16d8f79b9d0c44d170bc0d88f0840b5755b6bfe25a576ea", + "md5": "682697d39175a9681222dd6f304d8e51", + "sha256": "cefcbd64acbfc9f38913566824ef070dd9a50e63f1b4cc5a7f1c44be809d7ff3" + }, + "downloads": -1, + "filename": "asgiref-3.2.0.tar.gz", + "has_sig": false, + "md5_digest": "682697d39175a9681222dd6f304d8e51", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 16116, + "upload_time": "2019-07-29T17:07:25", + "upload_time_iso_8601": "2019-07-29T17:07:25.282364Z", + "url": "https://files.pythonhosted.org/packages/65/ef/e357b3e3d418f16d8f79b9d0c44d170bc0d88f0840b5755b6bfe25a576ea/asgiref-3.2.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.2.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "4cb99eb9762c9b43754d49e6b85625c1a5a45673a3083c742be00d8721839b01", + "md5": "0d6fd60bf5c5b9930545deb4ce137d73", + "sha256": "ceac3968866501249712f482ae807605246cfae8293a70de29417868ddef673c" + }, + "downloads": -1, + "filename": "asgiref-3.2.1-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "0d6fd60bf5c5b9930545deb4ce137d73", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 18580, + "upload_time": "2019-08-05T04:41:14", + "upload_time_iso_8601": "2019-08-05T04:41:14.315391Z", + "url": "https://files.pythonhosted.org/packages/4c/b9/9eb9762c9b43754d49e6b85625c1a5a45673a3083c742be00d8721839b01/asgiref-3.2.1-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "e78a145cf55364e762ebf3c5e328e9780b0d638c0e4f9ef575fffe0cc84dac70", + "md5": "212c231b9af1a3e9fb4dcce0186c94c8", + "sha256": "57ed0d07634a23bebfa1b02a1aa05eba09c37aab3fc93893e4039e7bc2d96d9e" + }, + "downloads": -1, + "filename": "asgiref-3.2.1.tar.gz", + "has_sig": false, + "md5_digest": "212c231b9af1a3e9fb4dcce0186c94c8", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 16222, + "upload_time": "2019-08-05T04:41:16", + "upload_time_iso_8601": "2019-08-05T04:41:16.104821Z", + "url": "https://files.pythonhosted.org/packages/e7/8a/145cf55364e762ebf3c5e328e9780b0d638c0e4f9ef575fffe0cc84dac70/asgiref-3.2.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.2.10": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "d5eb64725b25f991010307fd18a9e0c1f0e6dff2f03622fc4bcbcdb2244f60d6", + "md5": "9929d67766f047634dbe4679a679f00e", + "sha256": "9fc6fb5d39b8af147ba40765234fa822b39818b12cc80b35ad9b0cef3a476aed" + }, + "downloads": -1, + "filename": "asgiref-3.2.10-py3-none-any.whl", + "has_sig": false, + "md5_digest": "9929d67766f047634dbe4679a679f00e", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.5", + "size": 19431, + "upload_time": "2020-06-18T18:49:07", + "upload_time_iso_8601": "2020-06-18T18:49:07.182351Z", + "url": "https://files.pythonhosted.org/packages/d5/eb/64725b25f991010307fd18a9e0c1f0e6dff2f03622fc4bcbcdb2244f60d6/asgiref-3.2.10-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "6d6e6e0ff19e7054491be7390fec2b711f838b31282fd3afe28057314d72f11b", + "md5": "d58c9ec83e6263138073b57d159232fa", + "sha256": "7e51911ee147dd685c3c8b805c0ad0cb58d360987b56953878f8c06d2d1c6f1a" + }, + "downloads": -1, + "filename": "asgiref-3.2.10.tar.gz", + "has_sig": false, + "md5_digest": "d58c9ec83e6263138073b57d159232fa", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.5", + "size": 25669, + "upload_time": "2020-06-18T18:49:08", + "upload_time_iso_8601": "2020-06-18T18:49:08.359514Z", + "url": "https://files.pythonhosted.org/packages/6d/6e/6e0ff19e7054491be7390fec2b711f838b31282fd3afe28057314d72f11b/asgiref-3.2.10.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.2.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "d03942344b1060cfb5542eecef3ce6dda3d2d5a89a660716ed5980635985f2a7", + "md5": "705f9c7225b10169f81fade5b5bb2f77", + "sha256": "a4ce726e6ef49cca13642ff49588530ebabcc47c669c7a95af37ea5a74b9b823" + }, + "downloads": -1, + "filename": "asgiref-3.2.2-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "705f9c7225b10169f81fade5b5bb2f77", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 18762, + "upload_time": "2019-08-30T05:49:36", + "upload_time_iso_8601": "2019-08-30T05:49:36.326780Z", + "url": "https://files.pythonhosted.org/packages/d0/39/42344b1060cfb5542eecef3ce6dda3d2d5a89a660716ed5980635985f2a7/asgiref-3.2.2-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "6ad8ac8ccfd9551901413cddcff798e16f219489887ec5db3b163c321dd017c6", + "md5": "a0d824805f07199ec41a9af6ff69761b", + "sha256": "f62b1c88ebf5fe95db202a372982970edcf375c1513d7e70717df0750f5c2b98" + }, + "downloads": -1, + "filename": "asgiref-3.2.2.tar.gz", + "has_sig": false, + "md5_digest": "a0d824805f07199ec41a9af6ff69761b", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 16370, + "upload_time": "2019-08-30T05:49:38", + "upload_time_iso_8601": "2019-08-30T05:49:38.052338Z", + "url": "https://files.pythonhosted.org/packages/6a/d8/ac8ccfd9551901413cddcff798e16f219489887ec5db3b163c321dd017c6/asgiref-3.2.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.2.3": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "a5cb5a235b605a9753ebcb2730c75e610fb51c8cab3f01230080a8229fa36adb", + "md5": "84c2bd2360af2a1f07f55da3b4b59c52", + "sha256": "ea448f92fc35a0ef4b1508f53a04c4670255a3f33d22a81c8fc9c872036adbe5" + }, + "downloads": -1, + "filename": "asgiref-3.2.3-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "84c2bd2360af2a1f07f55da3b4b59c52", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": null, + "size": 18752, + "upload_time": "2019-10-23T19:24:16", + "upload_time_iso_8601": "2019-10-23T19:24:16.088527Z", + "url": "https://files.pythonhosted.org/packages/a5/cb/5a235b605a9753ebcb2730c75e610fb51c8cab3f01230080a8229fa36adb/asgiref-3.2.3-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "80c483a01607f2d10024c172097126264c8e00c6a4827b35d631ece9625e6ba2", + "md5": "39218c10eee0bf66a3d893491d835e86", + "sha256": "7e06d934a7718bf3975acbf87780ba678957b87c7adc056f13b6215d610695a0" + }, + "downloads": -1, + "filename": "asgiref-3.2.3.tar.gz", + "has_sig": false, + "md5_digest": "39218c10eee0bf66a3d893491d835e86", + "packagetype": "sdist", + "python_version": "source", + "requires_python": null, + "size": 24295, + "upload_time": "2019-10-23T19:24:17", + "upload_time_iso_8601": "2019-10-23T19:24:17.556069Z", + "url": "https://files.pythonhosted.org/packages/80/c4/83a01607f2d10024c172097126264c8e00c6a4827b35d631ece9625e6ba2/asgiref-3.2.3.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.2.4": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "80c603bd9a8568952c275e8b2ee4ab3ac744d5fff7a8d2b5bba5b93715ba742e", + "md5": "ded0610dcf85c9bea92156cd678dda6e", + "sha256": "5e60ea919b37e5b9d8896d802c0dbbe41b16ea6719e5695a43496ef43e5b19ac" + }, + "downloads": -1, + "filename": "asgiref-3.2.4-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "ded0610dcf85c9bea92156cd678dda6e", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": "\u003E=3.5", + "size": 19069, + "upload_time": "2020-03-10T15:21:00", + "upload_time_iso_8601": "2020-03-10T15:21:00.430881Z", + "url": "https://files.pythonhosted.org/packages/80/c6/03bd9a8568952c275e8b2ee4ab3ac744d5fff7a8d2b5bba5b93715ba742e/asgiref-3.2.4-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "921e2786ef0269c366be776363d3a2317cc03e6cd25bc77c4b0185f91b19f5ca", + "md5": "4d53091eef9c7ff195d134ae90b31cf5", + "sha256": "f07043512078c76bb28a62fd1e327876599062b5f0aea60ed1d9cabc42e95fe2" + }, + "downloads": -1, + "filename": "asgiref-3.2.4.tar.gz", + "has_sig": false, + "md5_digest": "4d53091eef9c7ff195d134ae90b31cf5", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.5", + "size": 24962, + "upload_time": "2020-03-10T15:21:02", + "upload_time_iso_8601": "2020-03-10T15:21:02.377298Z", + "url": "https://files.pythonhosted.org/packages/92/1e/2786ef0269c366be776363d3a2317cc03e6cd25bc77c4b0185f91b19f5ca/asgiref-3.2.4.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.2.5": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "bca990e110710d44289d807b5604bcd18419ece1a6f88e9a2489d3de4718a20b", + "md5": "08949493f630c69f4d758d3c386234e4", + "sha256": "3e4192eaec0758b99722f0b0666d5fbfaa713054d92e8de5b58ba84ec5ce696f" + }, + "downloads": -1, + "filename": "asgiref-3.2.5-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "08949493f630c69f4d758d3c386234e4", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": "\u003E=3.5", + "size": 19084, + "upload_time": "2020-03-11T17:16:18", + "upload_time_iso_8601": "2020-03-11T17:16:18.942590Z", + "url": "https://files.pythonhosted.org/packages/bc/a9/90e110710d44289d807b5604bcd18419ece1a6f88e9a2489d3de4718a20b/asgiref-3.2.5-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "83f4d21b3c32abf7a60bcd8fd35f198ff6782bc1c39c966456121cc941da37e7", + "md5": "8736d0bc79ab6afce52da3fbf5af6baa", + "sha256": "c8f49dd3b42edcc51d09dd2eea8a92b3cfc987ff7e6486be734b4d0cbfd5d315" + }, + "downloads": -1, + "filename": "asgiref-3.2.5.tar.gz", + "has_sig": false, + "md5_digest": "8736d0bc79ab6afce52da3fbf5af6baa", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.5", + "size": 25056, + "upload_time": "2020-03-11T17:16:20", + "upload_time_iso_8601": "2020-03-11T17:16:20.452803Z", + "url": "https://files.pythonhosted.org/packages/83/f4/d21b3c32abf7a60bcd8fd35f198ff6782bc1c39c966456121cc941da37e7/asgiref-3.2.5.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.2.6": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "e2ea37fac52810bfa225c867cd05766d80c12799f0a0d38a552dfe0ba7d02a90", + "md5": "2384d56142be443af73907a4527e2f6a", + "sha256": "9c65b42045910c159ad41fc33692a8a6e6e154d8d05244ea69a0cbc617edad31" + }, + "downloads": -1, + "filename": "asgiref-3.2.6-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "2384d56142be443af73907a4527e2f6a", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": "\u003E=3.5", + "size": 18967, + "upload_time": "2020-03-23T21:43:20", + "upload_time_iso_8601": "2020-03-23T21:43:20.437297Z", + "url": "https://files.pythonhosted.org/packages/e2/ea/37fac52810bfa225c867cd05766d80c12799f0a0d38a552dfe0ba7d02a90/asgiref-3.2.6-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "8d47394c8a9c22354d6ebde1e0f485b1c62403eedee0851c73cf0efcf84fddb6", + "md5": "684756eb18d35544c8d0a7df6fd93a30", + "sha256": "63007b556233381c5f22ae4c7e4292c9f1b953dc8909ae8fd268f611dc23cbd0" + }, + "downloads": -1, + "filename": "asgiref-3.2.6.tar.gz", + "has_sig": false, + "md5_digest": "684756eb18d35544c8d0a7df6fd93a30", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.5", + "size": 24760, + "upload_time": "2020-03-23T21:43:22", + "upload_time_iso_8601": "2020-03-23T21:43:22.161200Z", + "url": "https://files.pythonhosted.org/packages/8d/47/394c8a9c22354d6ebde1e0f485b1c62403eedee0851c73cf0efcf84fddb6/asgiref-3.2.6.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.2.7": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "680025013f7310a56d17e1ab6fd885d5c1f216b7123b550d295c93f8e29d372a", + "md5": "ec04cf97f74c64a5314c7199121be93e", + "sha256": "9ca8b952a0a9afa61d30aa6d3d9b570bb3fd6bafcf7ec9e6bed43b936133db1c" + }, + "downloads": -1, + "filename": "asgiref-3.2.7-py2.py3-none-any.whl", + "has_sig": false, + "md5_digest": "ec04cf97f74c64a5314c7199121be93e", + "packagetype": "bdist_wheel", + "python_version": "py2.py3", + "requires_python": "\u003E=3.5", + "size": 19205, + "upload_time": "2020-03-24T17:57:20", + "upload_time_iso_8601": "2020-03-24T17:57:20.261030Z", + "url": "https://files.pythonhosted.org/packages/68/00/25013f7310a56d17e1ab6fd885d5c1f216b7123b550d295c93f8e29d372a/asgiref-3.2.7-py2.py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "30c1bbde4e26250ca00c9aae5c7bd73ee1785d1a0665b1ae18481127bb0c00d0", + "md5": "0fdd19c949a92bb6b72914c90192c837", + "sha256": "8036f90603c54e93521e5777b2b9a39ba1bad05773fcf2d208f0299d1df58ce5" + }, + "downloads": -1, + "filename": "asgiref-3.2.7.tar.gz", + "has_sig": false, + "md5_digest": "0fdd19c949a92bb6b72914c90192c837", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.5", + "size": 25350, + "upload_time": "2020-03-24T17:57:21", + "upload_time_iso_8601": "2020-03-24T17:57:21.669717Z", + "url": "https://files.pythonhosted.org/packages/30/c1/bbde4e26250ca00c9aae5c7bd73ee1785d1a0665b1ae18481127bb0c00d0/asgiref-3.2.7.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.2.8": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "29f43cd2716c7a6b3c544c5c24942fb341898e9559d3cea6f415ab26c439e7d2", + "md5": "776465484821f6c57a665a523c9bd631", + "sha256": "783254c9ec6f914f671919bbcef4346d4e57866bd7ed988ae79f881bbc0a9be8" + }, + "downloads": -1, + "filename": "asgiref-3.2.8-py3-none-any.whl", + "has_sig": false, + "md5_digest": "776465484821f6c57a665a523c9bd631", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.5", + "size": 19335, + "upload_time": "2020-06-15T16:35:28", + "upload_time_iso_8601": "2020-06-15T16:35:28.270134Z", + "url": "https://files.pythonhosted.org/packages/29/f4/3cd2716c7a6b3c544c5c24942fb341898e9559d3cea6f415ab26c439e7d2/asgiref-3.2.8-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "11d7eeb4c0f7ba1f4b65302b3a0a8fdec809aa25631bb4578b088505637fc14d", + "md5": "28018d20f1b871724e311014937c8d64", + "sha256": "a46c83b7d46212ec937e9ddb571cda2b1384b3d02f7edde9372e2778d1782d38" + }, + "downloads": -1, + "filename": "asgiref-3.2.8.tar.gz", + "has_sig": false, + "md5_digest": "28018d20f1b871724e311014937c8d64", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.5", + "size": 25469, + "upload_time": "2020-06-15T16:35:29", + "upload_time_iso_8601": "2020-06-15T16:35:29.291244Z", + "url": "https://files.pythonhosted.org/packages/11/d7/eeb4c0f7ba1f4b65302b3a0a8fdec809aa25631bb4578b088505637fc14d/asgiref-3.2.8.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.2.9": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "ead1493b29b516d5e829583a610a28465e6b4504a7012d5dbe7236984f9eafc7", + "md5": "9e0fdafa6195c4767a01eb88d3677753", + "sha256": "f803d8b4962cc338d48a72fa498c52f913b160eb16712e2ecdf2a81904daead9" + }, + "downloads": -1, + "filename": "asgiref-3.2.9-py3-none-any.whl", + "has_sig": false, + "md5_digest": "9e0fdafa6195c4767a01eb88d3677753", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.5", + "size": 19337, + "upload_time": "2020-06-16T20:22:37", + "upload_time_iso_8601": "2020-06-16T20:22:37.593831Z", + "url": "https://files.pythonhosted.org/packages/ea/d1/493b29b516d5e829583a610a28465e6b4504a7012d5dbe7236984f9eafc7/asgiref-3.2.9-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "7e5b4dbcfabd244eb022f10b20e289aea6cbb10bbf9b6498c2264be3e1c70ce8", + "md5": "fd7ee5d1b0cc7bc9bf7d45861935f2d1", + "sha256": "7ea1922cfd63c4ac7687069f8bb0e7768ab9b7fc78ff227577d4240b52d6cb7a" + }, + "downloads": -1, + "filename": "asgiref-3.2.9.tar.gz", + "has_sig": false, + "md5_digest": "fd7ee5d1b0cc7bc9bf7d45861935f2d1", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.5", + "size": 25482, + "upload_time": "2020-06-16T20:22:38", + "upload_time_iso_8601": "2020-06-16T20:22:38.948560Z", + "url": "https://files.pythonhosted.org/packages/7e/5b/4dbcfabd244eb022f10b20e289aea6cbb10bbf9b6498c2264be3e1c70ce8/asgiref-3.2.9.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.3.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "c0e8578887011652048c2d273bf98839a11020891917f3aa638a0bc9ac04d653", + "md5": "5bce1df6dedc53a41a9a6b40d7b1699e", + "sha256": "a5098bc870b80e7b872bff60bb363c7f2c2c89078759f6c47b53ff8c525a152e" + }, + "downloads": -1, + "filename": "asgiref-3.3.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "5bce1df6dedc53a41a9a6b40d7b1699e", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.5", + "size": 19948, + "upload_time": "2020-10-09T16:44:30", + "upload_time_iso_8601": "2020-10-09T16:44:30.957692Z", + "url": "https://files.pythonhosted.org/packages/c0/e8/578887011652048c2d273bf98839a11020891917f3aa638a0bc9ac04d653/asgiref-3.3.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "3e34fb6c2b2b858d27cdc6703e26e304d56e2300c33719b9407eae54a6b80423", + "md5": "f5ce706ca560ae3322e8a16e792baba6", + "sha256": "cd88907ecaec59d78e4ac00ea665b03e571cb37e3a0e37b3702af1a9e86c365a" + }, + "downloads": -1, + "filename": "asgiref-3.3.0.tar.gz", + "has_sig": false, + "md5_digest": "f5ce706ca560ae3322e8a16e792baba6", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.5", + "size": 26945, + "upload_time": "2020-10-09T16:44:32", + "upload_time_iso_8601": "2020-10-09T16:44:32.724610Z", + "url": "https://files.pythonhosted.org/packages/3e/34/fb6c2b2b858d27cdc6703e26e304d56e2300c33719b9407eae54a6b80423/asgiref-3.3.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.3.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "89495531992efc62f9c6d08a7199dc31176c8c60f7b2548c6ef245f96f29d0d9", + "md5": "40ec8871a1ec6d7cb3c4e4696bf0f6d5", + "sha256": "5ee950735509d04eb673bd7f7120f8fa1c9e2df495394992c73234d526907e17" + }, + "downloads": -1, + "filename": "asgiref-3.3.1-py3-none-any.whl", + "has_sig": false, + "md5_digest": "40ec8871a1ec6d7cb3c4e4696bf0f6d5", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.5", + "size": 19983, + "upload_time": "2020-11-09T15:58:48", + "upload_time_iso_8601": "2020-11-09T15:58:48.877108Z", + "url": "https://files.pythonhosted.org/packages/89/49/5531992efc62f9c6d08a7199dc31176c8c60f7b2548c6ef245f96f29d0d9/asgiref-3.3.1-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "e9d1096b5b0b411a1a53c294a508fdc51542de77bc193df5c8230ff9445e4ff3", + "md5": "ab971d5e7c4517c5c31d539022d529c9", + "sha256": "7162a3cb30ab0609f1a4c95938fd73e8604f63bdba516a7f7d64b83ff09478f0" + }, + "downloads": -1, + "filename": "asgiref-3.3.1.tar.gz", + "has_sig": false, + "md5_digest": "ab971d5e7c4517c5c31d539022d529c9", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.5", + "size": 27197, + "upload_time": "2020-11-09T15:58:52", + "upload_time_iso_8601": "2020-11-09T15:58:52.158790Z", + "url": "https://files.pythonhosted.org/packages/e9/d1/096b5b0b411a1a53c294a508fdc51542de77bc193df5c8230ff9445e4ff3/asgiref-3.3.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.3.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "4c4f35496ef327fda06de5bb14ccba3bdc7b74a7d3171073b644339e56e90b73", + "md5": "65ad49f2e662600c4b224fe32f01a0e6", + "sha256": "34103fa20270d8843a66e5df18547d2e8139534d23e3beffe96647c65ddffd4d" + }, + "downloads": -1, + "filename": "asgiref-3.3.2-py3-none-any.whl", + "has_sig": false, + "md5_digest": "65ad49f2e662600c4b224fe32f01a0e6", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.6", + "size": 22340, + "upload_time": "2021-04-05T19:33:33", + "upload_time_iso_8601": "2021-04-05T19:33:33.379781Z", + "url": "https://files.pythonhosted.org/packages/4c/4f/35496ef327fda06de5bb14ccba3bdc7b74a7d3171073b644339e56e90b73/asgiref-3.3.2-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "5f56af1c760bd245eb1625ef1fb60c25a6d03084e263c2882da74aad38ddf075", + "md5": "1cca9e9fabc4f3e55d7f7a6715b939d0", + "sha256": "c62b616b226d6c2e927b0225f8101f9e2cca08112cff98839ca6726c129ff9e0" + }, + "downloads": -1, + "filename": "asgiref-3.3.2.tar.gz", + "has_sig": false, + "md5_digest": "1cca9e9fabc4f3e55d7f7a6715b939d0", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.6", + "size": 30088, + "upload_time": "2021-04-05T19:33:35", + "upload_time_iso_8601": "2021-04-05T19:33:35.074421Z", + "url": "https://files.pythonhosted.org/packages/5f/56/af1c760bd245eb1625ef1fb60c25a6d03084e263c2882da74aad38ddf075/asgiref-3.3.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.3.3": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "94d2a614e054305a57b3c9c867fae17667c1eab5befc8519ebf9d34752a0a7fd", + "md5": "5ea8c839128434ca167a13767a9284e7", + "sha256": "b58af092ac5987e245bba2d1472a09ca02fb402b782379c9c3e65555807c0631" + }, + "downloads": -1, + "filename": "asgiref-3.3.3-py3-none-any.whl", + "has_sig": false, + "md5_digest": "5ea8c839128434ca167a13767a9284e7", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.6", + "size": 22592, + "upload_time": "2021-04-06T15:39:49", + "upload_time_iso_8601": "2021-04-06T15:39:49.636118Z", + "url": "https://files.pythonhosted.org/packages/94/d2/a614e054305a57b3c9c867fae17667c1eab5befc8519ebf9d34752a0a7fd/asgiref-3.3.3-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "a791485d789c80183d94d1ecb4ef536de2db16f52de57a90502c82d3abb791c7", + "md5": "1649a7e60636179e438a15e8e9e8c695", + "sha256": "00a4fdc99c50e5b2b308ff270afdd1a6b265fba6d2c87ea7b98fc0f25f7f5b07" + }, + "downloads": -1, + "filename": "asgiref-3.3.3.tar.gz", + "has_sig": false, + "md5_digest": "1649a7e60636179e438a15e8e9e8c695", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.6", + "size": 30646, + "upload_time": "2021-04-06T15:39:50", + "upload_time_iso_8601": "2021-04-06T15:39:50.983947Z", + "url": "https://files.pythonhosted.org/packages/a7/91/485d789c80183d94d1ecb4ef536de2db16f52de57a90502c82d3abb791c7/asgiref-3.3.3.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.3.4": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "178b05e225d11154b8f5358e6a6d277679c9741ec0339d1e451c9cef687a9170", + "md5": "585c35f6fe22e3af3114ad93933cdee5", + "sha256": "92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee" + }, + "downloads": -1, + "filename": "asgiref-3.3.4-py3-none-any.whl", + "has_sig": false, + "md5_digest": "585c35f6fe22e3af3114ad93933cdee5", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.6", + "size": 22678, + "upload_time": "2021-04-06T18:40:04", + "upload_time_iso_8601": "2021-04-06T18:40:04.682390Z", + "url": "https://files.pythonhosted.org/packages/17/8b/05e225d11154b8f5358e6a6d277679c9741ec0339d1e451c9cef687a9170/asgiref-3.3.4-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "d83fef696a6d8254f182b1a089aeffb638d2eb83055e603146d3a40605c5b7da", + "md5": "5afe03ecc39ae94950ff95e80166d945", + "sha256": "d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78" + }, + "downloads": -1, + "filename": "asgiref-3.3.4.tar.gz", + "has_sig": false, + "md5_digest": "5afe03ecc39ae94950ff95e80166d945", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.6", + "size": 30780, + "upload_time": "2021-04-06T18:40:06", + "upload_time_iso_8601": "2021-04-06T18:40:06.370912Z", + "url": "https://files.pythonhosted.org/packages/d8/3f/ef696a6d8254f182b1a089aeffb638d2eb83055e603146d3a40605c5b7da/asgiref-3.3.4.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.4.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "bf7768b78d54f9865e1f4b8f8a9e0de15d328cddaa8a9cd5abeb69cb4077d9ab", + "md5": "c09403b35e668902cc80438b26ee6e39", + "sha256": "d36fa91dd90e3aa3c81a6bd426ccc8fb20bd3d22b0cf14a12800289e9c3e2563" + }, + "downloads": -1, + "filename": "asgiref-3.4.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "c09403b35e668902cc80438b26ee6e39", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.6", + "size": 25012, + "upload_time": "2021-06-27T20:35:30", + "upload_time_iso_8601": "2021-06-27T20:35:30.081529Z", + "url": "https://files.pythonhosted.org/packages/bf/77/68b78d54f9865e1f4b8f8a9e0de15d328cddaa8a9cd5abeb69cb4077d9ab/asgiref-3.4.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "c09db1c128ed26b8c01c27e5c393c558e9c2a6716dfbdb59f97ba14960fbde76", + "md5": "133e985329cdae060a4dbf7380b181b0", + "sha256": "05914d0fa65a21711e732adc6572edad6c8da5f1435c3f0c060689ced5e85195" + }, + "downloads": -1, + "filename": "asgiref-3.4.0.tar.gz", + "has_sig": false, + "md5_digest": "133e985329cdae060a4dbf7380b181b0", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.6", + "size": 32396, + "upload_time": "2021-06-27T20:35:32", + "upload_time_iso_8601": "2021-06-27T20:35:32.014805Z", + "url": "https://files.pythonhosted.org/packages/c0/9d/b1c128ed26b8c01c27e5c393c558e9c2a6716dfbdb59f97ba14960fbde76/asgiref-3.4.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.4.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "fe66577f32b54c50dcd8dec38447258e82ed327ecb86820d67ae7b3dea784f13", + "md5": "3246267307c6706993c63d1da64ec412", + "sha256": "ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214" + }, + "downloads": -1, + "filename": "asgiref-3.4.1-py3-none-any.whl", + "has_sig": false, + "md5_digest": "3246267307c6706993c63d1da64ec412", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.6", + "size": 25019, + "upload_time": "2021-07-01T16:17:40", + "upload_time_iso_8601": "2021-07-01T16:17:40.824873Z", + "url": "https://files.pythonhosted.org/packages/fe/66/577f32b54c50dcd8dec38447258e82ed327ecb86820d67ae7b3dea784f13/asgiref-3.4.1-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "07933618b68b4ba6b54bc97b5fd7d90e4981471edfaf51c8321a29a3c76cf47c", + "md5": "b9cdefdf1c24172c8664bbac59f28812", + "sha256": "4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9" + }, + "downloads": -1, + "filename": "asgiref-3.4.1.tar.gz", + "has_sig": false, + "md5_digest": "b9cdefdf1c24172c8664bbac59f28812", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.6", + "size": 32529, + "upload_time": "2021-07-01T16:17:42", + "upload_time_iso_8601": "2021-07-01T16:17:42.656681Z", + "url": "https://files.pythonhosted.org/packages/07/93/3618b68b4ba6b54bc97b5fd7d90e4981471edfaf51c8321a29a3c76cf47c/asgiref-3.4.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.5.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "0b9f5f3b91391578312827561b669a0397d58535b4e82966c8f1667525c7d563", + "md5": "4264e5154e26179e78d51228d94dbf45", + "sha256": "88d59c13d634dcffe0510be048210188edd79aeccb6a6c9028cdad6f31d730a9" + }, + "downloads": -1, + "filename": "asgiref-3.5.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "4264e5154e26179e78d51228d94dbf45", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.7", + "size": 22719, + "upload_time": "2022-01-22T16:58:09", + "upload_time_iso_8601": "2022-01-22T16:58:09.597287Z", + "url": "https://files.pythonhosted.org/packages/0b/9f/5f3b91391578312827561b669a0397d58535b4e82966c8f1667525c7d563/asgiref-3.5.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "ea2b3face3a7241f61dc1c58dbe243cc02c15c61ccdcafebc4406f7bb40ce731", + "md5": "4d3c2090891998f3b147339ac7df48e0", + "sha256": "2f8abc20f7248433085eda803936d98992f1343ddb022065779f37c5da0181d0" + }, + "downloads": -1, + "filename": "asgiref-3.5.0.tar.gz", + "has_sig": false, + "md5_digest": "4d3c2090891998f3b147339ac7df48e0", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.7", + "size": 31920, + "upload_time": "2022-01-22T16:58:11", + "upload_time_iso_8601": "2022-01-22T16:58:11.110060Z", + "url": "https://files.pythonhosted.org/packages/ea/2b/3face3a7241f61dc1c58dbe243cc02c15c61ccdcafebc4406f7bb40ce731/asgiref-3.5.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.5.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "3c4703bc5ff25d66be3727357a85de550bcf5f5a9cdeff5d0a3c2456c9385a2e", + "md5": "62f3bc067a5fb5cc958a3baf52cc9bb1", + "sha256": "45a429524fba18aba9d512498b19d220c4d628e75b40cf5c627524dbaebc5cc1" + }, + "downloads": -1, + "filename": "asgiref-3.5.1-py3-none-any.whl", + "has_sig": false, + "md5_digest": "62f3bc067a5fb5cc958a3baf52cc9bb1", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.7", + "size": 22849, + "upload_time": "2022-04-30T21:20:01", + "upload_time_iso_8601": "2022-04-30T21:20:01.550054Z", + "url": "https://files.pythonhosted.org/packages/3c/47/03bc5ff25d66be3727357a85de550bcf5f5a9cdeff5d0a3c2456c9385a2e/asgiref-3.5.1-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "6db644c179fdee3857af5e76ee04426cac8119ef736900a0068d12c1c018301c", + "md5": "cfecce52fa74a68fb7f1c9bf826684e4", + "sha256": "fddeea3c53fa99d0cdb613c3941cc6e52d822491fc2753fba25768fb5bf4e865" + }, + "downloads": -1, + "filename": "asgiref-3.5.1.tar.gz", + "has_sig": false, + "md5_digest": "cfecce52fa74a68fb7f1c9bf826684e4", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.7", + "size": 32027, + "upload_time": "2022-04-30T21:20:03", + "upload_time_iso_8601": "2022-04-30T21:20:03.664346Z", + "url": "https://files.pythonhosted.org/packages/6d/b6/44c179fdee3857af5e76ee04426cac8119ef736900a0068d12c1c018301c/asgiref-3.5.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.5.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "af6dea3a5c3027c3f14b0321cd4f7e594c776ebe64e4b927432ca6917512a4f7", + "md5": "94ca81aaf103bf15a3f73f817f0fc78a", + "sha256": "1d2880b792ae8757289136f1db2b7b99100ce959b2aa57fd69dab783d05afac4" + }, + "downloads": -1, + "filename": "asgiref-3.5.2-py3-none-any.whl", + "has_sig": false, + "md5_digest": "94ca81aaf103bf15a3f73f817f0fc78a", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.7", + "size": 22881, + "upload_time": "2022-05-16T20:39:27", + "upload_time_iso_8601": "2022-05-16T20:39:27.790189Z", + "url": "https://files.pythonhosted.org/packages/af/6d/ea3a5c3027c3f14b0321cd4f7e594c776ebe64e4b927432ca6917512a4f7/asgiref-3.5.2-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "1f35e7d59b92ceffb1dc62c65156278de378670b46ab2364a3ea7216fe194ba3", + "md5": "b3cf42bb1f9191196f9ed1678f9dc106", + "sha256": "4a29362a6acebe09bf1d6640db38c1dc3d9217c68e6f9f6204d72667fc19a424" + }, + "downloads": -1, + "filename": "asgiref-3.5.2.tar.gz", + "has_sig": false, + "md5_digest": "b3cf42bb1f9191196f9ed1678f9dc106", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.7", + "size": 32352, + "upload_time": "2022-05-16T20:39:30", + "upload_time_iso_8601": "2022-05-16T20:39:30.510237Z", + "url": "https://files.pythonhosted.org/packages/1f/35/e7d59b92ceffb1dc62c65156278de378670b46ab2364a3ea7216fe194ba3/asgiref-3.5.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.6.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "8f2938d10a47b322a77b2d12c2b79c789f52956f733cb701d4d5157c76b5f238", + "md5": "cd751a979540f8d7a4f4c216f8628fa4", + "sha256": "71e68008da809b957b7ee4b43dbccff33d1b23519fb8344e33f049897077afac" + }, + "downloads": -1, + "filename": "asgiref-3.6.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "cd751a979540f8d7a4f4c216f8628fa4", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.7", + "size": 23105, + "upload_time": "2022-12-20T09:06:49", + "upload_time_iso_8601": "2022-12-20T09:06:49.899258Z", + "url": "https://files.pythonhosted.org/packages/8f/29/38d10a47b322a77b2d12c2b79c789f52956f733cb701d4d5157c76b5f238/asgiref-3.6.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "782d797c0537426266d6c9377a2ed6a4ac61e50c2d5b1ab4da101a4b9bfe26e2", + "md5": "562ecd896dcbf5576db8c29cb1881ca4", + "sha256": "9567dfe7bd8d3c8c892227827c41cce860b368104c3431da67a0c5a65a949506" + }, + "downloads": -1, + "filename": "asgiref-3.6.0.tar.gz", + "has_sig": false, + "md5_digest": "562ecd896dcbf5576db8c29cb1881ca4", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.7", + "size": 32748, + "upload_time": "2022-12-20T09:06:51", + "upload_time_iso_8601": "2022-12-20T09:06:51.580184Z", + "url": "https://files.pythonhosted.org/packages/78/2d/797c0537426266d6c9377a2ed6a4ac61e50c2d5b1ab4da101a4b9bfe26e2/asgiref-3.6.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.7.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "5170fe2134ce04ca793f735527741889e26fa287e3a5f3fb2ce7926947713cb6", + "md5": "4ceab5951474cd08bc1048356d319a01", + "sha256": "14087924af5be5d8103d6f2edffe45a0bf7ab1b2a771b6f00a6db8c302f21f34" + }, + "downloads": -1, + "filename": "asgiref-3.7.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "4ceab5951474cd08bc1048356d319a01", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.7", + "size": 24045, + "upload_time": "2023-05-23T16:56:11", + "upload_time_iso_8601": "2023-05-23T16:56:11.205454Z", + "url": "https://files.pythonhosted.org/packages/51/70/fe2134ce04ca793f735527741889e26fa287e3a5f3fb2ce7926947713cb6/asgiref-3.7.0-py3-none-any.whl", + "yanked": true, + "yanked_reason": "Broken dependencies that cause installation issues" + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "85b0bb7ba9d107a910570ce811061e9b97dac918e3df5a8c3d42f07aded71d48", + "md5": "8faba2740e25cb815504ee8110b85256", + "sha256": "5d6c4a8a1c99f58eaa3bc392ee04e3587b693f09e3af1f3f16a09094f334eb52" + }, + "downloads": -1, + "filename": "asgiref-3.7.0.tar.gz", + "has_sig": false, + "md5_digest": "8faba2740e25cb815504ee8110b85256", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.7", + "size": 33247, + "upload_time": "2023-05-23T16:56:13", + "upload_time_iso_8601": "2023-05-23T16:56:13.382005Z", + "url": "https://files.pythonhosted.org/packages/85/b0/bb7ba9d107a910570ce811061e9b97dac918e3df5a8c3d42f07aded71d48/asgiref-3.7.0.tar.gz", + "yanked": true, + "yanked_reason": "Broken dependencies that cause installation issues" + } + ], + "3.7.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "2bad2b292d71b1cd1e6203b3de5901490e76a1721b3660c5fde06cf6cdbd7532", + "md5": "0be381b422ce985a7749b3dd6e79bdef", + "sha256": "33958cb2e4b3cd8b1b06ef295bd8605cde65b11df51d3beab39e2e149a610ab3" + }, + "downloads": -1, + "filename": "asgiref-3.7.1-py3-none-any.whl", + "has_sig": false, + "md5_digest": "0be381b422ce985a7749b3dd6e79bdef", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.7", + "size": 24048, + "upload_time": "2023-05-24T05:24:59", + "upload_time_iso_8601": "2023-05-24T05:24:59.491412Z", + "url": "https://files.pythonhosted.org/packages/2b/ad/2b292d71b1cd1e6203b3de5901490e76a1721b3660c5fde06cf6cdbd7532/asgiref-3.7.1-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "29efbd9cd6ac55b7e7595c6fe097ea6c318b6a487f43762f15abe98c58b101e9", + "md5": "3be18d4d8a05daea7a5b40ec677fc873", + "sha256": "8de379fcc383bcfe4507e229fc31209ea23d4831c850f74063b2c11639474dd2" + }, + "downloads": -1, + "filename": "asgiref-3.7.1.tar.gz", + "has_sig": false, + "md5_digest": "3be18d4d8a05daea7a5b40ec677fc873", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.7", + "size": 33273, + "upload_time": "2023-05-24T05:25:01", + "upload_time_iso_8601": "2023-05-24T05:25:01.087612Z", + "url": "https://files.pythonhosted.org/packages/29/ef/bd9cd6ac55b7e7595c6fe097ea6c318b6a487f43762f15abe98c58b101e9/asgiref-3.7.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.7.2": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "9b80b9051a4a07ad231558fcd8ffc89232711b4e618c15cb7a392a17384bbeef", + "md5": "d4d9c9c26865c416dc29553bc712df5b", + "sha256": "89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e" + }, + "downloads": -1, + "filename": "asgiref-3.7.2-py3-none-any.whl", + "has_sig": false, + "md5_digest": "d4d9c9c26865c416dc29553bc712df5b", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.7", + "size": 24140, + "upload_time": "2023-05-27T17:21:40", + "upload_time_iso_8601": "2023-05-27T17:21:40.454834Z", + "url": "https://files.pythonhosted.org/packages/9b/80/b9051a4a07ad231558fcd8ffc89232711b4e618c15cb7a392a17384bbeef/asgiref-3.7.2-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "121964e38c1c2cbf0da9635b7082bbdf0e89052e93329279f59759c24a10cc96", + "md5": "7cd61836ec3c329f415309f88e92e0e3", + "sha256": "9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed" + }, + "downloads": -1, + "filename": "asgiref-3.7.2.tar.gz", + "has_sig": false, + "md5_digest": "7cd61836ec3c329f415309f88e92e0e3", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.7", + "size": 33393, + "upload_time": "2023-05-27T17:21:42", + "upload_time_iso_8601": "2023-05-27T17:21:42.120589Z", + "url": "https://files.pythonhosted.org/packages/12/19/64e38c1c2cbf0da9635b7082bbdf0e89052e93329279f59759c24a10cc96/asgiref-3.7.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.8.0": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "151ec8a0cae47d0e10a241c40d4eaf32ae555a968cccbe297192223c7246ac8c", + "md5": "df245fde90661c159427fda9b2645f4a", + "sha256": "30fc07797ad71a0abb8fe34aa03c8043308a8389abc7942d797ea9911540bc28" + }, + "downloads": -1, + "filename": "asgiref-3.8.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "df245fde90661c159427fda9b2645f4a", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.8", + "size": 23817, + "upload_time": "2024-03-20T13:01:21", + "upload_time_iso_8601": "2024-03-20T13:01:21.669035Z", + "url": "https://files.pythonhosted.org/packages/15/1e/c8a0cae47d0e10a241c40d4eaf32ae555a968cccbe297192223c7246ac8c/asgiref-3.8.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "8df1f2bc42f6fba0ae214e6625e641e1c982932dec3a15e4aecb46e18031fdef", + "md5": "81061e92907a19e02e88f4bc920708f7", + "sha256": "ec75d9d0f04e2dbfedef1f20ee73a6594af80c333df47cdd31f37e6701f7c53a" + }, + "downloads": -1, + "filename": "asgiref-3.8.0.tar.gz", + "has_sig": false, + "md5_digest": "81061e92907a19e02e88f4bc920708f7", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.8", + "size": 34907, + "upload_time": "2024-03-20T13:01:24", + "upload_time_iso_8601": "2024-03-20T13:01:24.186242Z", + "url": "https://files.pythonhosted.org/packages/8d/f1/f2bc42f6fba0ae214e6625e641e1c982932dec3a15e4aecb46e18031fdef/asgiref-3.8.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.8.1": [ + { + "comment_text": "", + "digests": { + "blake2b_256": "39e3893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e", + "md5": "87ef2494bf2bb208cd3652e577c74bc9", + "sha256": "3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47" + }, + "downloads": -1, + "filename": "asgiref-3.8.1-py3-none-any.whl", + "has_sig": false, + "md5_digest": "87ef2494bf2bb208cd3652e577c74bc9", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.8", + "size": 23828, + "upload_time": "2024-03-22T14:39:34", + "upload_time_iso_8601": "2024-03-22T14:39:34.521795Z", + "url": "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": "", + "digests": { + "blake2b_256": "2938b3395cc9ad1b56d2ddac9970bc8f4141312dbaec28bc7c218b0dfafd0f42", + "md5": "fb2927e26ea34c97e0a4c89612e80562", + "sha256": "c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590" + }, + "downloads": -1, + "filename": "asgiref-3.8.1.tar.gz", + "has_sig": false, + "md5_digest": "fb2927e26ea34c97e0a4c89612e80562", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.8", + "size": 35186, + "upload_time": "2024-03-22T14:39:36", + "upload_time_iso_8601": "2024-03-22T14:39:36.863619Z", + "url": "https://files.pythonhosted.org/packages/29/38/b3395cc9ad1b56d2ddac9970bc8f4141312dbaec28bc7c218b0dfafd0f42/asgiref-3.8.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.9.0": [ + { + "comment_text": null, + "digests": { + "blake2b_256": "3df976c9f4d4985b5a642926162e2d41fe6019b1fa929cfa58abb7d2dc9041e5", + "md5": "6ddd703aad072c2ac372c1fd48425778", + "sha256": "06a41250a0114d2b6f6a2cb3ab962147d355b53d1de15eebc34a9d04a7b79981" + }, + "downloads": -1, + "filename": "asgiref-3.9.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "6ddd703aad072c2ac372c1fd48425778", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.9", + "size": 23788, + "upload_time": "2025-07-03T13:24:59", + "upload_time_iso_8601": "2025-07-03T13:24:59.115095Z", + "url": "https://files.pythonhosted.org/packages/3d/f9/76c9f4d4985b5a642926162e2d41fe6019b1fa929cfa58abb7d2dc9041e5/asgiref-3.9.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": null, + "digests": { + "blake2b_256": "6a68fb4fb78c9eac59d5e819108a57664737f855c5a8e9b76aec1738bb137f9e", + "md5": "6bbf539a173644dd6c925acc80a96dc0", + "sha256": "3dd2556d0f08c4fab8a010d9ab05ef8c34565f6bf32381d17505f7ca5b273767" + }, + "downloads": -1, + "filename": "asgiref-3.9.0.tar.gz", + "has_sig": false, + "md5_digest": "6bbf539a173644dd6c925acc80a96dc0", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.9", + "size": 36772, + "upload_time": "2025-07-03T13:25:01", + "upload_time_iso_8601": "2025-07-03T13:25:01.491417Z", + "url": "https://files.pythonhosted.org/packages/6a/68/fb4fb78c9eac59d5e819108a57664737f855c5a8e9b76aec1738bb137f9e/asgiref-3.9.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.9.1": [ + { + "comment_text": null, + "digests": { + "blake2b_256": "7c3c0464dcada90d5da0e71018c04a140ad6349558afb30b3051b4264cc5b965", + "md5": "d19da2d0d9ec6d796bcdd3a27a908294", + "sha256": "f3bba7092a48005b5f5bacd747d36ee4a5a61f4a269a6df590b43144355ebd2c" + }, + "downloads": -1, + "filename": "asgiref-3.9.1-py3-none-any.whl", + "has_sig": false, + "md5_digest": "d19da2d0d9ec6d796bcdd3a27a908294", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.9", + "size": 23790, + "upload_time": "2025-07-08T09:07:41", + "upload_time_iso_8601": "2025-07-08T09:07:41.548205Z", + "url": "https://files.pythonhosted.org/packages/7c/3c/0464dcada90d5da0e71018c04a140ad6349558afb30b3051b4264cc5b965/asgiref-3.9.1-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": null, + "digests": { + "blake2b_256": "90610aa957eec22ff70b830b22ff91f825e70e1ef732c06666a805730f28b36b", + "md5": "f4151a69f1fc33dd69c237515bbf9c92", + "sha256": "a5ab6582236218e5ef1648f242fd9f10626cfd4de8dc377db215d5d5098e3142" + }, + "downloads": -1, + "filename": "asgiref-3.9.1.tar.gz", + "has_sig": false, + "md5_digest": "f4151a69f1fc33dd69c237515bbf9c92", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.9", + "size": 36870, + "upload_time": "2025-07-08T09:07:43", + "upload_time_iso_8601": "2025-07-08T09:07:43.344451Z", + "url": "https://files.pythonhosted.org/packages/90/61/0aa957eec22ff70b830b22ff91f825e70e1ef732c06666a805730f28b36b/asgiref-3.9.1.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "3.9.2": [ + { + "comment_text": null, + "digests": { + "blake2b_256": "c7d169d02ce34caddb0a7ae088b84c356a625a93cd4ff57b2f97644c03fad905", + "md5": "cbc7af556d18c4cf3080224d70d3b547", + "sha256": "0b61526596219d70396548fc003635056856dba5d0d086f86476f10b33c75960" + }, + "downloads": -1, + "filename": "asgiref-3.9.2-py3-none-any.whl", + "has_sig": false, + "md5_digest": "cbc7af556d18c4cf3080224d70d3b547", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.9", + "size": 23788, + "upload_time": "2025-09-23T15:00:53", + "upload_time_iso_8601": "2025-09-23T15:00:53.627983Z", + "url": "https://files.pythonhosted.org/packages/c7/d1/69d02ce34caddb0a7ae088b84c356a625a93cd4ff57b2f97644c03fad905/asgiref-3.9.2-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": null, + "digests": { + "blake2b_256": "7fbf0f3ecda32f1cb3bf1dca480aca08a7a8a3bdc4bed2343a103f30731565c9", + "md5": "6281a0541574b46fde3d09db79746048", + "sha256": "a0249afacb66688ef258ffe503528360443e2b9a8d8c4581b6ebefa58c841ef1" + }, + "downloads": -1, + "filename": "asgiref-3.9.2.tar.gz", + "has_sig": false, + "md5_digest": "6281a0541574b46fde3d09db79746048", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.9", + "size": 36894, + "upload_time": "2025-09-23T15:00:55", + "upload_time_iso_8601": "2025-09-23T15:00:55.136282Z", + "url": "https://files.pythonhosted.org/packages/7f/bf/0f3ecda32f1cb3bf1dca480aca08a7a8a3bdc4bed2343a103f30731565c9/asgiref-3.9.2.tar.gz", + "yanked": false, + "yanked_reason": null + } + ] + }, + "urls": [ + { + "comment_text": null, + "digests": { + "blake2b_256": "91be317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea", + "md5": "659fe6bbd7e43c8bde0b7ca065be0f6c", + "sha256": "1db9021efadb0d9512ce8ffaf72fcef601c7b73a8807a1bb2ef143dc6b14846d" + }, + "downloads": -1, + "filename": "asgiref-3.11.0-py3-none-any.whl", + "has_sig": false, + "md5_digest": "659fe6bbd7e43c8bde0b7ca065be0f6c", + "packagetype": "bdist_wheel", + "python_version": "py3", + "requires_python": "\u003E=3.9", + "size": 24096, + "upload_time": "2025-11-19T15:32:19", + "upload_time_iso_8601": "2025-11-19T15:32:19.004742Z", + "url": "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", + "yanked": false, + "yanked_reason": null + }, + { + "comment_text": null, + "digests": { + "blake2b_256": "76b94db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b", + "md5": "554794453502d266a90d2254fcb1f7c3", + "sha256": "13acff32519542a1736223fb79a715acdebe24286d98e8b164a73085f40da2c4" + }, + "downloads": -1, + "filename": "asgiref-3.11.0.tar.gz", + "has_sig": false, + "md5_digest": "554794453502d266a90d2254fcb1f7c3", + "packagetype": "sdist", + "python_version": "source", + "requires_python": "\u003E=3.9", + "size": 37969, + "upload_time": "2025-11-19T15:32:20", + "upload_time_iso_8601": "2025-11-19T15:32:20.106038Z", + "url": "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", + "yanked": false, + "yanked_reason": null + } + ], + "vulnerabilities": [] +} diff --git a/tests/test_fetch.py b/tests/test_fetch.py index c4adccb..74300ba 100644 --- a/tests/test_fetch.py +++ b/tests/test_fetch.py @@ -101,15 +101,7 @@ def test_fetch_purl_with_purl2url(mock_fetch_http, mock_http_exists): def test_fetch_invalid_purl(mock_fetch_json_response): mock_fetch_json_response.return_value = {} - with pytest.raises(Exception, match="No download URL found for invalid-package version 1.0.0"): - fetch("pkg:pypi/invalid-package@1.0.0") - - -@mock.patch("fetchcode.pypi.fetch_json_response") -def test_fetch_invalid_purl(mock_fetch_json_response): - mock_fetch_json_response.return_value = {} - - with pytest.raises(Exception, match="No download URL found for invalid-package version 1.0.0"): + with pytest.raises(Exception, match="Could not resolve PURL to a valid URL."): fetch("pkg:pypi/invalid-package@1.0.0") diff --git a/tests/test_pypi.py b/tests/test_pypi.py index 93b9eb2..084519e 100644 --- a/tests/test_pypi.py +++ b/tests/test_pypi.py @@ -1,75 +1,166 @@ +# fetchcode is a free software tool from nexB Inc. and others. +# Visit https://github.com/aboutcode-org/fetchcode for support and download. +# +# Copyright (c) nexB Inc. and others. All rights reserved. +# http://nexb.com and http://aboutcode.org +# +# This software is licensed under the Apache License version 2.0. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: +# http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. + +import json import unittest +from pathlib import Path from unittest.mock import patch from fetchcode.pypi import Pypi +DATA_DIR = Path(__file__).parent / "data" / "pypi" + + +def load_fixture(filename): + with open(DATA_DIR / filename) as f: + return json.load(f) -class TestGetDownloadURL(unittest.TestCase): - @patch("fetchcode.pypi.fetch_json_response") - def test_valid_purl_returns_download_url(self, mock_fetch_json_response): - mock_response = { - "urls": [ - { - "url": "https://files.pythonhosted.org/packages/source/r/requests/requests-2.31.0.tar.gz" - } - ] - } - mock_fetch_json_response.return_value = mock_response - purl = "pkg:pypi/requests@2.31.0" +ASGIREF_VERSION_RESPONSE = load_fixture("asgiref-3.11.0.json") +ASGIREF_LATEST_RESPONSE = load_fixture("asgiref.json") + + +def mock_fetch_json_response(url): + """Return appropriate fixture based on request URL.""" + if url == "https://pypi.org/pypi/asgiref/3.11.0/json": + return ASGIREF_VERSION_RESPONSE + elif url == "https://pypi.org/pypi/asgiref/json": + return ASGIREF_LATEST_RESPONSE + raise ValueError(f"Unexpected URL: {url}") + + +@patch("fetchcode.pypi.fetch_json_response", side_effect=mock_fetch_json_response) +class TestPypi(unittest.TestCase): + def test_get_download_url_with_version(self, mock_fetch): + purl = "pkg:pypi/asgiref@3.11.0" result = Pypi.get_download_url(purl) self.assertEqual( result, - "https://files.pythonhosted.org/packages/source/r/requests/requests-2.31.0.tar.gz", + "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", ) + mock_fetch.assert_called_once_with("https://pypi.org/pypi/asgiref/3.11.0/json") - @patch("fetchcode.pypi.fetch_json_response") - def test_missing_version_raises_value_error(self, mock_fetch_json_response): - purl = "pkg:pypi/requests" - with self.assertRaises(ValueError) as context: - Pypi.get_download_url(purl) - self.assertIn("Pypi PURL must specify a name and version", str(context.exception)) + def test_get_download_url_without_version_fetches_latest(self, mock_fetch): + purl = "pkg:pypi/asgiref" + result = Pypi.get_download_url(purl) + self.assertEqual( + result, + "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", + ) + mock_fetch.assert_called_once_with("https://pypi.org/pypi/asgiref/json") - @patch("fetchcode.pypi.fetch_json_response") - def test_missing_name_raises_value_error(self, mock_fetch_json_response): - purl = "pkg:pypi/@2.31.0" - with self.assertRaises(ValueError) as context: - Pypi.get_download_url(purl) - self.assertIn("purl is missing the required name component", str(context.exception)) + def test_get_download_url_prefers_sdist_by_default(self, mock_fetch): + purl = "pkg:pypi/asgiref@3.11.0" + result = Pypi.get_download_url(purl) + self.assertIn(".tar.gz", result) + + def test_get_download_url_with_preferred_type_wheel(self, mock_fetch): + purl = "pkg:pypi/asgiref@3.11.0" + result = Pypi.get_download_url(purl, preferred_type="bdist_wheel") + self.assertEqual( + result, + "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", + ) + + def test_get_download_url_falls_back_to_first_when_preferred_not_found(self, mock_fetch): + purl = "pkg:pypi/asgiref@3.11.0" + result = Pypi.get_download_url(purl, preferred_type="nonexistent_type") + # Falls back to first URL in the list (wheel) + self.assertEqual( + result, + "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", + ) + + def test_get_all_download_urls(self, mock_fetch): + purl = "pkg:pypi/asgiref@3.11.0" + result = Pypi.get_all_download_urls(purl) + self.assertEqual( + result, + [ + "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", + "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", + ], + ) + + def test_get_all_download_urls_without_version(self, mock_fetch): + purl = "pkg:pypi/asgiref" + result = Pypi.get_all_download_urls(purl) + self.assertEqual( + result, + [ + "https://files.pythonhosted.org/packages/91/be/317c2c55b8bbec407257d45f5c8d1b6867abc76d12043f2d3d58c538a4ea/asgiref-3.11.0-py3-none-any.whl", + "https://files.pythonhosted.org/packages/76/b9/4db2509eabd14b4a8c71d1b24c8d5734c52b8560a7b1e1a8b56c8d25568b/asgiref-3.11.0.tar.gz", + ], + ) + + def test_get_urls_info(self, mock_fetch): + purl = "pkg:pypi/asgiref@3.11.0" + result = Pypi.get_urls_info(purl) + self.assertEqual(len(result), 2) + self.assertEqual(result[0]["packagetype"], "bdist_wheel") + self.assertEqual(result[1]["packagetype"], "sdist") + + def test_get_package_data(self, mock_fetch): + purl = "pkg:pypi/asgiref@3.11.0" + result = Pypi.get_package_data(purl) + self.assertEqual(result["info"]["name"], "asgiref") + self.assertEqual(result["info"]["version"], "3.11.0") + + +class TestPypiEdgeCases(unittest.TestCase): + """Tests that require custom mock responses.""" @patch("fetchcode.pypi.fetch_json_response") - def test_missing_urls_field_raises_value_error(self, mock_fetch_json_response): - mock_fetch_json_response.return_value = {} - purl = "pkg:pypi/requests@2.31.0" - with self.assertRaises(ValueError) as context: - Pypi.get_download_url(purl) - self.assertIn("No download URL found", str(context.exception)) + def test_get_download_url_returns_none_when_no_urls(self, mock_fetch): + mock_fetch.return_value = {"info": {}, "urls": []} + purl = "pkg:pypi/asgiref@3.11.0" + result = Pypi.get_download_url(purl) + self.assertIsNone(result) @patch("fetchcode.pypi.fetch_json_response") - def test_empty_urls_list_raises_value_error(self, mock_fetch_json_response): - mock_fetch_json_response.return_value = {"urls": []} - purl = "pkg:pypi/requests@2.31.0" - with self.assertRaises(ValueError) as context: - Pypi.get_download_url(purl) - self.assertIn("No download URLs found", str(context.exception)) + def test_get_download_url_returns_none_when_missing_urls_field(self, mock_fetch): + mock_fetch.return_value = {"info": {}} + purl = "pkg:pypi/asgiref@3.11.0" + result = Pypi.get_download_url(purl) + self.assertIsNone(result) @patch("fetchcode.pypi.fetch_json_response") - def test_first_url_object_missing_url_key(self, mock_fetch_json_response): - mock_fetch_json_response.return_value = {"urls": [{}]} - purl = "pkg:pypi/requests@2.31.0" - with self.assertRaises(ValueError) as context: - Pypi.get_download_url(purl) - self.assertIn("No download URL found", str(context.exception)) + def test_get_all_download_urls_returns_empty_list_when_no_urls(self, mock_fetch): + mock_fetch.return_value = {"info": {}, "urls": []} + purl = "pkg:pypi/asgiref@3.11.0" + result = Pypi.get_all_download_urls(purl) + self.assertEqual(result, []) @patch("fetchcode.pypi.fetch_json_response") - def test_url_fallback_when_multiple_urls_provided(self, mock_fetch_json_response): - mock_fetch_json_response.return_value = { - "urls": [{}, {"url": "https://example.com/fallback-url.tar.gz"}] + def test_get_all_download_urls_skips_entries_without_url_key(self, mock_fetch): + mock_fetch.return_value = { + "info": {}, + "urls": [ + {"packagetype": "sdist"}, + {"packagetype": "bdist_wheel", "url": "https://example.com/package.whl"}, + ], } + purl = "pkg:pypi/asgiref@3.11.0" + result = Pypi.get_all_download_urls(purl) + self.assertEqual(result, ["https://example.com/package.whl"]) - purl = "pkg:pypi/requests@2.31.0" - download_url = Pypi.get_download_url(purl) - self.assertEqual(download_url, "https://example.com/fallback-url.tar.gz") + def test_missing_name_raises_value_error(self): + purl = "pkg:pypi/@3.11.0" + with self.assertRaises(ValueError): + Pypi.get_download_url(purl) def test_malformed_purl_raises_exception(self): with self.assertRaises(ValueError):