"""Poll for changes in the files within a directory."""from__future__importannotationsimportloggingfrompathlibimportPathMAGIC_NUMBER=3DirHash=dict[Path,float]# how a folder's "hash" is represented_logger=logging.getLogger(__name__)
[docs]defrules_changed(directory:Path,old_files_hash:DirHash)->tuple[bool,DirHash]:"""Check if directory's contents have changed."""ifdirectory.is_dir():new_files_hash={f:f.stat().st_mtimeforfindirectory.iterdir()}changed=old_files_hash.keys()!=new_files_hash.keys()ifnotchanged:forkinold_files_hash.keys()&new_files_hash.keys():ifold_files_hash[k]!=new_files_hash[k]:changed=Truebreakifchanged:_logger.debug("Refreshing Rules due to changes")returnTrue,new_files_hashreturnFalse,old_files_hash
[docs]defload_rules(directory:Path,files_hash:DirHash)->list[list[str]]:"""Load up rules from a directory."""rules=[]forfiniter(files_hash):rule=[]with(directory/f).open()asrule_file:fornum,rawinenumerate(rule_file):line=raw.strip()ifnum==MAGIC_NUMBER:rule.extend(line.split(","))else:rule.append(line)rules.append(rule)returnrules