urban-investment-research/jurigged/loop/__init__.py

65 lines
1.4 KiB
Python
Raw Normal View History

2023-03-13 16:27:35 +08:00
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.__ = __