Browse Source

Improve LAYOUT macro searching (#9530)

* Improve LAYOUT macro searching

* Apply suggestions from code review

Co-authored-by: Zach White <skullydazed@users.noreply.github.com>

* Adjust signature

* Try to copy the makefile's handling of DEFAULT_FOLDER

* Move it further up, into `info_json()`

* Move it even further up so that keyboard_folder is correct

* Update lib/python/qmk/info.py

Co-authored-by: Zach White <skullydazed@drpepper.org>

* Update lib/python/qmk/info.py

Co-authored-by: Zach White <skullydazed@drpepper.org>

Co-authored-by: Zach White <skullydazed@users.noreply.github.com>
Co-authored-by: Zach White <skullydazed@drpepper.org>
Ryan 4 years ago
parent
commit
c9a06965c9
1 changed files with 19 additions and 10 deletions
  1. 19 10
      lib/python/qmk/info.py

+ 19 - 10
lib/python/qmk/info.py

@@ -9,12 +9,19 @@ from milc import cli
 from qmk.constants import ARM_PROCESSORS, AVR_PROCESSORS, VUSB_PROCESSORS
 from qmk.constants import ARM_PROCESSORS, AVR_PROCESSORS, VUSB_PROCESSORS
 from qmk.c_parse import find_layouts
 from qmk.c_parse import find_layouts
 from qmk.keyboard import config_h, rules_mk
 from qmk.keyboard import config_h, rules_mk
+from qmk.makefile import parse_rules_mk_file
 from qmk.math import compute
 from qmk.math import compute
 
 
 
 
 def info_json(keyboard):
 def info_json(keyboard):
     """Generate the info.json data for a specific keyboard.
     """Generate the info.json data for a specific keyboard.
     """
     """
+    cur_dir = Path('keyboards')
+    rules = parse_rules_mk_file(cur_dir / keyboard / 'rules.mk')
+    if 'DEFAULT_FOLDER' in rules:
+        keyboard = rules['DEFAULT_FOLDER']
+        rules = parse_rules_mk_file(cur_dir / keyboard / 'rules.mk', rules)
+
     info_data = {
     info_data = {
         'keyboard_name': str(keyboard),
         'keyboard_name': str(keyboard),
         'keyboard_folder': str(keyboard),
         'keyboard_folder': str(keyboard),
@@ -22,7 +29,7 @@ def info_json(keyboard):
         'maintainer': 'qmk',
         'maintainer': 'qmk',
     }
     }
 
 
-    for layout_name, layout_json in _find_all_layouts(keyboard).items():
+    for layout_name, layout_json in _find_all_layouts(keyboard, rules).items():
         if not layout_name.startswith('LAYOUT_kc'):
         if not layout_name.startswith('LAYOUT_kc'):
             info_data['layouts'][layout_name] = layout_json
             info_data['layouts'][layout_name] = layout_json
 
 
@@ -99,22 +106,24 @@ def _extract_rules_mk(info_data):
     return info_data
     return info_data
 
 
 
 
-def _find_all_layouts(keyboard):
-    """Looks for layout macros associated with this keyboard.
-    """
-    layouts = {}
-    rules = rules_mk(keyboard)
-    keyboard_path = Path(rules.get('DEFAULT_FOLDER', keyboard))
-
-    # Pull in all layouts defined in the standard files
+def _search_keyboard_h(path):
     current_path = Path('keyboards/')
     current_path = Path('keyboards/')
-    for directory in keyboard_path.parts:
+    layouts = {}
+    for directory in path.parts:
         current_path = current_path / directory
         current_path = current_path / directory
         keyboard_h = '%s.h' % (directory,)
         keyboard_h = '%s.h' % (directory,)
         keyboard_h_path = current_path / keyboard_h
         keyboard_h_path = current_path / keyboard_h
         if keyboard_h_path.exists():
         if keyboard_h_path.exists():
             layouts.update(find_layouts(keyboard_h_path))
             layouts.update(find_layouts(keyboard_h_path))
 
 
+    return layouts
+
+
+def _find_all_layouts(keyboard, rules):
+    """Looks for layout macros associated with this keyboard.
+    """
+    layouts = _search_keyboard_h(Path(keyboard))
+
     if not layouts:
     if not layouts:
         # If we didn't find any layouts above we widen our search. This is error
         # If we didn't find any layouts above we widen our search. This is error
         # prone which is why we want to encourage people to follow the standard above.
         # prone which is why we want to encourage people to follow the standard above.