From 47163264105d7407242dc5a879d49613379af30b Mon Sep 17 00:00:00 2001 From: Thomas Oettli Date: Tue, 3 Nov 2020 14:45:55 +0100 Subject: [PATCH] add class Rule to configure FileManager --- .config.py.swp | Bin 12288 -> 0 bytes pyinotifyd.py | 59 +++++++++++++++++++++++++++++-------------------- 2 files changed, 35 insertions(+), 24 deletions(-) delete mode 100644 .config.py.swp diff --git a/.config.py.swp b/.config.py.swp deleted file mode 100644 index 11cb0a2f4008cabb9cc2d554a7f4d94b31155ae4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2%Wl&^6o#iPxCjaeUSR47Z)>^zb=278tNXCOz#F#?+=40mO*Fe>24f# zg09vd{xuf^NB{{OmcTSwn7>j=U1pUTdhx>AVGS`K2_OL^fCP{L5@CM`~-ahJp~m(1<;SPgnS3R1-YO$$OajpOQ4gWAJc?<0lfpg2E70=&~1T0z{)l#YO2hxk5MUD)59Nup%l!}CG5eiMIHJr6Z z-CAqd%5^FIFPtGV@ zZCdpMGo6;XQavD2sa5Z1j-%>!YpC6BSWUAsky0^NOxxVC+u7A_-Y9;cWw~iC+vbF0 zdBtj(&fR7$iwSLVZ=)3rYiG@$w3cnVS-Ul1yId}tt=4#Yd=lW>-Gr;A!WYnM`8*6; zIn1Qs@sJITt15MS-k!6i37>AJ=PhDAzNHjNnrbugWPj$Bl1e4a8_zqkucbYec7l+L z{N#B-B8(~v1&33Tt^uDa#Oo|#U7i#Y_)3M5edfp1O*oT0PlvOYR$wUis`e_BksTN~ zX<1V|A)SQ7hLwli8*L_dTJe$&0~s&rLF7QMlf=DjN(|arSfN|=5y>q^J|b~*pT~up ztGiCxTv1OaG7oL;W-)F|1Zpl5GVx`G9Uxg}E|_qqM+Yyul$#W@q$) TNc46P={(w?{UO}Nj~2*p5~^X) diff --git a/pyinotifyd.py b/pyinotifyd.py index cd3b32a..84f35ea 100755 --- a/pyinotifyd.py +++ b/pyinotifyd.py @@ -244,45 +244,56 @@ class Watch: return pyinotify.AsyncioNotifier(wm, loop, default_proc_fun=handler) +class Rule: + valid_actions = ["copy", "move", "delete"] + + def __init__(self, action, src_re, dst_re="", auto_create=False, + rec=False): + + assert action in self.valid_actions, \ + f"action: expected [{Rule.valid_actions.join(', ')}], got{action}" + self.action = action + self.src_re = re.compile(src_re) + assert isinstance(dst_re, str), \ + f"dst_re: expected {type('')}, got {type(dst_re)}" + self.dst_re = dst_re + assert isinstance(auto_create, bool), \ + f"auto_create: expected {type(bool)}, got {type(auto_create)}" + self.auto_create = auto_create + assert isinstance(rec, bool), \ + f"rec: expected {type(bool)}, got {type(rec)}" + self.rec = rec + + class FileManager: - def __init__(self, rules, auto_create=True, rec=False, - logname="FileManager"): - self._rules = [] + def __init__(self, rules, logname="FileManager"): if not isinstance(rules, list): rules = [rules] for rule in rules: - if rule["action"] in ["copy", "move"]: - self._rules.append((rule["action"], - re.compile(rule["src_re"]), - rule["dst_re"])) - elif rule["action"] == "delete": - self._rules.append( - (rule["action"], re.compile(rule["src_re"]))) - else: - raise ValueError(f"invalid action type: {rule['action']}") + assert isinstance(rule, Rule), \ + f"rules: expected {type(Rule)}, got {type(rule)}" - self._auto_create = auto_create - self._rec = rec + self._rules = rules self._log = logging.getLogger(logname) + def add_rule(self, *args, **kwargs): + self._rules.append(Rule(*args, **kwargs)) + async def task(self, event, task_id): path = event.pathname match = None for rule in self._rules: - src_re = rule[1] - match = src_re.match(path) + match = rule.src_re.match(path) if match: break if match is not None: - action = rule[0] try: - if action in ["copy", "move"]: - dst_re = rule[2] - dest = src_re.sub(dst_re, path) + if rule.action in ["copy", "move"]: + dest = src_re.sub(rule.dst_re, path) dest_dir = os.path.dirname(dest) - if not os.path.isdir(dest_dir) and self._auto_create: + if not os.path.isdir(dest_dir) and rule.auto_create: self._log.info( f"{task_id}: create directory '{dest_dir}'") os.makedirs(dest_dir) @@ -301,11 +312,11 @@ class FileManager: else: os.rename(path, dest) - elif action == "delete": + elif rule.action == "delete": self._log.info( - f"{task_id}: {action} '{path}'") + f"{task_id}: delete '{path}'") if os.path.isdir(path): - if self._rec: + if rule.rec: shutil.rmtree(path) else: shutil.rmdir(path)