Skip to content

Commit

Permalink
Merge pull request #58 from da-h/event_register_in_event
Browse files Browse the repository at this point in the history
Dynamic Event Registration
  • Loading branch information
da-h authored and David Hartmann committed Jan 4, 2021
2 parents 4b4614c + cbef924 commit 260e362
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 14 deletions.
20 changes: 8 additions & 12 deletions src/miniflask/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def __getattr__(self, name): # noqa: C901 too-complex pylint: disable=too-many

# fn_wrap_scope creates a function wrap of fn that passes also state and event of eobj
# additionally, if outervar is defined as a default, it queries that from the last outer scope
def fn_wrap_scope(fn, _state, _event, module, needed_locals=None, miniflask_args=None, skip_twice=False, call_before_after=call_before_after): # pylint: disable=too-many-statements
def fn_wrap_scope(fn, _mf, _state, _event, module, needed_locals=None, miniflask_args=None, skip_twice=False, call_before_after=call_before_after): # pylint: disable=too-many-statements
del module # unused
if needed_locals is None:
needed_locals = []
Expand Down Expand Up @@ -96,15 +96,11 @@ def fn_wrap_scope(fn, _state, _event, module, needed_locals=None, miniflask_args
fn_before = getattr(self._mf.event, name_before) if has_before else None

# get index of "state" / "event"
if len(arg_names) > 0:
if arg_names[0] == "state":
miniflask_args.append(_state)
if len(arg_names) > 1 and arg_names[1] == "event":
miniflask_args.append(_event)
elif arg_names[0] == "event":
miniflask_args.append(_event)
if len(arg_names) > 1 and arg_names[1] == "state":
miniflask_args.append(_state)
for i in range(min(len(arg_names), 3)):
for var, varname in [(_mf, "mf"), (_state, "state"), (_event, "event")]:
if arg_names[i] == varname:
miniflask_args.append(var)
break

# if no outervar found, just pass state and event
if len(needed_locals) > 0:
Expand Down Expand Up @@ -147,15 +143,15 @@ def fn_wrap(*args, altfn=None, **kwargs):
return fn_wrap, has_signature, miniflask_args

if eobj.unique:
fn_wrap, has_signature, mf_args = fn_wrap_scope(eobj.fn, eobj.modules.state, eobj.modules.event, eobj.modules)
fn_wrap, has_signature, mf_args = fn_wrap_scope(eobj.fn, eobj.modules, eobj.modules.state, eobj.modules.event, eobj.modules)
if has_signature:
setattr(fn_wrap, 'mf_modules', [eobj.modules.module_id])
setattr(fn_wrap, 'subevents', [fn_wrap])
setattr(fn_wrap, 'fns', [eobj.fn])
setattr(fn_wrap, 'fns_args', [mf_args])
else:
def multiple_fn_wrap_scope(orig_fns, modules=eobj.modules):
fns, have_signature, mf_args = zip(*[fn_wrap_scope(fn, _state=module.state, _event=module.event, module=module, skip_twice=True) for fn, module in zip(orig_fns, modules)])
fns, have_signature, mf_args = zip(*[fn_wrap_scope(fn, _mf=module, _state=module.state, _event=module.event, module=module, skip_twice=True) for fn, module in zip(orig_fns, modules)])

def fn_wrap(*args, altfn=None, **kwargs):
del altfn # unused
Expand Down
20 changes: 18 additions & 2 deletions src/miniflask/miniflask.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ def __init__(self, module_dirs, debug=False):
self.modules_loaded = {}
self.modules_ignored = []
self.modules_avail = getModulesAvail(self.module_dirs)
self.miniflask_objs = {} # local modified versions of miniflask
registerPredefined(self.modules_avail)
self._varid_list = []
self._recently_loaded = []
Expand Down Expand Up @@ -892,8 +891,25 @@ def load(self, module_name, as_id=None, auto_query=True, **kwargs):
del kwargs["verbose"]
super().load(module_name, verbose=False, auto_query=auto_query, as_id=as_id, **kwargs)

# overwrite state defaults
def unregister_event(self, name, only_cache):
if hasattr(self.event, name):
delattr(self.event, name)
if not only_cache and name in self.event_objs:
del self.event_objs[name]
if "before_" + name in self.event_objs:
self.unregister_event("before_" + name, only_cache)
if "after_" + name in self.event_objs:
self.unregister_event("after_" + name, only_cache)

# define event
def register_event(self, name, fn, **kwargs):
self.unregister_event(name, only_cache=True)
self._defined_events[name] = fn
super().register_event(name, fn, **kwargs)

# overwrite event definition
def overwrite_event(self, name, fn, **kwargs):
self.unregister_event(name, only_cache=False)
self._defined_events[name] = fn
super().register_event(name, fn, **kwargs)

Expand Down
Empty file.
21 changes: 21 additions & 0 deletions tests/test_event/modules/register_event_during_event/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@

def test(i):
print("test", i)


def add_test(mf):
def add_test_print(i):
print("added to test", i)
mf.register_event("test", add_test_print)


def main(event):
event.test(0)
event.add_test()
event.test(1)


def register(mf):
mf.register_event("test", test)
mf.register_event("add_test", add_test)
mf.register_event("main", main)
18 changes: 18 additions & 0 deletions tests/test_event/test_register_event_during_event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from pathlib import Path
import miniflask # noqa: E402


def init_mf():
return miniflask.init(module_dirs=str(Path(__file__).parent / "modules"), debug=True)


def test_register_event_during_event(capsys):
mf = init_mf()
mf.run(argv=[], modules=["register_event_during_event"])
captured = capsys.readouterr()
out = """
test 0
test 1
added to test 1
"""
assert out in captured.out

0 comments on commit 260e362

Please sign in to comment.