diff --git a/lib/tfw/components/source_code_event_handler.py b/lib/tfw/components/source_code_event_handler.py index 5ff61e8..760b28b 100644 --- a/lib/tfw/components/source_code_event_handler.py +++ b/lib/tfw/components/source_code_event_handler.py @@ -1,5 +1,7 @@ from os.path import isfile, join, relpath, exists, isdir from glob import glob +from fnmatch import fnmatchcase +from collections import Iterable from tfw.event_handler_base import TriggerlessEventHandler from tfw.components.directory_monitor import DirectoryMonitor @@ -10,10 +12,19 @@ log = logging.getLogger(__name__) class FileManager: def __init__(self, working_directory, selected_file=None, exclude=None): - self.exclude = exclude if exclude is not None else [] - self._workdir = None - self.workdir = working_directory - self.filename = selected_file or self.files[0] + self._exclude, self.exclude = None, exclude + self._workdir, self.workdir = None, working_directory + self._filename, self.filename = None, selected_file or self.files[0] + + @property + def exclude(self): + return self._exclude + + @exclude.setter + def exclude(self, exclude): + if exclude is None: return + if not isinstance(exclude, Iterable): raise TypeError('Exclude must be Iterable!') + self._exclude = exclude @property def workdir(self): @@ -25,16 +36,21 @@ class FileManager: raise EnvironmentError('"{}" is not a directory!'.format(directory)) self._workdir = directory - def select_file(self, filename): + @property + def filename(self): + return self._filename + + @filename.setter + def filename(self, filename): if not filename in self.files: raise EnvironmentError('No such file in workdir!') - self.filename = filename + self._filename = filename @property def files(self): return [self._relpath(file) for file in glob(join(self._workdir, '**/*'), recursive=True) if isfile(file) and - not any(word in file for word in self.exclude)] + not any(fnmatchcase(file, blacklisted) for blacklisted in self.exclude)] @property def file_contents(self): @@ -61,7 +77,8 @@ class SourceCodeEventHandler(TriggerlessEventHandler): self.commands = {'read': self.read, 'write': self.write, 'select': self.select, - 'selectdir': self.select_dir} + 'selectdir': self.select_dir, + 'exclude': self.exclude} self._monitor = None self.reload_monitor() @@ -92,7 +109,7 @@ class SourceCodeEventHandler(TriggerlessEventHandler): return data def select(self, data): - try: self.filemanager.select_file(data['filename']) + try: self.filemanager.filename = data['filename'] except EnvironmentError: log.exception('Failed to select file "{}"'.format(data['filename'])) return data @@ -101,7 +118,7 @@ class SourceCodeEventHandler(TriggerlessEventHandler): self.filemanager.workdir = data['directory'] self.reload_monitor() try: - self.filemanager.select_file(self.filemanager.files[0]) + self.filemanager.filename = self.filemanager.files[0] self.read(data) except IndexError: data['content'] = 'No files in this directory :(' @@ -109,6 +126,11 @@ class SourceCodeEventHandler(TriggerlessEventHandler): log.error('Failed to select directory "{}"'.format(data['directory'])) return data + def exclude(self, data): + try: self.filemanager.exclude = list(data['exclude']) + except TypeError: log.error('Exclude must be Iterable!') + return data + def attach_fileinfo(self, data): data['filename'] = self.filemanager.filename data['files'] = self.filemanager.files diff --git a/lib/tfw/networking/controller_connector.py b/lib/tfw/networking/controller_connector.py index dcafa70..5646b8d 100644 --- a/lib/tfw/networking/controller_connector.py +++ b/lib/tfw/networking/controller_connector.py @@ -1,12 +1,9 @@ import zmq -from zmq.eventloop import ioloop from zmq.eventloop.zmqstream import ZMQStream from tfw.config import tfwenv from tfw.networking.zmq_connector_base import ZMQConnectorBase -ioloop.install() - class ControllerConnector(ZMQConnectorBase): def __init__(self, zmq_context=None): diff --git a/lib/tfw/networking/solvable_connector.py b/lib/tfw/networking/solvable_connector.py index a207a21..0225b39 100644 --- a/lib/tfw/networking/solvable_connector.py +++ b/lib/tfw/networking/solvable_connector.py @@ -1,12 +1,9 @@ import zmq -from zmq.eventloop import ioloop from tfw.config import tfwenv from tfw.networking.zmq_connector_base import ZMQConnectorBase from tfw.networking.serialization import serialize_all, deserialize_all -ioloop.install() - class SolvableConnector(ZMQConnectorBase): def __init__(self, zmq_context=None): diff --git a/requirements.txt b/requirements.txt index e057890..cdc46e3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -tornado==4.5.3 -pyzmq==16.0.4 +tornado==5.0 +pyzmq==17.0.0 transitions==0.6.4 terminado==0.8.1 watchdog==0.8.3 diff --git a/src/demo/event_handler_main.py b/src/demo/event_handler_main.py index 730cf18..430b93b 100644 --- a/src/demo/event_handler_main.py +++ b/src/demo/event_handler_main.py @@ -40,7 +40,7 @@ toggle_next.button_state = False if __name__ == '__main__': - ide = SourceCodeEventHandler(key='webide', directory=tfwenv.WEBIDE_WD, exclude=['__pycache__']) + ide = SourceCodeEventHandler(key='webide', directory=tfwenv.WEBIDE_WD, exclude=['*.pyc']) terminado = TerminadoEventHandler(key='shell') terminado.historymonitor.subscribe_callback(cenator) terminado.historymonitor.subscribe_callback(selectdir)