diff --git a/inputremapper/gui/data_manager.py b/inputremapper/gui/data_manager.py index d63972e4b..cea72fe68 100644 --- a/inputremapper/gui/data_manager.py +++ b/inputremapper/gui/data_manager.py @@ -250,15 +250,11 @@ def get_newest_preset_name(self) -> Name: if not self.active_group: raise DataManagementError("Cannot find newest preset: Group is not set") - paths = [ - (path, os.path.getmtime(path)) - for path in glob.glob( - os.path.join( - glob.escape(PathUtils.get_preset_path(self.active_group.name)), - "*.json", - ) - ) - ] + pattern = os.path.join( + glob.escape(PathUtils.get_preset_path(self.active_group.name)), + "*.json", + ) + paths = [(path, os.path.getmtime(path)) for path in glob.glob(pattern)] if not paths: raise FileNotFoundError() diff --git a/tests/lib/fixtures.py b/tests/lib/fixtures.py index 2cbe9b6c2..e0132e985 100644 --- a/tests/lib/fixtures.py +++ b/tests/lib/fixtures.py @@ -209,7 +209,7 @@ class _Fixtures: capabilities={evdev.ecodes.EV_KEY: keyboard_keys}, phys="usb-0000:03:00.0-3/input1", info=evdev.device.DeviceInfo(2, 1, 2, 1), - name="Qux/Device?", + name="Qux/[Device]?", path="/dev/input/event52", ) diff --git a/tests/unit/test_controller.py b/tests/unit/test_controller.py index 39015835d..38e1323fa 100644 --- a/tests/unit/test_controller.py +++ b/tests/unit/test_controller.py @@ -135,7 +135,7 @@ def f(groups): self.message_broker.subscribe(MessageType.groups, f) self.message_broker.signal(MessageType.init) self.assertEqual( - ["Foo Device", "Foo Device 2", "Bar Device", "gamepad", "Qux/Device?"], + ["Foo Device", "Foo Device 2", "Bar Device", "gamepad", "Qux/[Device]?"], list(calls[-1].groups.keys()), ) @@ -408,26 +408,28 @@ def test_rename_preset(self): self.assertTrue(os.path.exists(PathUtils.get_preset_path("Foo Device", "foo"))) def test_rename_preset_sanitized(self): - Preset(PathUtils.get_preset_path("Qux/Device?", "bla")).save() + Preset(PathUtils.get_preset_path("Qux/[Device]?", "bla")).save() - self.assertTrue(os.path.isfile(PathUtils.get_preset_path("Qux/Device?", "bla"))) + self.assertTrue( + os.path.isfile(PathUtils.get_preset_path("Qux/[Device]?", "bla")) + ) self.assertFalse( - os.path.exists(PathUtils.get_preset_path("Qux/Device?", "blubb")) + os.path.exists(PathUtils.get_preset_path("Qux/[Device]?", "blubb")) ) - self.data_manager.load_group("Qux/Device?") + self.data_manager.load_group("Qux/[Device]?") self.data_manager.load_preset("bla") self.controller.rename_preset(new_name="foo:/bar") # all functions expect the true name, which is also shown to the user, but on # the file system it always uses sanitized names. self.assertTrue( - os.path.exists(PathUtils.get_preset_path("Qux/Device?", "foo__bar")) + os.path.exists(PathUtils.get_preset_path("Qux/[Device]?", "foo__bar")) ) # since the name is never stored in an un-sanitized way, this can't work self.assertFalse( - os.path.exists(PathUtils.get_preset_path("Qux/Device?", "foo:/bar")) + os.path.exists(PathUtils.get_preset_path("Qux/[Device]?", "foo:/bar")) ) path = os.path.join( diff --git a/tests/unit/test_daemon.py b/tests/unit/test_daemon.py index e6f01314a..62b59ce1e 100644 --- a/tests/unit/test_daemon.py +++ b/tests/unit/test_daemon.py @@ -369,7 +369,7 @@ def test_xmodmap_file(self): self.assertEqual(event.value, 1) def test_start_stop(self): - group_key = "Qux/Device?" + group_key = "Qux/[Device]?" group = groups.find(key=group_key) preset_name = "preset8" @@ -438,7 +438,7 @@ def test_start_stop(self): def test_autoload(self): preset_name = "preset7" - group_key = "Qux/Device?" + group_key = "Qux/[Device]?" group = groups.find(key=group_key) daemon = Daemon() diff --git a/tests/unit/test_data_manager.py b/tests/unit/test_data_manager.py index 18c5873b3..cc8ae670c 100644 --- a/tests/unit/test_data_manager.py +++ b/tests/unit/test_data_manager.py @@ -351,11 +351,13 @@ def test_delete_preset(self): def test_delete_preset_sanitized(self): """should be able to delete the current preset""" - Preset(PathUtils.get_preset_path("Qux/Device?", "bla")).save() - Preset(PathUtils.get_preset_path("Qux/Device?", "foo")).save() - self.assertTrue(os.path.exists(PathUtils.get_preset_path("Qux/Device?", "bla"))) + Preset(PathUtils.get_preset_path("Qux/[Device]?", "bla")).save() + Preset(PathUtils.get_preset_path("Qux/[Device]?", "foo")).save() + self.assertTrue( + os.path.exists(PathUtils.get_preset_path("Qux/[Device]?", "bla")) + ) - self.data_manager.load_group(group_key="Qux/Device?") + self.data_manager.load_group(group_key="Qux/[Device]?") self.data_manager.load_preset(name="bla") listener = Listener() self.message_broker.subscribe(MessageType.group, listener) @@ -372,7 +374,7 @@ def test_delete_preset_sanitized(self): self.assertEqual(len(listener.calls), 1) self.assertFalse( - os.path.exists(PathUtils.get_preset_path("Qux/Device?", "bla")) + os.path.exists(PathUtils.get_preset_path("Qux/[Device]?", "bla")) ) def test_load_mapping(self): @@ -797,12 +799,12 @@ def test_newest_preset_ignores_unknown_filetypes(self): self.assertEqual(self.data_manager.get_newest_preset_name(), "preset 3") - def test_newest_group_ignores_unknon_groups(self): + def test_newest_group_ignores_unknown_groups(self): Preset(PathUtils.get_preset_path("Bar Device", "preset 1")).save() time.sleep(0.01) - Preset( - PathUtils.get_preset_path("unknown_group", "preset 2") - ).save() # not a known group + + # not a known group + Preset(PathUtils.get_preset_path("unknown_group", "preset 2")).save() self.assertEqual(self.data_manager.get_newest_group_key(), "Bar Device") @@ -856,18 +858,23 @@ def test_available_preset_name_raises_data_management_error(self): DataManagementError, self.data_manager.get_available_preset_name ) + def test_special_characters(self): + self.data_manager.load_group("Qux/[Device]?") + Preset(PathUtils.get_preset_path("Qux/[Device]?", "new preset")).save() + self.assertEqual(self.data_manager.get_preset_names(), ("new preset",)) + def test_available_preset_name_sanitized(self): - self.data_manager.load_group("Qux/Device?") + self.data_manager.load_group("Qux/[Device]?") self.assertEqual( self.data_manager.get_available_preset_name(), DEFAULT_PRESET_NAME ) - Preset(PathUtils.get_preset_path("Qux/Device?", DEFAULT_PRESET_NAME)).save() + Preset(PathUtils.get_preset_path("Qux/[Device]?", DEFAULT_PRESET_NAME)).save() self.assertEqual( self.data_manager.get_available_preset_name(), f"{DEFAULT_PRESET_NAME} 2" ) - Preset(PathUtils.get_preset_path("Qux/Device?", "foo")).save() + Preset(PathUtils.get_preset_path("Qux/[Device]?", "foo")).save() self.assertEqual(self.data_manager.get_available_preset_name("foo"), "foo 2") def test_available_preset_name_increments_default(self): @@ -905,7 +912,7 @@ def test_should_publish_groups(self): "Foo Device 2": ["gamepad", "keyboard", "mouse"], "Bar Device": ["keyboard"], "gamepad": ["gamepad"], - "Qux/Device?": ["keyboard"], + "Qux/[Device]?": ["keyboard"], }, ) diff --git a/tests/unit/test_groups.py b/tests/unit/test_groups.py index 3f62bdc0c..dbba2d4cb 100644 --- a/tests/unit/test_groups.py +++ b/tests/unit/test_groups.py @@ -135,9 +135,9 @@ def test_find_groups(self): json.dumps( { "paths": ["/dev/input/event52"], - "names": ["Qux/Device?"], + "names": ["Qux/[Device]?"], "types": [DeviceType.KEYBOARD], - "key": "Qux/Device?", + "key": "Qux/[Device]?", } ), ] @@ -157,7 +157,7 @@ def test_list_group_names(self): "Foo Device", "Bar Device", "gamepad", - "Qux/Device?", + "Qux/[Device]?", ], ) diff --git a/tests/unit/test_reader.py b/tests/unit/test_reader.py index c0e0b5e46..f4e02ffb5 100644 --- a/tests/unit/test_reader.py +++ b/tests/unit/test_reader.py @@ -900,9 +900,9 @@ def test_are_new_groups_available(self): json.dumps( { "paths": ["/dev/input/event52"], - "names": ["Qux/Device?"], + "names": ["Qux/[Device]?"], "types": [DeviceType.KEYBOARD], - "key": "Qux/Device?", + "key": "Qux/[Device]?", } ), ]