Forking what is left of ZeroNet and hopefully adding an AT Proto Frontend/Proxy
at main 69 lines 2.4 kB view raw
1import logging 2import time 3import os 4 5from Config import config 6 7if config.debug and config.action == "main": 8 try: 9 import watchdog 10 import watchdog.observers 11 import watchdog.events 12 logging.debug("Watchdog fs listener detected, source code autoreload enabled") 13 enabled = True 14 except Exception as err: 15 logging.debug("Watchdog fs listener could not be loaded: %s" % err) 16 enabled = False 17else: 18 enabled = False 19 20 21class DebugReloader: 22 def __init__(self, paths=None): 23 if not paths: 24 paths = ["src", "plugins", config.data_dir + "/__plugins__"] 25 self.log = logging.getLogger("DebugReloader") 26 self.last_chaged = 0 27 self.callbacks = [] 28 if enabled: 29 self.observer = watchdog.observers.Observer() 30 event_handler = watchdog.events.FileSystemEventHandler() 31 event_handler.on_modified = event_handler.on_deleted = self.onChanged 32 event_handler.on_created = event_handler.on_moved = self.onChanged 33 for path in paths: 34 if not os.path.isdir(path): 35 continue 36 self.log.debug("Adding autoreload: %s" % path) 37 self.observer.schedule(event_handler, path, recursive=True) 38 self.observer.start() 39 40 def addCallback(self, f): 41 self.callbacks.append(f) 42 43 def onChanged(self, evt): 44 path = evt.src_path 45 ext = path.rsplit(".", 1)[-1] 46 if ext not in ["py", "json"] or "Test" in path or time.time() - self.last_chaged < 1.0: 47 return False 48 self.last_chaged = time.time() 49 if os.path.isfile(path): 50 time_modified = os.path.getmtime(path) 51 else: 52 time_modified = 0 53 self.log.debug("File changed: %s reloading source code (modified %.3fs ago)" % (evt, time.time() - time_modified)) 54 if time.time() - time_modified > 5: # Probably it's just an attribute change, ignore it 55 return False 56 57 time.sleep(0.1) # Wait for lock release 58 for callback in self.callbacks: 59 try: 60 callback() 61 except Exception as err: 62 self.log.exception(err) 63 64 def stop(self): 65 if enabled: 66 self.observer.stop() 67 self.log.debug("Stopped autoreload observer") 68 69watcher = DebugReloader()