Forking what is left of ZeroNet and hopefully adding an AT Proto Frontend/Proxy
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()