diff options
Diffstat (limited to 'lib/python/qmk')
| -rw-r--r-- | lib/python/qmk/cli/lint.py | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/python/qmk/cli/lint.py b/lib/python/qmk/cli/lint.py index e2c76e4465..484ddb5bd9 100644 --- a/lib/python/qmk/cli/lint.py +++ b/lib/python/qmk/cli/lint.py | |||
| @@ -1,5 +1,6 @@ | |||
| 1 | """Command to look over a keyboard/keymap and check for common mistakes. | 1 | """Command to look over a keyboard/keymap and check for common mistakes. |
| 2 | """ | 2 | """ |
| 3 | from dotty_dict import dotty | ||
| 3 | from pathlib import Path | 4 | from pathlib import Path |
| 4 | 5 | ||
| 5 | from milc import cli | 6 | from milc import cli |
| @@ -11,6 +12,7 @@ from qmk.keymap import locate_keymap, list_keymaps | |||
| 11 | from qmk.path import keyboard | 12 | from qmk.path import keyboard |
| 12 | from qmk.git import git_get_ignored_files | 13 | from qmk.git import git_get_ignored_files |
| 13 | from qmk.c_parse import c_source_files, preprocess_c_file | 14 | from qmk.c_parse import c_source_files, preprocess_c_file |
| 15 | from qmk.json_schema import json_load | ||
| 14 | 16 | ||
| 15 | CHIBIOS_CONF_CHECKS = ['chconf.h', 'halconf.h', 'mcuconf.h', 'board.h'] | 17 | CHIBIOS_CONF_CHECKS = ['chconf.h', 'halconf.h', 'mcuconf.h', 'board.h'] |
| 16 | INVALID_KB_FEATURES = set(['encoder_map', 'dip_switch_map', 'combo', 'tap_dance', 'via']) | 18 | INVALID_KB_FEATURES = set(['encoder_map', 'dip_switch_map', 'combo', 'tap_dance', 'via']) |
| @@ -214,6 +216,32 @@ def _rules_mk_assignment_only(rules_mk): | |||
| 214 | return errors | 216 | return errors |
| 215 | 217 | ||
| 216 | 218 | ||
| 219 | def _handle_duplicating_code_defaults(kb, info): | ||
| 220 | def _collect_dotted_output(kb_info_json, prefix=''): | ||
| 221 | """Print the info.json in a plain text format with dot-joined keys. | ||
| 222 | """ | ||
| 223 | for key in sorted(kb_info_json): | ||
| 224 | new_prefix = f'{prefix}.{key}' if prefix else key | ||
| 225 | |||
| 226 | if isinstance(kb_info_json[key], dict): | ||
| 227 | yield from _collect_dotted_output(kb_info_json[key], new_prefix) | ||
| 228 | elif isinstance(kb_info_json[key], list): | ||
| 229 | # TODO: handle non primitives? | ||
| 230 | yield (new_prefix, kb_info_json[key]) | ||
| 231 | else: | ||
| 232 | yield (new_prefix, kb_info_json[key]) | ||
| 233 | |||
| 234 | defaults_map = json_load(Path('data/mappings/info_defaults.hjson')) | ||
| 235 | dotty_info = dotty(info) | ||
| 236 | |||
| 237 | for key, v_default in _collect_dotted_output(defaults_map): | ||
| 238 | v_info = dotty_info.get(key) | ||
| 239 | if v_default == v_info: | ||
| 240 | cli.log.warning(f'{kb}: Option "{key}" duplicates default value of "{v_default}"') | ||
| 241 | |||
| 242 | return True | ||
| 243 | |||
| 244 | |||
| 217 | def keymap_check(kb, km): | 245 | def keymap_check(kb, km): |
| 218 | """Perform the keymap level checks. | 246 | """Perform the keymap level checks. |
| 219 | """ | 247 | """ |
| @@ -266,6 +294,9 @@ def keyboard_check(kb): # noqa C901 | |||
| 266 | if not _handle_invalid_config(kb, kb_info): | 294 | if not _handle_invalid_config(kb, kb_info): |
| 267 | ok = False | 295 | ok = False |
| 268 | 296 | ||
| 297 | if not _handle_duplicating_code_defaults(kb, kb_info): | ||
| 298 | ok = False | ||
| 299 | |||
| 269 | invalid_files = git_get_ignored_files(f'keyboards/{kb}/') | 300 | invalid_files = git_get_ignored_files(f'keyboards/{kb}/') |
| 270 | for file in invalid_files: | 301 | for file in invalid_files: |
| 271 | if 'keymap' in file: | 302 | if 'keymap' in file: |
