rework EventMap
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|
||||||
self._log.debug(
|
task_state.waiting = False
|
||||||
|
|
||||||
|
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()
|
||||||
|
|||||||
Reference in New Issue
Block a user