From 40779102ccff1bb56722e4bff448acc35c164619 Mon Sep 17 00:00:00 2001 From: gchqdev227 <62302861+gchqdev227@users.noreply.github.com> Date: Mon, 17 Aug 2026 13:41:00 +0100 Subject: [PATCH 1/2] Lightly refactored 'import_classes_from_module' function to fix typing issues --- concoursetools/importing.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/concoursetools/importing.py b/concoursetools/importing.py index 05d5b9e..1be5201 100644 --- a/concoursetools/importing.py +++ b/concoursetools/importing.py @@ -57,17 +57,16 @@ def import_classes_from_module(file_path: Path, parent_class: type[T]) -> dict[s import_path = file_path_to_import_path(file_path) module = import_py_file(import_path, file_path) - possible_resource_classes = {} + possible_resource_classes: dict[str, type[T]] = {} for _, cls in inspect.getmembers(module, predicate=inspect.isclass): - try: - class_is_subclass_of_parent = issubclass(cls, parent_class) - except TypeError: - class_is_subclass_of_parent = False + + if not issubclass(cls, parent_class): + continue class_is_defined_in_this_module = (cls.__module__ == import_path) class_is_not_private = (not cls.__name__.startswith("_")) - if class_is_subclass_of_parent and class_is_defined_in_this_module and class_is_not_private: + if class_is_defined_in_this_module and class_is_not_private: possible_resource_classes[cls.__name__] = cls return possible_resource_classes From e230d549728d8f71d07b26d5950ce9a1c22da0a8 Mon Sep 17 00:00:00 2001 From: gchqdev227 <62302861+gchqdev227@users.noreply.github.com> Date: Mon, 17 Aug 2026 14:16:53 +0100 Subject: [PATCH 2/2] Fixed missing try/except block --- concoursetools/importing.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/concoursetools/importing.py b/concoursetools/importing.py index 1be5201..f053bf4 100644 --- a/concoursetools/importing.py +++ b/concoursetools/importing.py @@ -60,7 +60,11 @@ def import_classes_from_module(file_path: Path, parent_class: type[T]) -> dict[s possible_resource_classes: dict[str, type[T]] = {} for _, cls in inspect.getmembers(module, predicate=inspect.isclass): - if not issubclass(cls, parent_class): + try: + if not issubclass(cls, parent_class): + continue + except TypeError: + # This can fail in Python 3.10 continue class_is_defined_in_this_module = (cls.__module__ == import_path)