mirror of
https://github.com/solero/houdini.git
synced 2025-10-15 11:58:16 +00:00
Move plugins, commands and listeners into their own "manager" objects
Works just like before, only the logic is stored in the objects themselves instead of being scattered around houdini.py
This commit is contained in:
@@ -1,81 +0,0 @@
|
||||
import sys
|
||||
import importlib
|
||||
import copy
|
||||
from watchdog.events import FileSystemEventHandler
|
||||
|
||||
from houdini.handlers import listeners_from_module, remove_handlers_by_module
|
||||
from houdini.events import evaluate_handler_file_event
|
||||
|
||||
|
||||
class HandlerFileEventHandler(FileSystemEventHandler):
|
||||
|
||||
def __init__(self, server):
|
||||
self.logger = server.logger
|
||||
self.server = server
|
||||
|
||||
def on_created(self, event):
|
||||
handler_module_details = evaluate_handler_file_event(event)
|
||||
|
||||
if not handler_module_details:
|
||||
return
|
||||
|
||||
handler_module_path, handler_module = handler_module_details
|
||||
|
||||
if '__init__.py' in handler_module_path:
|
||||
return
|
||||
|
||||
self.logger.debug('New handler module detected %s', handler_module)
|
||||
|
||||
try:
|
||||
module = importlib.import_module(handler_module)
|
||||
listeners_from_module(self.server.xt_listeners, self.server.xml_listeners, module)
|
||||
except Exception as import_error:
|
||||
self.logger.error('%s detected in %s, not importing.', import_error.__class__.__name__, handler_module)
|
||||
|
||||
def on_deleted(self, event):
|
||||
handler_module_details = evaluate_handler_file_event(event)
|
||||
|
||||
if not handler_module_details:
|
||||
return
|
||||
|
||||
handler_module_path, handler_module = handler_module_details
|
||||
|
||||
if handler_module not in sys.modules:
|
||||
return
|
||||
|
||||
self.logger.debug('Deleting listeners registered by %s...', handler_module)
|
||||
|
||||
remove_handlers_by_module(self.server.xt_listeners, self.server.xml_listeners, handler_module_path)
|
||||
|
||||
def on_modified(self, event):
|
||||
handler_module_details = evaluate_handler_file_event(event)
|
||||
|
||||
if not handler_module_details:
|
||||
return
|
||||
|
||||
handler_module_path, handler_module = handler_module_details
|
||||
|
||||
if handler_module not in sys.modules:
|
||||
return False
|
||||
|
||||
self.logger.info('Reloading %s', handler_module)
|
||||
|
||||
xt_listeners, xml_listeners = copy.copy(self.server.xt_listeners), copy.copy(self.server.xml_listeners)
|
||||
|
||||
remove_handlers_by_module(self.server.xt_listeners, self.server.xml_listeners, handler_module_path)
|
||||
|
||||
handler_module_object = sys.modules[handler_module]
|
||||
|
||||
try:
|
||||
module = importlib.reload(handler_module_object)
|
||||
listeners_from_module(self.server.xt_listeners, self.server.xml_listeners, module)
|
||||
|
||||
self.logger.info('Successfully reloaded %s!', handler_module)
|
||||
except Exception as rebuild_error:
|
||||
self.logger.error('%s detected in %s, not reloading.', rebuild_error.__class__.__name__, handler_module)
|
||||
self.logger.info('Restoring handler references...')
|
||||
|
||||
self.server.xt_listeners = xt_listeners
|
||||
self.server.xml_listeners = xml_listeners
|
||||
|
||||
self.logger.info('Handler references restored. Phew!')
|
89
houdini/events/listener_file_event.py
Normal file
89
houdini/events/listener_file_event.py
Normal file
@@ -0,0 +1,89 @@
|
||||
import sys
|
||||
import importlib
|
||||
import logging
|
||||
from watchdog.events import FileSystemEventHandler
|
||||
|
||||
from houdini.events import evaluate_listener_file_event
|
||||
|
||||
|
||||
class ListenerFileEventHandler(FileSystemEventHandler):
|
||||
|
||||
def __init__(self, server):
|
||||
self.server = server
|
||||
self.logger = logging.getLogger('houdini')
|
||||
|
||||
def on_created(self, event):
|
||||
listener_module_details = evaluate_listener_file_event(event)
|
||||
|
||||
if not listener_module_details:
|
||||
return
|
||||
|
||||
listener_module_path, listener_module = listener_module_details
|
||||
|
||||
if '__init__.py' in listener_module_path:
|
||||
return
|
||||
|
||||
self.logger.debug('New handler module detected %s', listener_module)
|
||||
|
||||
try:
|
||||
module = importlib.import_module(listener_module)
|
||||
self.server.xt_listeners.load(module)
|
||||
self.server.xml_listeners.load(module)
|
||||
except Exception as import_error:
|
||||
self.logger.error('%s detected in %s, not importing.', import_error.__class__.__name__, listener_module)
|
||||
|
||||
def on_deleted(self, event):
|
||||
listener_module_details = evaluate_listener_file_event(event)
|
||||
|
||||
if not listener_module_details:
|
||||
return
|
||||
|
||||
listener_module_path, listener_module = listener_module_details
|
||||
|
||||
if listener_module not in sys.modules:
|
||||
return
|
||||
|
||||
listener_module_object = sys.modules[listener_module]
|
||||
|
||||
self.logger.debug('Deleting listeners registered by %s...', listener_module)
|
||||
|
||||
self.server.xt_listeners.remove(listener_module_object)
|
||||
self.server.xml_listeners.remove(listener_module_object)
|
||||
|
||||
def on_modified(self, event):
|
||||
listener_module_details = evaluate_listener_file_event(event)
|
||||
|
||||
if not listener_module_details:
|
||||
return
|
||||
|
||||
listener_module_path, listener_module = listener_module_details
|
||||
|
||||
if listener_module not in sys.modules:
|
||||
return False
|
||||
|
||||
self.logger.info('Reloading %s', listener_module)
|
||||
|
||||
self.server.xt_listeners.backup()
|
||||
self.server.xml_listeners.backup()
|
||||
self.server.commands.backup()
|
||||
|
||||
listener_module_object = sys.modules[listener_module]
|
||||
|
||||
self.server.xt_listeners.remove(listener_module_object)
|
||||
self.server.xml_listeners.remove(listener_module_object)
|
||||
|
||||
try:
|
||||
module = importlib.reload(listener_module_object)
|
||||
self.server.xt_listeners.load(module)
|
||||
self.server.xml_listeners.load(module)
|
||||
|
||||
self.logger.info('Successfully reloaded %s!', listener_module)
|
||||
except Exception as rebuild_error:
|
||||
self.logger.error('%s detected in %s, not reloading.', rebuild_error.__class__.__name__, listener_module)
|
||||
self.logger.info('Restoring listeners...')
|
||||
|
||||
self.server.xt_listeners.restore()
|
||||
self.server.xml_listeners.restore()
|
||||
self.server.commands.restore()
|
||||
|
||||
self.logger.info('Listeners restored. Phew!')
|
@@ -1,36 +1,35 @@
|
||||
import sys
|
||||
import importlib
|
||||
import os.path
|
||||
import copy
|
||||
import logging
|
||||
import asyncio
|
||||
from watchdog.events import FileSystemEventHandler
|
||||
|
||||
from houdini.events import evaluate_handler_file_event
|
||||
from houdini.events import evaluate_plugin_file_event
|
||||
|
||||
|
||||
class PluginFileEventHandler(FileSystemEventHandler):
|
||||
|
||||
def __init__(self, server):
|
||||
self.logger = server.logger
|
||||
self.server = server
|
||||
self.logger = logging.getLogger('houdini')
|
||||
|
||||
def on_created(self, event):
|
||||
plugin_module_details = evaluate_handler_file_event(event)
|
||||
plugin_module_details = evaluate_plugin_file_event(event)
|
||||
|
||||
if not plugin_module_details:
|
||||
return
|
||||
|
||||
plugin_module_path, plugin_module = plugin_module_details
|
||||
|
||||
self.logger.debug('New handler module detected %s', plugin_module)
|
||||
self.logger.debug('New plugin detected %s', plugin_module)
|
||||
|
||||
try:
|
||||
plugin_module_object = importlib.import_module(plugin_module)
|
||||
plugin_class = plugin_module_object.__name__.split(".")[2]
|
||||
|
||||
asyncio.run(self.server.load_plugin((plugin_module_object, plugin_class)))
|
||||
self.server.plugin.load(plugin_module_object)
|
||||
|
||||
self.logger.info('New plugin \'%s\' has been loaded.' % plugin_class)
|
||||
self.logger.info('New plugin \'%s\' has been loaded.' % plugin_module)
|
||||
except Exception as import_error:
|
||||
self.logger.error('%s detected in %s, not importing.', import_error.__class__.__name__, plugin_module)
|
||||
|
||||
@@ -45,13 +44,11 @@ class PluginFileEventHandler(FileSystemEventHandler):
|
||||
self.logger.debug('Deleting listeners registered by %s.', plugin_module)
|
||||
|
||||
plugin_module_object = sys.modules[plugin_module]
|
||||
plugin_class = plugin_module_object.__name__.split(".")[2]
|
||||
|
||||
self.server.unload_plugin((plugin_module_object, plugin_class))
|
||||
self.server.plugins.remove(plugin_module_object)
|
||||
|
||||
def on_modified(self, event):
|
||||
plugin_module_details = evaluate_handler_file_event(event)
|
||||
|
||||
plugin_module_details = evaluate_plugin_file_event(event)
|
||||
if not plugin_module_details:
|
||||
return
|
||||
|
||||
@@ -63,24 +60,27 @@ class PluginFileEventHandler(FileSystemEventHandler):
|
||||
self.logger.info('Reloading %s', plugin_module)
|
||||
|
||||
plugin_module_object = sys.modules[plugin_module]
|
||||
plugin_class = plugin_module_object.__name__.split(".")[2]
|
||||
|
||||
xt_listeners, xml_listeners = copy.copy(self.server.xt_listeners), copy.copy(self.server.xml_listeners)
|
||||
self.server.xt_listeners.backup()
|
||||
self.server.xml_listeners.backup()
|
||||
self.server.commands.backup()
|
||||
|
||||
self.server.unload_plugin((plugin_module_object, plugin_class))
|
||||
self.server.plugins.remove(plugin_module_object)
|
||||
|
||||
try:
|
||||
new_plugin_module = importlib.reload(plugin_module_object)
|
||||
asyncio.run(self.server.load_plugin((new_plugin_module, plugin_class)))
|
||||
|
||||
self.server.plugins.load(new_plugin_module)
|
||||
|
||||
self.logger.info('Successfully reloaded %s!', plugin_module)
|
||||
except LookupError as lookup_error:
|
||||
self.logger.warn('Did not reload plugin \'%s\': %s.', plugin_class, lookup_error)
|
||||
self.logger.warning('Did not reload plugin \'%s\': %s.', plugin_module, lookup_error)
|
||||
except Exception as rebuild_error:
|
||||
self.logger.error('%s detected in %s, not reloading.', rebuild_error.__class__.__name__, plugin_module)
|
||||
self.logger.info('Restoring handler references...')
|
||||
|
||||
self.server.xt_handlers = xt_listeners
|
||||
self.server.xml_handlers = xml_listeners
|
||||
self.server.xt_listeners.restore()
|
||||
self.server.xml_listeners.restore()
|
||||
self.server.commands.restore()
|
||||
|
||||
self.logger.info('Restored handler references. Phew!')
|
||||
|
Reference in New Issue
Block a user