65 lines
1.4 KiB
Python
65 lines
1.4 KiB
Python
import builtins
|
|
import functools
|
|
from types import SimpleNamespace
|
|
|
|
from giving import give, given
|
|
|
|
from .basic import BasicDeveloopRunner
|
|
from .develoop import Develoop, DeveloopRunner, RedirectDeveloopRunner
|
|
|
|
|
|
def keyword_decorator(deco):
|
|
"""Wrap a decorator to optionally takes keyword arguments."""
|
|
|
|
@functools.wraps(deco)
|
|
def new_deco(fn=None, **kwargs):
|
|
if fn is None:
|
|
|
|
@functools.wraps(deco)
|
|
def newer_deco(fn):
|
|
return deco(fn, **kwargs)
|
|
|
|
return newer_deco
|
|
else:
|
|
return deco(fn, **kwargs)
|
|
|
|
return new_deco
|
|
|
|
|
|
@keyword_decorator
|
|
def loop(fn, interface=None, only_on_error=False):
|
|
if interface is None:
|
|
try:
|
|
import rich
|
|
|
|
interface = "rich"
|
|
except ModuleNotFoundError:
|
|
interface = "basic"
|
|
|
|
if interface == "rich":
|
|
from .richloop import RichDeveloopRunner
|
|
|
|
interface = RichDeveloopRunner
|
|
elif interface == "basic":
|
|
interface = BasicDeveloopRunner
|
|
elif isinstance(interface, str):
|
|
raise Exception(f"Unknown develoop interface: '{interface}'")
|
|
|
|
return Develoop(fn, on_error=only_on_error, runner_class=interface)
|
|
|
|
|
|
loop_on_error = functools.partial(loop, only_on_error=True)
|
|
xloop = loop_on_error
|
|
|
|
__ = SimpleNamespace(
|
|
loop=loop,
|
|
loop_on_error=loop_on_error,
|
|
xloop=xloop,
|
|
give=give,
|
|
given=given,
|
|
)
|
|
|
|
|
|
def inject():
|
|
builtins.__ = __
|