From d7e374be12abc7b7e9dd59f34d830b421787911b Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Wed, 29 Jan 2025 23:57:43 +1100 Subject: [PATCH] Allow for modules in subdirectories. --- lib/python/qmk/community_modules.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/lib/python/qmk/community_modules.py b/lib/python/qmk/community_modules.py index 49cde79c7a..3357dd3b61 100644 --- a/lib/python/qmk/community_modules.py +++ b/lib/python/qmk/community_modules.py @@ -5,6 +5,7 @@ from milc.attrdict import AttrDict from qmk.json_schema import json_load, validate from qmk.util import truthy from qmk.constants import QMK_FIRMWARE, QMK_USERSPACE, HAS_QMK_USERSPACE +from qmk.path import is_under_qmk_firmware, is_under_qmk_userspace COMMUNITY_MODULE_JSON_FILENAME = 'qmk_module.json' @@ -32,19 +33,31 @@ MODULE_API_LIST = [ MODULE_API_VERSION = '20250122' -def find_module_path(module): - """Find a module by name. +def find_available_module_paths(): + """Find all available modules. """ search_dirs = [] if HAS_QMK_USERSPACE: search_dirs.append(QMK_USERSPACE / 'modules') search_dirs.append(QMK_FIRMWARE / 'modules') + modules = [] for search_dir in search_dirs: - module_path = search_dir / module - if module_path.exists() and (module_path / COMMUNITY_MODULE_JSON_FILENAME).exists(): - return module_path + for module_json_path in search_dir.rglob(COMMUNITY_MODULE_JSON_FILENAME): + modules.append(module_json_path.parent) + return modules + +def find_module_path(module): + """Find a module by name. + """ + for module_path in find_available_module_paths(): + try: + p = module_path.resolve(strict=True) + except OSError: + continue + if (is_under_qmk_firmware(p) or is_under_qmk_userspace(p)) and str(p.as_posix())[-len(module):] == module: # allow for a `modules/` relative path to be specified, such as `qmk/hello_world` + return module_path return None