Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reduce false positives in layout name validation #19646

Merged
merged 1 commit into from
Feb 11, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 27 additions & 12 deletions lib/python/qmk/info.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -17,15 +18,30 @@
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):
Expand Down Expand Up @@ -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
Expand Down