__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
import inspect
import typing as t
from functools import WRAPPER_ASSIGNMENTS
from functools import wraps
from .utils import _PassArg
from .utils import pass_eval_context
if t.TYPE_CHECKING:
import typing_extensions as te
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)
# Take the doc and annotations from the sync function, but the
# name from the async function. Pallets-Sphinx-Themes
# build_function_directive expects __wrapped__ to point to the
# sync function.
async_func_attrs = ("__module__", "__name__", "__qualname__")
normal_func_attrs = tuple(set(WRAPPER_ASSIGNMENTS).difference(async_func_attrs))
@wraps(normal_func, assigned=normal_func_attrs)
@wraps(async_func, assigned=async_func_attrs, updated=())
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 # type: ignore[attr-defined]
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 value
class _IteratorToAsyncIterator(t.Generic[V]):
def __init__(self, iterator: "t.Iterator[V]"):
self._iterator = iterator
def __aiter__(self) -> "te.Self":
return self
async def __anext__(self) -> V:
try:
return next(self._iterator)
except StopIteration as e:
raise StopAsyncIteration(e.value) from e
def auto_aiter(
iterable: "t.Union[t.AsyncIterable[V], t.Iterable[V]]",
) -> "t.AsyncIterator[V]":
if hasattr(iterable, "__aiter__"):
return iterable.__aiter__()
else:
return _IteratorToAsyncIterator(iter(iterable))
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 | 1.88 KB | 0644 |
|
| _identifier.py | File | 1.91 KB | 0644 |
|
| async_utils.py | File | 2.77 KB | 0644 |
|
| bccache.py | File | 13.73 KB | 0644 |
|
| compiler.py | File | 72.39 KB | 0644 |
|
| constants.py | File | 1.4 KB | 0644 |
|
| debug.py | File | 6.15 KB | 0644 |
|
| defaults.py | File | 1.24 KB | 0644 |
|
| environment.py | File | 60.07 KB | 0644 |
|
| exceptions.py | File | 4.95 KB | 0644 |
|
| ext.py | File | 31.13 KB | 0644 |
|
| filters.py | File | 53.92 KB | 0644 |
|
| idtracking.py | File | 10.31 KB | 0644 |
|
| lexer.py | File | 29.15 KB | 0644 |
|
| loaders.py | File | 23.49 KB | 0644 |
|
| meta.py | File | 4.29 KB | 0644 |
|
| nativetypes.py | File | 4.11 KB | 0644 |
|
| nodes.py | File | 33.83 KB | 0644 |
|
| optimizer.py | File | 1.61 KB | 0644 |
|
| parser.py | File | 39.44 KB | 0644 |
|
| py.typed | File | 0 B | 0644 |
|
| runtime.py | File | 33.45 KB | 0644 |
|
| sandbox.py | File | 14.72 KB | 0644 |
|
| tests.py | File | 5.79 KB | 0644 |
|
| utils.py | File | 23.63 KB | 0644 |
|
| visitor.py | File | 3.47 KB | 0644 |
|