import inspect import typing as t from functools import wraps from .utils import _PassArg from .utils import pass_eval_context V = t.TypeVar("V") def async_variant(normal_func): # type: ignore def decorator(async_func): # type: ignore pass_arg = _PassArg.from_obj(normal_func) need_eval_context = pass_arg is None if pass_arg is _PassArg.environment: def is_async(args: t.Any) -> bool: return t.cast(bool, args[0].is_async) else: def is_async(args: t.Any) -> bool: return t.cast(bool, args[0].environment.is_async) @wraps(normal_func) def wrapper(*args, **kwargs): # type: ignore b = is_async(args) if need_eval_context: args = args[1:] if b: return async_func(*args, **kwargs) return normal_func(*args, **kwargs) if need_eval_context: wrapper = pass_eval_context(wrapper) wrapper.jinja_async_variant = True return wrapper return decorator _common_primitives = {int, float, bool, str, list, dict, tuple, type(None)} async def auto_await(value: t.Union[t.Awaitable["V"], "V"]) -> "V": # Avoid a costly call to isawaitable if type(value) in _common_primitives: return t.cast("V", value) if inspect.isawaitable(value): return await t.cast("t.Awaitable[V]", value) return t.cast("V", value) async def auto_aiter( iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", ) -> "t.AsyncIterator[V]": if hasattr(iterable, "__aiter__"): async for item in t.cast("t.AsyncIterable[V]", iterable): yield item else: for item in t.cast("t.Iterable[V]", iterable): yield item async def auto_to_list( value: "t.Union[t.AsyncIterable[V], t.Iterable[V]]", ) -> t.List["V"]: return [x async for x in auto_aiter(value)]
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
__init__.py | File | 2.15 KB | 0644 |
|
_identifier.py | File | 1.73 KB | 0644 |
|
async_utils.py | File | 1.9 KB | 0644 |
|
bccache.py | File | 12.37 KB | 0644 |
|
compiler.py | File | 70.52 KB | 0644 |
|
constants.py | File | 1.4 KB | 0644 |
|
debug.py | File | 8.29 KB | 0644 |
|
defaults.py | File | 1.24 KB | 0644 |
|
environment.py | File | 59.55 KB | 0644 |
|
exceptions.py | File | 4.95 KB | 0644 |
|
ext.py | File | 31.37 KB | 0644 |
|
filters.py | File | 51.38 KB | 0644 |
|
idtracking.py | File | 10.47 KB | 0644 |
|
lexer.py | File | 29.23 KB | 0644 |
|
loaders.py | File | 22.22 KB | 0644 |
|
meta.py | File | 4.29 KB | 0644 |
|
nativetypes.py | File | 3.88 KB | 0644 |
|
nodes.py | File | 33.74 KB | 0644 |
|
optimizer.py | File | 1.61 KB | 0644 |
|
parser.py | File | 38.83 KB | 0644 |
|
py.typed | File | 0 B | 0644 |
|
runtime.py | File | 34.23 KB | 0644 |
|
sandbox.py | File | 14.26 KB | 0644 |
|
tests.py | File | 5.77 KB | 0644 |
|
utils.py | File | 26.34 KB | 0644 |
|
visitor.py | File | 3.49 KB | 0644 |
|