From 8561bfac630dc4936078778157294c6d46a1d65c Mon Sep 17 00:00:00 2001 From: sezanzeb Date: Sun, 22 Nov 2020 21:41:29 +0100 Subject: [PATCH] pylint 9.70 --- .pylintrc | 5 +++++ README.md | 1 + keymapper/config.py | 10 +++++----- keymapper/daemon.py | 19 +++++++++++-------- keymapper/getdevices.py | 2 -- keymapper/gtk/error.py | 2 +- keymapper/gtk/row.py | 5 +++-- keymapper/gtk/unsaved.py | 5 +++-- keymapper/gtk/window.py | 28 ++++++++++++++-------------- keymapper/injector.py | 10 +++++++--- keymapper/logger.py | 8 +++----- keymapper/mapping.py | 10 +++++----- keymapper/presets.py | 2 -- keymapper/reader.py | 1 - setup.py | 8 ++++---- tests/testcases/injector.py | 4 ++-- 16 files changed, 64 insertions(+), 56 deletions(-) create mode 100644 .pylintrc diff --git a/.pylintrc b/.pylintrc new file mode 100644 index 00000000..6df8f536 --- /dev/null +++ b/.pylintrc @@ -0,0 +1,5 @@ +[_] + +disable= + # that is the standard way to import GTK afaik + wrong-import-position diff --git a/README.md b/README.md index 025ffa37..275393c0 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ Depending on how those packages are called in your distro: # Tests ```bash +pylint keymapper --extension-pkg-whitelist=evdev sudo python3 setup.py install && python3 tests/test.py ``` diff --git a/keymapper/config.py b/keymapper/config.py index 9c20d92e..4756397b 100644 --- a/keymapper/config.py +++ b/keymapper/config.py @@ -61,9 +61,9 @@ class _Config: self.save_config() return - with open(CONFIG_PATH, 'r') as f: + with open(CONFIG_PATH, 'r') as file: self._config = copy.deepcopy(INITIAL_CONFIG) - self._config.update(json.load(f)) + self._config.update(json.load(file)) logger.info('Loaded config from %s', CONFIG_PATH) def clear_config(self): @@ -77,11 +77,11 @@ class _Config: os.makedirs(os.path.dirname(CONFIG_PATH), exist_ok=True) os.mknod(CONFIG_PATH) - with open(CONFIG_PATH, 'w') as f: - json.dump(self._config, f, indent=4) + with open(CONFIG_PATH, 'w') as file: + json.dump(self._config, file, indent=4) logger.info('Saved config to %s', CONFIG_PATH) shutil.chown(CONFIG_PATH, os.getlogin()) - f.write('\n') + file.write('\n') config = _Config() diff --git a/keymapper/daemon.py b/keymapper/daemon.py index 64dba6db..f9b7278f 100644 --- a/keymapper/daemon.py +++ b/keymapper/daemon.py @@ -33,6 +33,9 @@ from keymapper.injector import KeycodeInjector from keymapper.mapping import Mapping +# TODO service file in data for a root daemon + + def is_service_running(): """Check if the daemon is running.""" try: @@ -50,13 +53,13 @@ def get_dbus_interface(): 'long as the window is open.' ) return Daemon(autoload=False) - else: - logger.debug('Found the daemon process') - bus = dbus.SessionBus() - remote_object = bus.get_object('com.keymapper.Control', '/') - interface = dbus.Interface(remote_object, 'com.keymapper.Interface') - logger.debug('Connected to dbus') - return interface + + logger.debug('Found the daemon process') + bus = dbus.SessionBus() + remote_object = bus.get_object('com.keymapper.Control', '/') + interface = dbus.Interface(remote_object, 'com.keymapper.Interface') + logger.debug('Connected to dbus') + return interface class Daemon(service.Object): @@ -91,7 +94,7 @@ class Daemon(service.Object): self.injectors[device].stop_injecting() # TODO if ss is the correct signature for multiple parameters, add an - # example to https://gitlab.freedesktop.org/dbus/dbus-python/-/blob/master/doc/tutorial.txt # noqa + # example to https://gitlab.freedesktop.org/dbus/dbus-python/-/blob/master/doc/tutorial.txt # noqa pylint: disable=line-too-long @dbus.service.method( 'com.keymapper.Interface', in_signature='ss' diff --git a/keymapper/getdevices.py b/keymapper/getdevices.py index c0518b77..fe1ff5f2 100644 --- a/keymapper/getdevices.py +++ b/keymapper/getdevices.py @@ -24,12 +24,10 @@ import multiprocessing import time -import copy import evdev from keymapper.logger import logger -from keymapper.config import config _devices = None diff --git a/keymapper/gtk/error.py b/keymapper/gtk/error.py index a62c0b95..127740ae 100644 --- a/keymapper/gtk/error.py +++ b/keymapper/gtk/error.py @@ -49,4 +49,4 @@ class ErrorDialog: builder.get_object('primary_error_label').set_text(primary) builder.get_object('secondary_error_label').set_text(secondary) error_dialog.run() - error_dialog.hide() \ No newline at end of file + error_dialog.hide() diff --git a/keymapper/gtk/row.py b/keymapper/gtk/row.py index cfc12aab..27829571 100644 --- a/keymapper/gtk/row.py +++ b/keymapper/gtk/row.py @@ -29,7 +29,6 @@ from gi.repository import Gtk, GLib from keymapper.state import custom_mapping from keymapper.logger import logger -from keymapper.reader import keycode_reader CTX_KEYCODE = 2 @@ -52,10 +51,12 @@ class Row(Gtk.ListBoxRow): self.put_together(keycode, character) def get_keycode(self): + """Get the integer keycode from the left column.""" keycode = self.keycode.get_label() return int(keycode) if keycode else None def get_character(self): + """Get the assigned character from the middle column.""" character = self.character_input.get_text() return character if character else None @@ -107,7 +108,7 @@ class Row(Gtk.ListBoxRow): """Mark this row as unchanged.""" self.get_style_context().remove_class('changed') - def on_character_input_change(self, entry): + def on_character_input_change(self, _): keycode = self.get_keycode() character = self.get_character() diff --git a/keymapper/gtk/unsaved.py b/keymapper/gtk/unsaved.py index f2848cf1..ab7f398f 100644 --- a/keymapper/gtk/unsaved.py +++ b/keymapper/gtk/unsaved.py @@ -43,7 +43,8 @@ def unsaved_changes_dialog(): dialog.show() response = dialog.run() dialog.hide() + if response == Gtk.ResponseType.ACCEPT: return CONTINUE - else: - return GO_BACK + + return GO_BACK diff --git a/keymapper/gtk/window.py b/keymapper/gtk/window.py index 3f8c6a8b..0c333cd8 100755 --- a/keymapper/gtk/window.py +++ b/keymapper/gtk/window.py @@ -22,7 +22,6 @@ """User Interface.""" -import dbus import gi gi.require_version('Gtk', '3.0') gi.require_version('GLib', '2.0') @@ -78,9 +77,9 @@ class Window: self.selected_preset = None css_provider = Gtk.CssProvider() - with open(get_data_path('style.css'), 'r') as f: + with open(get_data_path('style.css'), 'r') as file: data = ( - f.read() + + file.read() + '\n.changed{background-color:' + get_selected_row_bg() + ';}\n' @@ -196,10 +195,10 @@ class Window: key_list = self.get('key_list') key_list.forall(lambda row: row.unhighlight()) - def on_window_event(self, button, event): + def on_window_event(self, *args): """Write down the pressed key in the UI. - Works with any mouse and keyboard event. + Triggered from any mouse and keyboard event. """ # to capture regular keyboard keys or extra-mouse keys keycode = keycode_reader.read() @@ -221,7 +220,7 @@ class Window: if isinstance(focused, Gtk.ToggleButton) and isinstance(row, Row): row.set_new_keycode(keycode) - def on_apply_system_layout_clicked(self, button): + def on_apply_system_layout_clicked(self, _): """Load the mapping.""" self.dbus.stop_injecting(self.selected_device) self.get('status_bar').push( @@ -237,7 +236,7 @@ class Window: new_name = self.get('preset_name_input').get_text() try: self.save_config() - if new_name != '' and new_name != self.selected_preset: + if new_name not in ['', self.selected_preset]: rename_preset( self.selected_device, self.selected_preset, @@ -251,19 +250,19 @@ class Window: CTX_SAVE, f'Saved "{self.selected_preset}"' ) - except PermissionError as e: + except PermissionError as error: self.get('status_bar').push( CTX_ERROR, 'Error: Permission denied!' ) - logger.error(str(e)) + logger.error(str(error)) - def on_delete_preset_clicked(self, button): + def on_delete_preset_clicked(self, _): """Delete a preset from the file system.""" delete_preset(self.selected_device, self.selected_preset) self.populate_presets() - def on_apply_preset_clicked(self, button): + def on_apply_preset_clicked(self, _): """Apply a preset without saving changes.""" logger.debug( 'Applying preset "%s" for "%s"', @@ -310,7 +309,7 @@ class Window: lambda: keycode_reader.start_reading(self.selected_device) ) - def on_create_preset_clicked(self, button): + def on_create_preset_clicked(self, _): """Create a new preset and select it.""" if custom_mapping.changed: if unsaved_changes_dialog() == GO_BACK: @@ -322,12 +321,12 @@ class Window: custom_mapping.save(self.selected_device, new_preset) self.get('preset_selection').append(new_preset, new_preset) self.get('preset_selection').set_active_id(new_preset) - except PermissionError as e: + except PermissionError as error: self.get('status_bar').push( CTX_ERROR, 'Error: Permission denied!' ) - logger.error(str(e)) + logger.error(str(error)) def on_select_preset(self, dropdown): """Show the mappings of the preset.""" @@ -360,6 +359,7 @@ class Window: self.add_empty() def add_empty(self): + """Add one empty row for a single mapped key.""" empty = Row( window=self, delete_callback=self.on_row_removed diff --git a/keymapper/injector.py b/keymapper/injector.py index f6befc39..a212f038 100644 --- a/keymapper/injector.py +++ b/keymapper/injector.py @@ -34,7 +34,7 @@ import multiprocessing import evdev from keymapper.logger import logger -from keymapper.getdevices import get_devices, refresh_devices +from keymapper.getdevices import get_devices from keymapper.state import custom_mapping, system_mapping @@ -126,8 +126,8 @@ def _start_injecting_worker(path, pipe, mapping): try: device = _grab(path) - except Exception as e: - logger.error(e) + except Exception as error: + logger.error(error) pipe.send(FAILED) return @@ -200,9 +200,12 @@ def is_numlock_on(): r'Num Lock:\s+(.+?)\s', xset_q ) + if num_lock_status is not None: return num_lock_status[1] == 'on' + return False + def toggle_numlock(): """Turn the numlock on or off.""" @@ -223,6 +226,7 @@ def toggle_numlock(): def ensure_numlock(func): + """Decorator to reset the numlock to its initial state afterwards.""" def wrapped(*args, **kwargs): # for some reason, grabbing a device can modify the num lock state. # remember it and apply back later diff --git a/keymapper/logger.py b/keymapper/logger.py index e20dfc0e..0b437ab8 100644 --- a/keymapper/logger.py +++ b/keymapper/logger.py @@ -41,10 +41,11 @@ logging.Logger.spam = spam class Formatter(logging.Formatter): """Overwritten Formatter to print nicer logs.""" def format(self, record): + """Overwritten format function.""" debug = logger.level <= logging.DEBUG if record.levelno == logging.INFO and not debug: # if not launched with --debug, then don't print "INFO:" - self._style._fmt = '%(message)s' # noqa + self._style._fmt = '%(message)s' # pylint: disable=line-too-long else: # see https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit # for those numbers @@ -82,6 +83,7 @@ logging.getLogger('asyncio').setLevel(logging.WARNING) def is_debug(): + """True, if the logger is currently in DEBUG or SPAM mode.""" return logger.level <= logging.DEBUG @@ -101,10 +103,6 @@ def update_verbosity(debug): logger.setLevel(logging.INFO) -def debug_log_on(): - return logger.level == logging.DEBUG - - def add_filehandler(): """Clear the existing logfile and start logging to it.""" # jack also logs to ~/.log diff --git a/keymapper/mapping.py b/keymapper/mapping.py index 1e63567b..f39be461 100644 --- a/keymapper/mapping.py +++ b/keymapper/mapping.py @@ -110,8 +110,8 @@ class Mapping: logger.error('Tried to load non-existing preset "%s"', path) return - with open(path, 'r') as f: - mapping = json.load(f) + with open(path, 'r') as file: + mapping = json.load(file) for keycode, character in mapping.items(): try: keycode = int(keycode) @@ -134,9 +134,9 @@ class Mapping: # if this is done with sudo rights, give the file to the user shutil.chown(path, os.getlogin()) - with open(path, 'w') as f: - json.dump(self._mapping, f, indent=4) - f.write('\n') + with open(path, 'w') as file: + json.dump(self._mapping, file, indent=4) + file.write('\n') self.changed = False diff --git a/keymapper/presets.py b/keymapper/presets.py index 19e2ce43..775a70f9 100644 --- a/keymapper/presets.py +++ b/keymapper/presets.py @@ -74,8 +74,6 @@ def get_any_preset(): return None, None any_device = list(devices)[0] any_preset = (get_presets(any_device) or [None])[0] - if any_preset is not None: - any_preset = any_preset return any_device, any_preset diff --git a/keymapper/reader.py b/keymapper/reader.py index 7dc144fb..1de936e5 100644 --- a/keymapper/reader.py +++ b/keymapper/reader.py @@ -22,7 +22,6 @@ """Keeps reading keycodes in the background for the UI to use.""" -import os import evdev from keymapper.logger import logger diff --git a/setup.py b/setup.py index 63e66b5f..86c385b5 100644 --- a/setup.py +++ b/setup.py @@ -36,18 +36,18 @@ class Install(DistUtilsExtra.auto.install_auto): policy_path = '/usr/share/polkit-1/actions/org.key-mapper.policy' - with open(policy_path, 'r') as f: - contents = f.read() + with open(policy_path, 'r') as file: + contents = file.read() if '{executable}' not in contents: # already done previously return - with open(policy_path, 'w') as f: + with open(policy_path, 'w') as file: print( f'Inserting the correct path "{executable}" into ' 'org.key-mapper.policy' ) - f.write(contents.format( + file.write(contents.format( executable=executable )) diff --git a/tests/testcases/injector.py b/tests/testcases/injector.py index ee73f882..2afbde7c 100644 --- a/tests/testcases/injector.py +++ b/tests/testcases/injector.py @@ -110,13 +110,13 @@ class TestInjector(unittest.TestCase): self.assertEqual(len(injector2.processes), 1) self.assertEqual(injector2.processes[0].is_alive(), True) injector2.processes[0].join() - except Exception as e: + except Exception as error: # make sure to not cause race conditions for other tests # if this test fails if injector2 is not None: for p in injector2.processes: p.join() - raise e + raise error def test_injector(self): device = get_devices()['device 2']