~ruther/qmk_firmware

90f3d6201a3cc58f7bb0c6d8abd8092a43c968d5 — Joel Challis 2 years ago 0a9d06a
Reduce false positives in layout name validation (#19646)

1 files changed, 27 insertions(+), 12 deletions(-)

M lib/python/qmk/info.py
M lib/python/qmk/info.py => lib/python/qmk/info.py +27 -12
@@ 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