summaryrefslogtreecommitdiff
path: root/lib/python/qmk/info.py
diff options
context:
space:
mode:
authorZach White <skullydazed@gmail.com>2020-11-07 09:56:08 -0800
committerDrashna Jael're <drashna@live.com>2021-01-12 22:43:34 -0800
commit781cc0ed5161446ba2df6222b6c7568a4a5b2109 (patch)
treef506f9d169dfab93acd83bf700702bbb58ec397b /lib/python/qmk/info.py
parent838dfcf7cc073fce4bf7b0476ed1193dc3fd38fa (diff)
New command: qmk lint (#10761)
* Basic qmk lint command * check for keymap readme * change the workflow from qmk info to qmk lint * add a strict mode * parsing -> parse * document qmk lint * small info logging cleanup * Apply suggestions from code review Co-authored-by: Ryan <fauxpark@gmail.com> * honor --strict in more places * change the job name to lint Co-authored-by: Ryan <fauxpark@gmail.com>
Diffstat (limited to 'lib/python/qmk/info.py')
-rw-r--r--lib/python/qmk/info.py48
1 files changed, 36 insertions, 12 deletions
diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py
index 0e540c00a8..e8a44a33f9 100644
--- a/lib/python/qmk/info.py
+++ b/lib/python/qmk/info.py
@@ -26,10 +26,17 @@ def info_json(keyboard):
'keyboard_name': str(keyboard),
'keyboard_folder': str(keyboard),
'layouts': {},
+ 'parse_errors': [],
+ 'parse_warnings': [],
'maintainer': 'qmk',
}
- for layout_name, layout_json in _find_all_layouts(keyboard, rules).items():
+ # Populate the list of JSON keymaps
+ for keymap in list_keymaps(keyboard, c=False, fullpath=True):
+ info_data['keymaps'][keymap.name] = {'url': f'https://raw.githubusercontent.com/qmk/qmk_firmware/master/{keymap}/keymap.json'}
+
+ # Populate layout data
+ for layout_name, layout_json in _find_all_layouts(info_data, keyboard, rules).items():
if not layout_name.startswith('LAYOUT_kc'):
info_data['layouts'][layout_name] = layout_json
@@ -96,14 +103,16 @@ def _extract_rules_mk(info_data):
mcu = rules.get('MCU')
if mcu in CHIBIOS_PROCESSORS:
- arm_processor_rules(info_data, rules)
+ return arm_processor_rules(info_data, rules)
+
elif mcu in LUFA_PROCESSORS + VUSB_PROCESSORS:
- avr_processor_rules(info_data, rules)
- else:
- cli.log.warning("%s: Unknown MCU: %s" % (info_data['keyboard_folder'], mcu))
- unknown_processor_rules(info_data, rules)
+ return avr_processor_rules(info_data, rules)
- return info_data
+ msg = "Unknown MCU: " + str(mcu)
+
+ _log_warning(info_data, msg)
+
+ return unknown_processor_rules(info_data, rules)
def _search_keyboard_h(path):
@@ -119,7 +128,7 @@ def _search_keyboard_h(path):
return layouts
-def _find_all_layouts(keyboard, rules):
+def _find_all_layouts(info_data, keyboard, rules):
"""Looks for layout macros associated with this keyboard.
"""
layouts = _search_keyboard_h(Path(keyboard))
@@ -127,7 +136,7 @@ def _find_all_layouts(keyboard, rules):
if not layouts:
# 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.
- cli.log.warning('%s: Falling back to searching for KEYMAP/LAYOUT macros.' % (keyboard))
+ _log_warning(info_data, 'Falling back to searching for KEYMAP/LAYOUT macros.')
for file in glob('keyboards/%s/*.h' % keyboard):
if file.endswith('.h'):
these_layouts = find_layouts(file)
@@ -145,11 +154,25 @@ def _find_all_layouts(keyboard, rules):
supported_layouts.remove(layout_name)
if supported_layouts:
- cli.log.error('%s: Missing LAYOUT() macro for %s' % (keyboard, ', '.join(supported_layouts)))
+ _log_error(info_data, 'Missing LAYOUT() macro for %s' % (', '.join(supported_layouts)))
return layouts
+def _log_error(info_data, message):
+ """Send an error message to both JSON and the log.
+ """
+ info_data['parse_errors'].append(message)
+ cli.log.error('%s: %s', info_data.get('keyboard_folder', 'Unknown Keyboard!'), message)
+
+
+def _log_warning(info_data, message):
+ """Send a warning message to both JSON and the log.
+ """
+ info_data['parse_warnings'].append(message)
+ cli.log.warning('%s: %s', info_data.get('keyboard_folder', 'Unknown Keyboard!'), message)
+
+
def arm_processor_rules(info_data, rules):
"""Setup the default info for an ARM board.
"""
@@ -208,7 +231,7 @@ def merge_info_jsons(keyboard, info_data):
new_info_data = json.load(info_fd)
if not isinstance(new_info_data, dict):
- cli.log.error("Invalid file %s, root object should be a dictionary.", str(info_file))
+ _log_error(info_data, "Invalid file %s, root object should be a dictionary.", str(info_file))
continue
# Copy whitelisted keys into `info_data`
@@ -222,7 +245,8 @@ def merge_info_jsons(keyboard, info_data):
# Only pull in layouts we have a macro for
if layout_name in info_data['layouts']:
if info_data['layouts'][layout_name]['key_count'] != len(json_layout['layout']):
- cli.log.error('%s: %s: Number of elements in info.json does not match! info.json:%s != %s:%s', info_data['keyboard_folder'], layout_name, len(json_layout['layout']), layout_name, len(info_data['layouts'][layout_name]['layout']))
+ msg = '%s: Number of elements in info.json does not match! info.json:%s != %s:%s'
+ _log_error(info_data, msg % (layout_name, len(json_layout['layout']), layout_name, len(info_data['layouts'][layout_name]['layout'])))
else:
for i, key in enumerate(info_data['layouts'][layout_name]['layout']):
key.update(json_layout['layout'][i])