import os import logging import ostools _datadir = ostools.getDataDir() PchumLog = logging.getLogger('pchumLogger') class ScriptQuirks(object): def __init__(self): self._datadir = ostools.getDataDir() self.home = os.getcwd() self.quirks = {} self.last = {} self.scripts = [] #self.load() def loadModule(self, name, filename): raise Exception def modHas(self, module, attr): return False def loadAll(self): self.last = self.quirks.copy() self.quirks.clear() for script in self.scripts: PchumLog.info(script.getExtension()) script.load() #print script.quirks for q in script.quirks: self.quirks.update(script.quirks) for k in self.last: if k in self.quirks: if self.last[k] == self.quirks[k]: del self.quirks[k] #print self.quirks if hasattr(self, 'quirks'): # See https://stackoverflow.com/questions/12843099/python-logging-typeerror-not-all-arguments-converted-during-string-formatting reg_quirks = ('Registered quirks:', '(), '.join(self.quirks) + "()") PchumLog.info(reg_quirks) else: PchumLog.warning("Couldn't find any script quirks") def add(self, script): self.scripts.append(script) def load(self): self.last = self.quirks.copy() self.quirks.clear() extension = self.getExtension() filenames = [] if not os.path.exists(os.path.join(self.home, 'quirks')): os.makedirs(os.path.join(self.home, 'quirks'), exist_ok=True) for fn in os.listdir(os.path.join(self.home, 'quirks')): if fn.endswith(extension) and not fn.startswith('_'): filenames.append(os.path.join(self.home, 'quirks', fn)) if hasattr(self, '_datadir'): if not os.path.exists(os.path.join(self._datadir, 'quirks')): os.makedirs(os.path.join(self._datadir, 'quirks'), exist_ok=True) for fn in os.listdir(os.path.join(self._datadir, 'quirks')): if fn.endswith(extension) and not fn.startswith('_'): filenames.append(os.path.join(self._datadir, 'quirks', fn)) modules = [] for filename in filenames: extension_length = len(self.getExtension()) name = os.path.basename(filename)[:-extension_length] try: module = self.loadModule(name, filename) if module is None: continue except Exception as e: PchumLog.warning("Error loading %s: %s (in quirks.py)" % (os.path.basename(name), e)) else: if self.modHas(module, 'setup'): module.setup() if self.modHas(module, 'commands'): self.register(module) modules.append(name) for k in self.last: if k in self.quirks: if self.last[k] == self.quirks[k]: del self.quirks[k] def funcre(self): if not hasattr(self, 'quirks'): return r"\\[0-9]+" f = r"(" for q in self.quirks: f = f + q+r"\(|" f = f + r"\)|\\[0-9]+)" return f