Browse Source

Reduce false positives in layout name validation (#19646)

Joel Challis 3 years ago
parent
commit
90f3d6201a
1 changed files with 27 additions and 12 deletions
  1. 27 12
      lib/python/qmk/info.py

+ 27 - 12
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