From 90f3d6201a3cc58f7bb0c6d8abd8092a43c968d5 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Sat, 11 Feb 2023 20:36:11 +0000 Subject: [PATCH] Reduce false positives in layout name validation (#19646) --- lib/python/qmk/info.py | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py index e73d825696..152e6ce7b6 100644 --- a/lib/python/qmk/info.py +++ b/lib/python/qmk/info.py @@ -1,9 +1,10 @@ """Functions that help us generate and use info.json files. """ +import re from pathlib import Path - import jsonschema from dotty_dict import dotty + from milc import cli from qmk.constants import CHIBIOS_PROCESSORS, LUFA_PROCESSORS, VUSB_PROCESSORS @@ -17,15 +18,30 @@ from qmk.math import compute true_values = ['1', 'on', 'yes'] false_values = ['0', 'off', 'no'] -# TODO: reduce this list down -SAFE_LAYOUT_TOKENS = { - 'ansi', - 'iso', - 'wkl', - 'tkl', - 'preonic', - 'planck', -} + +def _keyboard_in_layout_name(keyboard, layout): + """Validate that a layout macro does not contain name of keyboard + """ + # TODO: reduce this list down + safe_layout_tokens = { + 'ansi', + 'iso', + 'jp', + 'jis', + 'ortho', + 'wkl', + 'tkl', + 'preonic', + 'planck', + } + + # Ignore tokens like 'split_3x7_4' or just '2x4' + layout = re.sub(r"_split_\d+x\d+_\d+", '', layout) + layout = re.sub(r"_\d+x\d+", '', layout) + + name_fragments = set(keyboard.split('/')) - safe_layout_tokens + + return any(fragment in layout for fragment in name_fragments) def _valid_community_layout(layout): @@ -60,10 +76,9 @@ def _validate(keyboard, info_data): _log_warning(info_data, '"LAYOUT_all" should be "LAYOUT" unless additional layouts are provided.') # Extended layout name checks - ignoring community_layouts and "safe" values - name_fragments = set(keyboard.split('/')) - SAFE_LAYOUT_TOKENS potential_layouts = set(layouts.keys()) - set(community_layouts_names) for layout in potential_layouts: - if any(fragment in layout for fragment in name_fragments): + if _keyboard_in_layout_name(keyboard, layout): _log_warning(info_data, f'Layout "{layout}" should not contain name of keyboard.') # Filter out any non-existing community layouts