From a65d3127ba22c35d94e5461e250c7d62a3a2fe19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20T=C3=B3th?= Date: Sat, 14 Apr 2018 22:57:37 +0200 Subject: [PATCH] Refactor DirectoryMonitor managing code to a mixin --- .../directory_monitoring_event_handler.py | 20 +++----------- lib/tfw/components/webide_event_handler.py | 20 +++----------- lib/tfw/mixins/__init__.py | 1 + lib/tfw/mixins/monitor_manager_mixin.py | 27 +++++++++++++++++++ 4 files changed, 35 insertions(+), 33 deletions(-) create mode 100644 lib/tfw/mixins/monitor_manager_mixin.py diff --git a/lib/tfw/components/directory_monitoring_event_handler.py b/lib/tfw/components/directory_monitoring_event_handler.py index d34cf00..091b76e 100644 --- a/lib/tfw/components/directory_monitoring_event_handler.py +++ b/lib/tfw/components/directory_monitoring_event_handler.py @@ -5,17 +5,18 @@ from os.path import isdir, exists from tfw import TriggerlessEventHandler from tfw.config.logs import logging +from tfw.mixins import MonitorManagerMixin from .directory_monitor import DirectoryMonitor LOG = logging.getLogger(__name__) -class DirectoryMonitoringEventHandler(TriggerlessEventHandler): +class DirectoryMonitoringEventHandler(TriggerlessEventHandler, MonitorManagerMixin): def __init__(self, key, directory): super().__init__(key) self._directory = directory - self._monitor = None - self.reload_monitor() + MonitorManagerMixin.__init__(self, DirectoryMonitor, self._directory) + self.commands = {'pause': self.pause, 'resume': self.resume, 'ignore': self.ignore, @@ -31,19 +32,6 @@ class DirectoryMonitoringEventHandler(TriggerlessEventHandler): raise EnvironmentError('No such directory!') self._directory = directory - @property - def monitor(self): - return self._monitor - - def reload_monitor(self): - if self._monitor: - try: - self._monitor.stop() - except KeyError: - LOG.debug('Working directory was removed – ignoring...') - self._monitor = DirectoryMonitor(self._directory) - self._monitor.watch() # This runs on a separate thread - def handle_event(self, message): try: message['data'] = self.commands[message['data']['command']](message['data']) diff --git a/lib/tfw/components/webide_event_handler.py b/lib/tfw/components/webide_event_handler.py index abe9e21..9a007a2 100644 --- a/lib/tfw/components/webide_event_handler.py +++ b/lib/tfw/components/webide_event_handler.py @@ -7,6 +7,7 @@ from fnmatch import fnmatchcase from collections import Iterable from tfw import TriggerlessEventHandler +from tfw.mixins import MonitorManagerMixin from tfw.config.logs import logging from .directory_monitor import DirectoryMonitor @@ -90,12 +91,13 @@ class FileManager: # pylint: disable=too-many-instance-attributes return relpath(self._filepath(filename), start=self._workdir) -class WebideEventHandler(TriggerlessEventHandler): +class WebideEventHandler(TriggerlessEventHandler, MonitorManagerMixin): # pylint: disable=too-many-arguments def __init__(self, key, directory, allowed_directories, selected_file=None, exclude=None): super().__init__(key) self.filemanager = FileManager(allowed_directories=allowed_directories, working_directory=directory, selected_file=selected_file, exclude=exclude) + MonitorManagerMixin.__init__(self, DirectoryMonitor, self.filemanager.workdir) self.commands = {'read': self.read, 'write': self.write, @@ -103,22 +105,6 @@ class WebideEventHandler(TriggerlessEventHandler): 'selectdir': self.select_dir, 'exclude': self.exclude} - self._monitor = None - self.reload_monitor() - - @property - def monitor(self): - return self._monitor - - def reload_monitor(self): - if self._monitor: - try: - self._monitor.stop() - except KeyError: - LOG.debug('Working directory was removed – ignoring...') - self._monitor = DirectoryMonitor(self.filemanager.workdir) - self._monitor.watch() # This runs on a separate thread - def read(self, data): try: data['content'] = self.filemanager.file_contents diff --git a/lib/tfw/mixins/__init__.py b/lib/tfw/mixins/__init__.py index 0cf040e..60e67fc 100644 --- a/lib/tfw/mixins/__init__.py +++ b/lib/tfw/mixins/__init__.py @@ -4,3 +4,4 @@ from .supervisor_mixin import SupervisorMixin from .callback_mixin import CallbackMixin from .observer_mixin import ObserverMixin +from .monitor_manager_mixin import MonitorManagerMixin diff --git a/lib/tfw/mixins/monitor_manager_mixin.py b/lib/tfw/mixins/monitor_manager_mixin.py new file mode 100644 index 0000000..0c39725 --- /dev/null +++ b/lib/tfw/mixins/monitor_manager_mixin.py @@ -0,0 +1,27 @@ +# Copyright (C) 2018 Avatao.com Innovative Learning Kft. +# All Rights Reserved. See LICENSE file for details. + +from tfw.config.logs import logging + +LOG = logging.getLogger(__name__) + + +class MonitorManagerMixin: + def __init__(self, monitor_type, directory): + self._monitor_type = monitor_type + self._monitor = None + self._monitored_directory = directory + self.reload_monitor() + + @property + def monitor(self): + return self._monitor + + def reload_monitor(self): + if self._monitor: + try: + self._monitor.stop() + except KeyError: + LOG.debug('Working directory was removed – ignoring...') + self._monitor = self._monitor_type(self._monitored_directory) + self._monitor.watch() # This runs on a separate thread