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:
Ben
2019-05-29 22:58:10 +01:00
parent 3c09434012
commit 8d6e726f97
9 changed files with 298 additions and 243 deletions

View File

@@ -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!')

View 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!')

View File

@@ -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!')