From 50d0dbef792319e5aeaf76136b77e1f7a457083f Mon Sep 17 00:00:00 2001 From: Thomas Oettli Date: Fri, 12 Aug 2022 09:16:27 +0200 Subject: [PATCH] fix global variable handling in config --- pyinotifyd/__init__.py | 10 +++++----- pyinotifyd/scheduler.py | 21 +++++++++++++++------ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/pyinotifyd/__init__.py b/pyinotifyd/__init__.py index afde0bb..5bb94d2 100755 --- a/pyinotifyd/__init__.py +++ b/pyinotifyd/__init__.py @@ -203,12 +203,12 @@ class Pyinotifyd: config = {} name = Pyinotifyd.name exec("from logging import DEBUG, INFO, WARNING, ERROR, CRITICAL", - {}, config) - exec(f"from {name} import Pyinotifyd, Watch", {}, config) - exec(f"from {name} import setLoglevel, enableSyslog", {}, config) - exec(f"from {name}.scheduler import *", {}, config) + config) + exec(f"from {name} import Pyinotifyd, Watch", config) + exec(f"from {name} import setLoglevel, enableSyslog", config) + exec(f"from {name}.scheduler import *", config) with open(config_file, "r") as fh: - exec(fh.read(), {}, config) + exec(fh.read(), config) instance = config[f"{name}"] assert isinstance(instance, Pyinotifyd), \ f"{name}: expected {type(Pyinotifyd)}, " \ diff --git a/pyinotifyd/scheduler.py b/pyinotifyd/scheduler.py index 116df5a..96c8509 100755 --- a/pyinotifyd/scheduler.py +++ b/pyinotifyd/scheduler.py @@ -46,13 +46,13 @@ class SchedulerLogger(logging.LoggerAdapter): class TaskScheduler: class TaskState: - def __init__(self, id=None, task=None, cancelable=True): - self.id = id or str(uuid4()) + def __init__(self, task_id=None, task=None, cancelable=True): + self.id = task_id or str(uuid4()) self.task = task self.cancelable = cancelable def __init__(self, job, files=True, dirs=False, delay=0, logname="sched", - loop=None): + loop=None, global_vars={}): assert iscoroutinefunction(job), \ f"job: expected coroutine, got {type(job)}" assert isinstance(files, bool), \ @@ -61,6 +61,8 @@ class TaskScheduler: f"dirs: expected {type(bool)}, got {type(dirs)}" assert isinstance(delay, int), \ f"delay: expected {type(int)}, got {type(delay)}" + assert isinstance(global_vars, dict), \ + f"global_vars: expected {type(dict)}, got {type(global_vars)}" self._job = job self._files = files @@ -68,7 +70,7 @@ class TaskScheduler: self._delay = delay self._log = logging.getLogger((logname or __name__)) self._loop = (loop or asyncio.get_event_loop()) - + self._globals = global_vars self._tasks = {} self._pause = False @@ -124,9 +126,16 @@ class TaskScheduler: return logger.info("start task") + if self._globals: + local_vars = {"self": self, + "event": event, + "task_id": task_state.id} + task_state.task = self._loop.create_task( + eval("self._job(event, task_id)", self._globals, local_vars)) - task_state.task = self._loop.create_task( - self._job(event, task_state.id)) + else: + task_state.task = self._loop.create_task( + self._job(event, task_state.id)) try: task_state.cancelable = False