From 3ae0995b9566274938ee5c158f0b9cdd44faaa59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20T=C3=B3th?= Date: Fri, 30 Mar 2018 17:50:20 +0200 Subject: [PATCH 1/2] Make project comply new coding standards and pylint --- lib/envvars.py | 2 +- lib/tao/config/envvars.py | 4 +- lib/tfw/components/directory_monitor.py | 3 +- .../directory_monitoring_event_handler.py | 9 ++-- lib/tfw/components/history_monitor.py | 5 ++- .../components/source_code_event_handler.py | 42 ++++++++++++------- lib/tfw/config/envvars.py | 4 +- lib/tfw/event_handler_base.py | 9 ++-- .../server/event_handler_connector.py | 3 +- lib/tfw/networking/server/tfw_server.py | 12 ++++-- .../server/zmq_websocket_handler.py | 6 ++- 11 files changed, 64 insertions(+), 35 deletions(-) diff --git a/lib/envvars.py b/lib/envvars.py index aeb2712..dd6b8e4 100644 --- a/lib/envvars.py +++ b/lib/envvars.py @@ -2,7 +2,7 @@ from collections import namedtuple from os import environ -def generate_namedtuple_from_prefixed_envvars(prefix: str, tuple_name: str): +def prefixed_envvars_to_namedtuple(prefix: str, tuple_name: str): envvars = {envvar.replace(prefix, '', 1): environ.get(envvar) for envvar in environ.keys() if envvar.startswith(prefix)} diff --git a/lib/tao/config/envvars.py b/lib/tao/config/envvars.py index 474e597..8f50c52 100644 --- a/lib/tao/config/envvars.py +++ b/lib/tao/config/envvars.py @@ -1,3 +1,3 @@ -from envvars import generate_namedtuple_from_prefixed_envvars +from envvars import prefixed_envvars_to_namedtuple -TAOENV = generate_namedtuple_from_prefixed_envvars('AVATAO_', 'taoenvtuple') +TAOENV = prefixed_envvars_to_namedtuple('AVATAO_', 'taoenvtuple') diff --git a/lib/tfw/components/directory_monitor.py b/lib/tfw/components/directory_monitor.py index 2c222d1..4c56dec 100644 --- a/lib/tfw/components/directory_monitor.py +++ b/lib/tfw/components/directory_monitor.py @@ -61,7 +61,8 @@ class WebideReloadWatchdogEventHandler(FileSystemWatchdogEventHandler): @RateLimiter(rate_per_second=2) def on_modified(self, event): - if self._paused: return + if self._paused: + return if self.ignore > 0: self.ignore = self.ignore - 1 return diff --git a/lib/tfw/components/directory_monitoring_event_handler.py b/lib/tfw/components/directory_monitoring_event_handler.py index 98ddd27..b9f6186 100644 --- a/lib/tfw/components/directory_monitoring_event_handler.py +++ b/lib/tfw/components/directory_monitoring_event_handler.py @@ -24,7 +24,8 @@ class DirectoryMonitoringEventHandler(TriggerlessEventHandler): @directory.setter def directory(self, directory): - if not exists(directory) or not isdir(directory): raise EnvironmentError('No such directory!') + if not exists(directory) or not isdir(directory): + raise EnvironmentError('No such directory!') self._directory = directory @property @@ -33,8 +34,10 @@ class DirectoryMonitoringEventHandler(TriggerlessEventHandler): def reload_monitor(self): if self._monitor: - try: self._monitor.stop() - except KeyError: logging.debug('Working directory was removed – ignoring...') + try: + self._monitor.stop() + except KeyError: + logging.debug('Working directory was removed – ignoring...') self._monitor = DirectoryMonitor(self._directory) self._monitor.watch() # This runs on a separate thread diff --git a/lib/tfw/components/history_monitor.py b/lib/tfw/components/history_monitor.py index a4ce76e..1fb6c77 100644 --- a/lib/tfw/components/history_monitor.py +++ b/lib/tfw/components/history_monitor.py @@ -1,5 +1,6 @@ from os.path import dirname -from re import compile, findall +from re import findall +from re import compile as compileregex from abc import ABC, abstractmethod from watchdog.observers import Observer @@ -39,7 +40,7 @@ class HistoryMonitor(CallbackMixin, ABC): def _fetch_history(self): self._last_length = len(self._history) with open(self.histfile, 'r') as ifile: - pattern = compile(self.command_pattern) + pattern = compileregex(self.command_pattern) data = ifile.read() self._history = [self.sanitize_command(command) for command in findall(pattern, data)] diff --git a/lib/tfw/components/source_code_event_handler.py b/lib/tfw/components/source_code_event_handler.py index 1db1d2b..3e58a62 100644 --- a/lib/tfw/components/source_code_event_handler.py +++ b/lib/tfw/components/source_code_event_handler.py @@ -22,8 +22,10 @@ class FileManager: @exclude.setter def exclude(self, exclude): - if exclude is None: return - if not isinstance(exclude, Iterable): raise TypeError('Exclude must be Iterable!') + if exclude is None: + return + if not isinstance(exclude, Iterable): + raise TypeError('Exclude must be Iterable!') self._exclude = exclude @property @@ -89,28 +91,38 @@ class SourceCodeEventHandler(TriggerlessEventHandler): def reload_monitor(self): if self._monitor: - try: self._monitor.stop() - except KeyError: logging.debug('Working directory was removed – ignoring...') + try: + self._monitor.stop() + except KeyError: + logging.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 - except PermissionError: data['content'] = 'You have no permission to open that file :(' - except FileNotFoundError: data['content'] = 'This file was removed :(' - except Exception: data['content'] = 'Failed to read file :(' + try: + data['content'] = self.filemanager.file_contents + except PermissionError: + data['content'] = 'You have no permission to open that file :(' + except FileNotFoundError: + data['content'] = 'This file was removed :(' + except Exception: + data['content'] = 'Failed to read file :(' return data def write(self, data): self.monitor.ignore = self.monitor.ignore + 1 - try: self.filemanager.file_contents = data['content'] - except Exception: LOG.exception('Error writing file!') + try: + self.filemanager.file_contents = data['content'] + except Exception: + LOG.exception('Error writing file!') del data['content'] return data def select(self, data): - try: self.filemanager.filename = data['filename'] - except EnvironmentError: LOG.exception('Failed to select file "%s"', data['filename']) + try: + self.filemanager.filename = data['filename'] + except EnvironmentError: + LOG.exception('Failed to select file "%s"', data['filename']) return data def select_dir(self, data): @@ -127,8 +139,10 @@ class SourceCodeEventHandler(TriggerlessEventHandler): return data def exclude(self, data): - try: self.filemanager.exclude = list(data['exclude']) - except TypeError: LOG.error('Exclude must be Iterable!') + try: + self.filemanager.exclude = list(data['exclude']) + except TypeError: + LOG.error('Exclude must be Iterable!') return data def attach_fileinfo(self, data): diff --git a/lib/tfw/config/envvars.py b/lib/tfw/config/envvars.py index 0da3db5..120d166 100644 --- a/lib/tfw/config/envvars.py +++ b/lib/tfw/config/envvars.py @@ -1,3 +1,3 @@ -from envvars import generate_namedtuple_from_prefixed_envvars +from envvars import prefixed_envvars_to_namedtuple -TFWENV = generate_namedtuple_from_prefixed_envvars('TFW_', 'tfwenvtuple') +TFWENV = prefixed_envvars_to_namedtuple('TFW_', 'tfwenvtuple') diff --git a/lib/tfw/event_handler_base.py b/lib/tfw/event_handler_base.py index 6648481..562ac07 100644 --- a/lib/tfw/event_handler_base.py +++ b/lib/tfw/event_handler_base.py @@ -16,7 +16,8 @@ class EventHandlerBase(ABC): def event_handler_callback(self, msg_parts): key, message = deserialize_all(*msg_parts) response = self.dispatch_handling(key, message) - if response is None: return + if response is None: + return self.server_connector.send(key, response) @abstractmethod @@ -24,8 +25,10 @@ class EventHandlerBase(ABC): raise NotImplementedError def _dispatch_handling(self, key, message): - if key != 'reset': return self.handle_event(key, message) - else: return self.handle_reset(message) + if key != 'reset': + return self.handle_event(key, message) + else: + return self.handle_reset(message) @abstractmethod def handle_event(self, key, message): diff --git a/lib/tfw/networking/server/event_handler_connector.py b/lib/tfw/networking/server/event_handler_connector.py index 000b9ae..9fbfbd8 100644 --- a/lib/tfw/networking/server/event_handler_connector.py +++ b/lib/tfw/networking/server/event_handler_connector.py @@ -33,5 +33,6 @@ class EventHandlerConnector(EventHandlerDownlinkConnector, EventHandlerUplinkCon self._zmq_pull_stream.on_recv(callback) def send_message(self, message: dict, key: str = None): - if not key: key = message.get('key', '') + if not key: + key = message.get('key', '') self._zmq_pub_socket.send_multipart(serialize_all(key, message)) diff --git a/lib/tfw/networking/server/tfw_server.py b/lib/tfw/networking/server/tfw_server.py index 34453ed..0b9f593 100644 --- a/lib/tfw/networking/server/tfw_server.py +++ b/lib/tfw/networking/server/tfw_server.py @@ -33,8 +33,10 @@ class TFWServer: def make_response(self, message): trigger = message.get('trigger', '') - try: self._fsm_manager.trigger(trigger, message) - except AttributeError: LOG.debug('FSM failed to execute nonexistent trigger: "%s"', trigger) + try: + self._fsm_manager.trigger(trigger, message) + except AttributeError: + LOG.debug('FSM failed to execute nonexistent trigger: "%s"', trigger) return message def proxy_filter(self, message): @@ -62,8 +64,10 @@ class FSMManager: self.messenge_sender.send('FSM', message) if all(predicate_results): - try: self.fsm.trigger(trigger, message=message) - except AttributeError: LOG.debug('FSM failed to execute nonexistent trigger: "%s"', trigger) + try: + self.fsm.trigger(trigger, message=message) + except AttributeError: + LOG.debug('FSM failed to execute nonexistent trigger: "%s"', trigger) def subscribe_predicate(self, trigger, *predicates): self.trigger_predicates[trigger].extend(predicates) diff --git a/lib/tfw/networking/server/zmq_websocket_handler.py b/lib/tfw/networking/server/zmq_websocket_handler.py index da9dd8b..08fbadb 100644 --- a/lib/tfw/networking/server/zmq_websocket_handler.py +++ b/lib/tfw/networking/server/zmq_websocket_handler.py @@ -34,8 +34,10 @@ class ZMQWebSocketHandler(WebSocketHandler, ABC): for instance in cls.instances: instance.write_message(data) else: - try: keyhandlers[key](data['data']) - except KeyError: LOG.error('Invalid mirror message format! Ignoring.') + try: + keyhandlers[key](data['data']) + except KeyError: + LOG.error('Invalid mirror message format! Ignoring.') @classmethod def mirror(cls, data): From d850f55b86c0cfeec03dddc7c36077f2cc901074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20T=C3=B3th?= Date: Fri, 30 Mar 2018 18:11:38 +0200 Subject: [PATCH 2/2] Add pylint local excludes to silence false positives --- lib/tao/config/__init__.py | 2 +- lib/tfw/components/history_monitor.py | 1 + lib/tfw/components/source_code_event_handler.py | 4 ++-- lib/tfw/components/terminado_mini_server.py | 2 +- lib/tfw/event_handler_base.py | 5 +++++ lib/tfw/fsm_base.py | 2 +- lib/tfw/networking/server/controller_responder.py | 2 ++ lib/tfw/networking/server/tfw_server.py | 2 ++ lib/tfw/networking/server/zmq_websocket_handler.py | 2 ++ 9 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/tao/config/__init__.py b/lib/tao/config/__init__.py index d3319d7..08aca1a 100644 --- a/lib/tao/config/__init__.py +++ b/lib/tao/config/__init__.py @@ -1 +1 @@ -from .envvars import * +from .envvars import * # pylint: disable=wildcard-import diff --git a/lib/tfw/components/history_monitor.py b/lib/tfw/components/history_monitor.py index 1fb6c77..0d9279f 100644 --- a/lib/tfw/components/history_monitor.py +++ b/lib/tfw/components/history_monitor.py @@ -50,6 +50,7 @@ class HistoryMonitor(CallbackMixin, ABC): raise NotImplementedError def sanitize_command(self, command): + # pylint: disable=no-self-use return command def _invoke_callbacks(self): diff --git a/lib/tfw/components/source_code_event_handler.py b/lib/tfw/components/source_code_event_handler.py index 3e58a62..3f9caf5 100644 --- a/lib/tfw/components/source_code_event_handler.py +++ b/lib/tfw/components/source_code_event_handler.py @@ -105,7 +105,7 @@ class SourceCodeEventHandler(TriggerlessEventHandler): data['content'] = 'You have no permission to open that file :(' except FileNotFoundError: data['content'] = 'This file was removed :(' - except Exception: + except Exception: # pylint: disable=broad-except data['content'] = 'Failed to read file :(' return data @@ -113,7 +113,7 @@ class SourceCodeEventHandler(TriggerlessEventHandler): self.monitor.ignore = self.monitor.ignore + 1 try: self.filemanager.file_contents = data['content'] - except Exception: + except Exception: # pylint: disable=broad-except LOG.exception('Error writing file!') del data['content'] return data diff --git a/lib/tfw/components/terminado_mini_server.py b/lib/tfw/components/terminado_mini_server.py index 613e749..e796e8c 100644 --- a/lib/tfw/components/terminado_mini_server.py +++ b/lib/tfw/components/terminado_mini_server.py @@ -29,7 +29,7 @@ class TerminadoMiniServer: def pty(self): return self.term_manager.terminal.ptyproc - class ResetterTermSocket(TermSocket): + class ResetterTermSocket(TermSocket): # pylint: disable=abstract-method def check_origin(self, origin): return True diff --git a/lib/tfw/event_handler_base.py b/lib/tfw/event_handler_base.py index 562ac07..e60d698 100644 --- a/lib/tfw/event_handler_base.py +++ b/lib/tfw/event_handler_base.py @@ -25,6 +25,7 @@ class EventHandlerBase(ABC): raise NotImplementedError def _dispatch_handling(self, key, message): + # pylint: disable=no-else-return if key != 'reset': return self.handle_event(key, message) else: @@ -35,6 +36,7 @@ class EventHandlerBase(ABC): raise NotImplementedError def handle_reset(self, message): + # pylint: disable=unused-argument,no-self-use return None def cleanup(self): @@ -66,11 +68,13 @@ class EventHandlerBase(ABC): class TriggerlessEventHandler(EventHandlerBase, ABC): + # pylint: disable=abstract-method def dispatch_handling(self, key, message): return self._dispatch_handling(key, message) class TriggeredEventHandler(EventHandlerBase, ABC): + # pylint: disable=abstract-method def __init__(self, key, trigger): super().__init__(key) self.trigger = trigger @@ -78,3 +82,4 @@ class TriggeredEventHandler(EventHandlerBase, ABC): def dispatch_handling(self, key, message): if message.get('trigger') == self.trigger: return self._dispatch_handling(key, message) + return None diff --git a/lib/tfw/fsm_base.py b/lib/tfw/fsm_base.py index 4160512..9927215 100644 --- a/lib/tfw/fsm_base.py +++ b/lib/tfw/fsm_base.py @@ -23,4 +23,4 @@ class FSMBase(CallbackMixin): self._execute_callbacks(event_data.kwargs) def is_solved(self): - return self.state in self.accepted_states + return self.state in self.accepted_states # pylint: disable=no-member diff --git a/lib/tfw/networking/server/controller_responder.py b/lib/tfw/networking/server/controller_responder.py index a0924e7..d85e31a 100644 --- a/lib/tfw/networking/server/controller_responder.py +++ b/lib/tfw/networking/server/controller_responder.py @@ -20,6 +20,7 @@ class ControllerResponder: stream.send_multipart(serialize_all(self.token, response)) def handle_test_request(self, data): + # pylint: disable=unused-argument,no-self-use return 'OK' def handle_token_request(self, data): @@ -28,6 +29,7 @@ class ControllerResponder: return {'token': self.token} def handle_solution_check_request(self, data): + # pylint: disable=unused-argument return { 'solved': self.fsm.is_solved(), 'message': 'solved' if self.fsm.is_solved() else 'not solved' diff --git a/lib/tfw/networking/server/tfw_server.py b/lib/tfw/networking/server/tfw_server.py index 0b9f593..a5f9aa6 100644 --- a/lib/tfw/networking/server/tfw_server.py +++ b/lib/tfw/networking/server/tfw_server.py @@ -40,6 +40,7 @@ class TFWServer: return message def proxy_filter(self, message): + # pylint: disable=unused-argument,no-self-use return True def listen(self, port): @@ -83,6 +84,7 @@ class FSMUpdater: self.uplink = ServerUplinkConnector() def update(self, kwargs_dict): + # pylint: disable=unused-argument self.uplink.send(*self.generate_fsm_update()) def generate_fsm_update(self): diff --git a/lib/tfw/networking/server/zmq_websocket_handler.py b/lib/tfw/networking/server/zmq_websocket_handler.py index 08fbadb..452c516 100644 --- a/lib/tfw/networking/server/zmq_websocket_handler.py +++ b/lib/tfw/networking/server/zmq_websocket_handler.py @@ -61,7 +61,9 @@ class ZMQWebSocketHandler(WebSocketHandler, ABC): class ZMQWebSocketProxy(ZMQWebSocketHandler): + # pylint: disable=abstract-method def initialize(self, make_response, proxy_filter): + # pylint: disable=arguments-differ self._make_response = make_response self._proxy_filter = proxy_filter