diff options
Diffstat (limited to 'lib/python/qmk/info.py')
-rw-r--r-- | lib/python/qmk/info.py | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index 815b851474..ffc9d57d68 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -58,8 +58,13 @@ def _get_key_left_position(key): def _find_invalid_encoder_index(info_data): """Perform additional validation of encoders """ - enc_count = len(info_data.get('encoder', {}).get('rotary', [])) - enc_count += len(info_data.get('split', {}).get('encoder', {}).get('right', {}).get('rotary', [])) + enc_left = info_data.get('encoder', {}).get('rotary', []) + enc_right = [] + + if info_data.get('split', {}).get('enabled', False): + enc_right = info_data.get('split', {}).get('encoder', {}).get('right', {}).get('rotary', enc_left) + + enc_count = len(enc_left) + len(enc_right) ret = [] layouts = info_data.get('layouts', {}) @@ -78,6 +83,25 @@ def _find_invalid_encoder_index(info_data): return ret +def _validate_build_target(keyboard, info_data): + """Non schema checks + """ + keyboard_json_path = Path('keyboards') / keyboard / 'keyboard.json' + config_files = find_info_json(keyboard) + + # keyboard.json can only exist at the deepest part of the tree + keyboard_json_count = 0 + for info_file in config_files: + if info_file.name == 'keyboard.json': + keyboard_json_count += 1 + if info_file != keyboard_json_path: + _log_error(info_data, f'Invalid keyboard.json location detected: {info_file}.') + + # Moving forward keyboard.json should be used as a build target + if keyboard_json_count == 0: + _log_warning(info_data, 'Build marker "keyboard.json" not found.') + + def _validate_layouts(keyboard, info_data): # noqa C901 """Non schema checks """ @@ -107,6 +131,15 @@ def _validate_layouts(keyboard, info_data): # noqa C901 if col >= col_num: _log_error(info_data, f'{layout_name}: Matrix column for key {index} ({key_name}) is {col} but must be less than {col_num}') + # Reject duplicate matrix locations + for layout_name, layout_data in layouts.items(): + seen = set() + for index, key_data in enumerate(layout_data['layout']): + key = f"{key_data['matrix']}" + if key in seen: + _log_error(info_data, f'{layout_name}: Matrix location for key {index} is not unique {key_data}') + seen.add(key) + # Warn if physical positions are offset (at least one key should be at x=0, and at least one key at y=0) for layout_name, layout_data in layouts.items(): offset_x = min([_get_key_left_position(k) for k in layout_data['layout']]) @@ -167,6 +200,7 @@ def _validate(keyboard, info_data): validate(info_data, 'qmk.api.keyboard.v1') # Additional validation + _validate_build_target(keyboard, info_data) _validate_layouts(keyboard, info_data) _validate_keycodes(keyboard, info_data) _validate_encoders(keyboard, info_data) @@ -375,6 +409,12 @@ def _extract_encoders(info_data, config_c): info_data['encoder']['rotary'] = encoders + # TODO: some logic still assumes ENCODER_ENABLED would partially create encoder dict + if info_data.get('features', {}).get('encoder', False): + if 'encoder' not in info_data: + info_data['encoder'] = {} + info_data['encoder']['enabled'] = True + def _extract_split_encoders(info_data, config_c): """Populate data about split encoder pins @@ -868,7 +908,9 @@ def unknown_processor_rules(info_data, rules): def merge_info_jsons(keyboard, info_data): """Return a merged copy of all the info.json files for a keyboard. """ - for info_file in find_info_json(keyboard): + config_files = find_info_json(keyboard) + + for info_file in config_files: # Load and validate the JSON data new_info_data = json_load(info_file) @@ -926,7 +968,7 @@ def find_info_json(keyboard): base_path = Path('keyboards') keyboard_path = base_path / keyboard keyboard_parent = keyboard_path.parent - info_jsons = [keyboard_path / 'info.json'] + info_jsons = [keyboard_path / 'info.json', keyboard_path / 'keyboard.json'] # Add DEFAULT_FOLDER before parents, if present rules = rules_mk(keyboard) @@ -938,6 +980,7 @@ def find_info_json(keyboard): if keyboard_parent == base_path: break info_jsons.append(keyboard_parent / 'info.json') + info_jsons.append(keyboard_parent / 'keyboard.json') keyboard_parent = keyboard_parent.parent # Return a list of the info.json files that actually exist |