rework EventMap

This commit is contained in:
2020-11-08 05:19:03 +01:00
parent 1427901ed1
commit 22b69cbb00
2 changed files with 27 additions and 18 deletions

View File

@@ -60,8 +60,8 @@ class EventMap(ProcessEvent):
**pyinotify.EventsCodes.OP_FLAGS, **pyinotify.EventsCodes.OP_FLAGS,
**pyinotify.EventsCodes.EVENT_FLAGS} **pyinotify.EventsCodes.EVENT_FLAGS}
def __init__(self, event_map=None, default_task=None, *args, **kwargs): def my_init(self, event_map=None, default_task=None):
super().__init__(*args, *kwargs) self._map = {}
if default_task is not None: if default_task is not None:
for flag in EventMap.flags: for flag in EventMap.flags:
@@ -71,9 +71,10 @@ class EventMap(ProcessEvent):
assert isinstance(event_map, dict), \ assert isinstance(event_map, dict), \
f"event_map: expected {type(dict)}, got {type(event_map)}" f"event_map: expected {type(dict)}, got {type(event_map)}"
for flag, tasks in event_map.items(): for flag, tasks in event_map.items():
self.set(flag, tasks) self.set_task(flag, tasks)
def set(self, flag, tasks):
def set_task(self, flag, tasks):
assert flag in EventMap.flags, \ assert flag in EventMap.flags, \
f"event_map: invalid flag: {flag}" f"event_map: invalid flag: {flag}"
if tasks is not None: if tasks is not None:
@@ -86,10 +87,16 @@ class EventMap(ProcessEvent):
task = Task(task) task = Task(task)
task_instances.append(task) task_instances.append(task)
setattr(self, f"process_{flag}", _TaskList(task_instances).execute) self._map[flag] = _TaskList(task_instances).execute
elif hasattr(self, flag): elif flag in self._map:
delattr(self, f"process_{flag}") del self._map[flag]
def process_default(self, event):
logging.debug(f"received {event}")
maskname = event.maskname.split("|")[0]
if maskname in self._map:
self._map[maskname](event)
class Watch: class Watch:
@@ -101,7 +108,8 @@ class Watch:
if isinstance(event_map, EventMap): if isinstance(event_map, EventMap):
self._event_map = event_map self._event_map = event_map
else: else:
self._event_map = EventMap(event_map, default_task) self._event_map = EventMap(
event_map=event_map, default_task=default_task)
assert isinstance(rec, bool), \ assert isinstance(rec, bool), \
f"rec: expected {type(bool)}, got {type(rec)}" f"rec: expected {type(bool)}, got {type(rec)}"
@@ -149,7 +157,7 @@ class Pyinotifyd:
config = {} config = {}
name = Pyinotifyd.name name = Pyinotifyd.name
exec("import logging", {}, config) exec("import logging", {}, config)
exec(f"from {name} import Pyinotifyd, EventMap, Watch", {}, config) exec(f"from {name} import Pyinotifyd, Watch", {}, config)
exec(f"from {name}.scheduler import *", {}, config) exec(f"from {name}.scheduler import *", {}, config)
with open(config_file, "r") as fh: with open(config_file, "r") as fh:
exec(fh.read(), {}, config) exec(fh.read(), {}, config)

View File

@@ -72,7 +72,7 @@ class Cancel(Task):
class _TaskState: class _TaskState:
task_id: str = "" task_id: str = ""
task: asyncio.Task = None task: asyncio.Task = None
waiting: bool = False waiting: bool = True
class TaskScheduler(Task): class TaskScheduler(Task):
@@ -97,17 +97,14 @@ class TaskScheduler(Task):
async def _schedule_task(self, event, task_id, task_state): async def _schedule_task(self, event, task_id, task_state):
if self._delay > 0: if self._delay > 0:
task_state.waiting = True
self._log.debug(
f"schedule task ({_event_to_str(event)}, "
f"task_id={task_id}, delay={self._delay})")
await asyncio.sleep(self._delay) await asyncio.sleep(self._delay)
task_state.waiting = False task_state.waiting = False
self._log.debug( self._log.info(
f"start task ({_event_to_str(event)}, task_id={task_id})") f"start task ({_event_to_str(event)}, task_id={task_id})")
await self._delayed_task(event, task_id) await self._delayed_task(event, task_id)
self._log.debug( self._log.info(
f"task finished ({_event_to_str(event)}, task_id={task_id})") f"task finished ({_event_to_str(event)}, task_id={task_id})")
del self._tasks[event.pathname] del self._tasks[event.pathname]
@@ -122,13 +119,17 @@ class TaskScheduler(Task):
task_state.task_id, task_state.task = super().start( task_state.task_id, task_state.task = super().start(
event, task_state, *args, **kwargs) event, task_state, *args, **kwargs)
self._tasks[event.pathname] = task_state self._tasks[event.pathname] = task_state
if self._delay > 0:
self._log.info(
f"schedule task ({_event_to_str(event)}, "
f"task_id={task_state.task_id}, delay={self._delay})")
def cancel(self, event): def cancel(self, event):
if event.pathname in self._tasks: if event.pathname in self._tasks:
task_state = self._tasks[event.pathname] task_state = self._tasks[event.pathname]
if task_state.waiting: if task_state.waiting:
self._log.debug( self._log.info(
f"cancel task ({_event_to_str(event)}, " f"cancel task ({_event_to_str(event)}, "
f"task_id={task_state.task_id})") f"task_id={task_state.task_id})")
task_state.task.cancel() task_state.task.cancel()