From f859a0d90cbaf3b5ee9e092a001856c3ee2ad306 Mon Sep 17 00:00:00 2001 From: sschulz92 Date: Wed, 3 Sep 2025 11:04:27 +0200 Subject: [PATCH 1/3] Normalize paths to avoid case-sensitivity on Windows Signed-off-by: sschulz92 --- getgauge/registry.py | 26 ++++++++++++++++++-------- tests/test_registry.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/getgauge/registry.py b/getgauge/registry.py index 0afc452..8d28796 100644 --- a/getgauge/registry.py +++ b/getgauge/registry.py @@ -171,34 +171,39 @@ def is_continue_on_failure(self, func, exception): def get_step_positions(self, file_name): positions = [] for step, infos in self.__steps_map.items(): - positions = positions + [{'stepValue': step, 'span': i.span} - for i in infos if i.file_name == file_name] + positions.extend( + [{'stepValue': step, 'span': i.span} + for i in infos if paths_equal(i.file_name, file_name)] + ) return positions def _get_all_hooks(self, file_name): all_hooks = [] for hook in self.hooks: - all_hooks = all_hooks + \ - [h for h in getattr(self, "__{}".format(hook)) - if h.file_name == file_name] + all_hooks.extend( + [h for h in getattr(self, "__{}".format(hook)) + if paths_equal(h.file_name, file_name)] + ) return all_hooks def get_all_methods_in(self, file_name): methods = [] for _, infos in self.__steps_map.items(): - methods = methods + [i for i in infos if i.file_name == file_name] + methods.extend( + [i for i in infos if paths_equal(i.file_name, file_name)] + ) return methods + self._get_all_hooks(file_name) def is_file_cached(self, file_name): for _, infos in self.__steps_map.items(): - if any(i.file_name == file_name for i in infos): + if any(paths_equal(i.file_name, file_name) for i in infos): return True return False def remove_steps(self, file_name): new_map = {} for step, infos in self.__steps_map.items(): - filtered_info = [i for i in infos if i.file_name != file_name] + filtered_info = [i for i in infos if not paths_equal(i.file_name, file_name)] if len(filtered_info) > 0: new_map[step] = filtered_info self.__steps_map = new_map @@ -209,6 +214,11 @@ def clear(self): setattr(self, '__{}'.format(hook), []) +def paths_equal(first_file_path, second_file_path) -> bool: + """ Normalize paths in order to compare them. """ + return os.path.normcase(str(first_file_path)) == os.path.normcase(str(second_file_path)) + + def _filter_hooks(tags, hooks): filtered_hooks = [] for hook in hooks: diff --git a/tests/test_registry.py b/tests/test_registry.py index 9bf4c88..c904275 100644 --- a/tests/test_registry.py +++ b/tests/test_registry.py @@ -1,4 +1,5 @@ import re +import sys import unittest from getgauge.registry import Registry @@ -361,6 +362,38 @@ def test_Registry_get_all_methods_in_should_give_all_the_methods_define_in_that_ self.assertEqual(3, len(registry.get_all_methods_in("foo.py"))) self.assertEqual(2, len(registry.get_all_methods_in("bar.py"))) + @unittest.skipIf(not sys.platform.startswith("win"), "Test is designed to cover Windows like paths") + def test_Registry_get_all_methods_in_should_handle_paths_case_sensitive(self): + lower_c_drive = 'c:/random/path/foo.py' + upper_c_drive = 'C:/random/path/foo.py' + + step_infos = [ + {'text': 'Foo', 'func': 'func1', 'file_name': lower_c_drive}, + {'text': 'Foo <>', 'func': 'func2', 'file_name': upper_c_drive} + ] + for info in step_infos: + registry.add_step(info['text'], info['func'], info['file_name']) + + """ Note: we should find both steps regardless the different spelling as the path is in fact equal! """ + self.assertEqual(2, len(registry.get_all_methods_in(lower_c_drive))) + self.assertEqual(2, len(registry.get_all_methods_in(upper_c_drive))) + + @unittest.skipIf(sys.platform.startswith("win"), "Fails on Windows due to case sensitivity") + def test_Registry_get_all_methods_in_should_handle_paths_case_sensitive_on_mac(self): + path1 = '/random/path/foo.py' + path2 = '/random/PATH/foo.py' + + step_infos = [ + {'text': 'Foo', 'func': 'func1', 'file_name': path1}, + {'text': 'Foo <>', 'func': 'func2', 'file_name': path2} + ] + for info in step_infos: + registry.add_step(info['text'], info['func'], info['file_name']) + + """ Note: since the paths are in fact different, they should be treated as different paths! """ + self.assertEqual(1, len(registry.get_all_methods_in(path1))) + self.assertEqual(1, len(registry.get_all_methods_in(path2))) + def tearDown(self): global registry registry = Registry() From 9a39fb11b0accaf08dca410c2d2525e0adf14621 Mon Sep 17 00:00:00 2001 From: sschulz92 Date: Wed, 3 Sep 2025 14:14:27 +0200 Subject: [PATCH 2/3] Adjust formatting to retrigger tests Signed-off-by: sschulz92 --- getgauge/registry.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/getgauge/registry.py b/getgauge/registry.py index 8d28796..70100fc 100644 --- a/getgauge/registry.py +++ b/getgauge/registry.py @@ -172,8 +172,7 @@ def get_step_positions(self, file_name): positions = [] for step, infos in self.__steps_map.items(): positions.extend( - [{'stepValue': step, 'span': i.span} - for i in infos if paths_equal(i.file_name, file_name)] + [{'stepValue': step, 'span': i.span} for i in infos if paths_equal(i.file_name, file_name)] ) return positions @@ -181,8 +180,7 @@ def _get_all_hooks(self, file_name): all_hooks = [] for hook in self.hooks: all_hooks.extend( - [h for h in getattr(self, "__{}".format(hook)) - if paths_equal(h.file_name, file_name)] + [h for h in getattr(self, "__{}".format(hook)) if paths_equal(h.file_name, file_name)] ) return all_hooks @@ -214,7 +212,7 @@ def clear(self): setattr(self, '__{}'.format(hook), []) -def paths_equal(first_file_path, second_file_path) -> bool: +def paths_equal(first_file_path, second_file_path): """ Normalize paths in order to compare them. """ return os.path.normcase(str(first_file_path)) == os.path.normcase(str(second_file_path)) From 7c5bb73b87d32d08c854ccc673d2cbdf5a16bb2b Mon Sep 17 00:00:00 2001 From: sschulz92 Date: Tue, 16 Sep 2025 07:52:17 +0200 Subject: [PATCH 3/3] Increase plugin version Signed-off-by: sschulz92 --- python.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python.json b/python.json index 3835611..839bb92 100644 --- a/python.json +++ b/python.json @@ -1,6 +1,6 @@ { "id": "python", - "version": "0.4.11", + "version": "0.4.12", "description": "Python support for gauge", "run": { "windows": [