diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-10-18 14:31:40 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-10-18 14:31:40 -0400 |
commit | aaf4643bc2734442f053216874a6b9d299a8d89e (patch) | |
tree | f2f3a0befbea6c488102497736f13ba51e21eb05 /lib/sqlalchemy/util/_concurrency_py3k.py | |
parent | 68479d40726425c3b3a17f12658927db8ad9fe84 (diff) | |
download | sqlalchemy-aaf4643bc2734442f053216874a6b9d299a8d89e.tar.gz |
vendor asynccontextmanager outside of greenlet dependency
Fixed installation issue where the ``sqlalchemy.dialects.mysql`` module
would not be importable if "greenlet" were not installed.
This was actually breaking the sphinx build for when greenlet
were not installed.
Fixes: #7204
Change-Id: Ia351c124a2f1ca44bafe20a97267ce20cb55808f
Diffstat (limited to 'lib/sqlalchemy/util/_concurrency_py3k.py')
-rw-r--r-- | lib/sqlalchemy/util/_concurrency_py3k.py | 68 |
1 files changed, 7 insertions, 61 deletions
diff --git a/lib/sqlalchemy/util/_concurrency_py3k.py b/lib/sqlalchemy/util/_concurrency_py3k.py index 7a4a2c361..55fe87c6a 100644 --- a/lib/sqlalchemy/util/_concurrency_py3k.py +++ b/lib/sqlalchemy/util/_concurrency_py3k.py @@ -1,5 +1,11 @@ +# util/_concurrency_py3k.py +# Copyright (C) 2005-2021 the SQLAlchemy authors and contributors +# <see AUTHORS file> +# +# This module is part of SQLAlchemy and is released under +# the MIT License: https://www.opensource.org/licenses/mit-license.php + import asyncio -from functools import wraps import sys from typing import Any from typing import Callable @@ -194,63 +200,3 @@ def get_event_loop(): return asyncio.get_event_loop_policy().get_event_loop() else: return asyncio.get_event_loop() - - -# vendored from py3.7 - - -class _AsyncGeneratorContextManager: - """Helper for @asynccontextmanager.""" - - def __init__(self, func, args, kwds): - self.gen = func(*args, **kwds) - self.func, self.args, self.kwds = func, args, kwds - doc = getattr(func, "__doc__", None) - if doc is None: - doc = type(self).__doc__ - self.__doc__ = doc - - async def __aenter__(self): - try: - return await self.gen.__anext__() - except StopAsyncIteration: - raise RuntimeError("generator didn't yield") from None - - async def __aexit__(self, typ, value, traceback): - if typ is None: - try: - await self.gen.__anext__() - except StopAsyncIteration: - return - else: - raise RuntimeError("generator didn't stop") - else: - if value is None: - value = typ() - # See _GeneratorContextManager.__exit__ for comments on subtleties - # in this implementation - try: - await self.gen.athrow(typ, value, traceback) - raise RuntimeError("generator didn't stop after athrow()") - except StopAsyncIteration as exc: - return exc is not value - except RuntimeError as exc: - if exc is value: - return False - if isinstance(value, (StopIteration, StopAsyncIteration)): - if exc.__cause__ is value: - return False - raise - except BaseException as exc: - if exc is not value: - raise - - -# using the vendored version in all cases at the moment to establish -# full test coverage -def asynccontextmanager(func): - @wraps(func) - def helper(*args, **kwds): - return _AsyncGeneratorContextManager(func, args, kwds) - - return helper |