aboutsummaryrefslogtreecommitdiff
path: root/lib/python/qmk/info.py
diff options
context:
space:
mode:
authorZach White <skullydazed@gmail.com>2021-03-24 09:26:38 -0700
committerGitHub <noreply@github.com>2021-03-24 09:26:38 -0700
commit299008be36076343edadb7a36bf2fff820425ad1 (patch)
treed47d2fddc54b329b4ddb3128ef070b4cdba776a4 /lib/python/qmk/info.py
parent723d9af04d610c4a2fcb8fcf39e8420c71ed4df0 (diff)
downloadqmk_firmware-299008be36076343edadb7a36bf2fff820425ad1.tar.gz
qmk_firmware-299008be36076343edadb7a36bf2fff820425ad1.zip
Add support for qmk_configurator style aliases (#11954)
* Add support for qmk_configurator style aliases * add the keyboard aliases to the api data * add support for a keyboard metadata file * make flake8 happy
Diffstat (limited to 'lib/python/qmk/info.py')
-rw-r--r--lib/python/qmk/info.py69
1 files changed, 4 insertions, 65 deletions
diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py
index 60d3a0132..e2350b7f7 100644
--- a/lib/python/qmk/info.py
+++ b/lib/python/qmk/info.py
@@ -1,17 +1,15 @@
1"""Functions that help us generate and use info.json files. 1"""Functions that help us generate and use info.json files.
2""" 2"""
3import json
4from collections.abc import Mapping
5from glob import glob 3from glob import glob
6from pathlib import Path 4from pathlib import Path
7 5
8import hjson
9import jsonschema 6import jsonschema
10from dotty_dict import dotty 7from dotty_dict import dotty
11from milc import cli 8from milc import cli
12 9
13from qmk.constants import CHIBIOS_PROCESSORS, LUFA_PROCESSORS, VUSB_PROCESSORS 10from qmk.constants import CHIBIOS_PROCESSORS, LUFA_PROCESSORS, VUSB_PROCESSORS
14from qmk.c_parse import find_layouts 11from qmk.c_parse import find_layouts
12from qmk.json_schema import deep_update, json_load, keyboard_validate, keyboard_api_validate
15from qmk.keyboard import config_h, rules_mk 13from qmk.keyboard import config_h, rules_mk
16from qmk.keymap import list_keymaps 14from qmk.keymap import list_keymaps
17from qmk.makefile import parse_rules_mk_file 15from qmk.makefile import parse_rules_mk_file
@@ -82,52 +80,6 @@ def info_json(keyboard):
82 return info_data 80 return info_data
83 81
84 82
85def _json_load(json_file):
86 """Load a json file from disk.
87
88 Note: file must be a Path object.
89 """
90 try:
91 return hjson.load(json_file.open(encoding='utf-8'))
92
93 except json.decoder.JSONDecodeError as e:
94 cli.log.error('Invalid JSON encountered attempting to load {fg_cyan}%s{fg_reset}:\n\t{fg_red}%s', json_file, e)
95 exit(1)
96
97
98def _jsonschema(schema_name):
99 """Read a jsonschema file from disk.
100
101 FIXME(skullydazed/anyone): Refactor to make this a public function.
102 """
103 schema_path = Path(f'data/schemas/{schema_name}.jsonschema')
104
105 if not schema_path.exists():
106 schema_path = Path('data/schemas/false.jsonschema')
107
108 return _json_load(schema_path)
109
110
111def keyboard_validate(data):
112 """Validates data against the keyboard jsonschema.
113 """
114 schema = _jsonschema('keyboard')
115 validator = jsonschema.Draft7Validator(schema).validate
116
117 return validator(data)
118
119
120def keyboard_api_validate(data):
121 """Validates data against the api_keyboard jsonschema.
122 """
123 base = _jsonschema('keyboard')
124 relative = _jsonschema('api_keyboard')
125 resolver = jsonschema.RefResolver.from_schema(base)
126 validator = jsonschema.Draft7Validator(relative, resolver=resolver).validate
127
128 return validator(data)
129
130
131def _extract_features(info_data, rules): 83def _extract_features(info_data, rules):
132 """Find all the features enabled in rules.mk. 84 """Find all the features enabled in rules.mk.
133 """ 85 """
@@ -258,7 +210,7 @@ def _extract_config_h(info_data):
258 210
259 # Pull in data from the json map 211 # Pull in data from the json map
260 dotty_info = dotty(info_data) 212 dotty_info = dotty(info_data)
261 info_config_map = _json_load(Path('data/mappings/info_config.json')) 213 info_config_map = json_load(Path('data/mappings/info_config.json'))
262 214
263 for config_key, info_dict in info_config_map.items(): 215 for config_key, info_dict in info_config_map.items():
264 info_key = info_dict['info_key'] 216 info_key = info_dict['info_key']
@@ -326,7 +278,7 @@ def _extract_rules_mk(info_data):
326 278
327 # Pull in data from the json map 279 # Pull in data from the json map
328 dotty_info = dotty(info_data) 280 dotty_info = dotty(info_data)
329 info_rules_map = _json_load(Path('data/mappings/info_rules.json')) 281 info_rules_map = json_load(Path('data/mappings/info_rules.json'))
330 282
331 for rules_key, info_dict in info_rules_map.items(): 283 for rules_key, info_dict in info_rules_map.items():
332 info_key = info_dict['info_key'] 284 info_key = info_dict['info_key']
@@ -516,25 +468,12 @@ def unknown_processor_rules(info_data, rules):
516 return info_data 468 return info_data
517 469
518 470
519def deep_update(origdict, newdict):
520 """Update a dictionary in place, recursing to do a deep copy.
521 """
522 for key, value in newdict.items():
523 if isinstance(value, Mapping):
524 origdict[key] = deep_update(origdict.get(key, {}), value)
525
526 else:
527 origdict[key] = value
528
529 return origdict
530
531
532def merge_info_jsons(keyboard, info_data): 471def merge_info_jsons(keyboard, info_data):
533 """Return a merged copy of all the info.json files for a keyboard. 472 """Return a merged copy of all the info.json files for a keyboard.
534 """ 473 """
535 for info_file in find_info_json(keyboard): 474 for info_file in find_info_json(keyboard):
536 # Load and validate the JSON data 475 # Load and validate the JSON data
537 new_info_data = _json_load(info_file) 476 new_info_data = json_load(info_file)
538 477
539 if not isinstance(new_info_data, dict): 478 if not isinstance(new_info_data, dict):
540 _log_error(info_data, "Invalid file %s, root object should be a dictionary." % (str(info_file),)) 479 _log_error(info_data, "Invalid file %s, root object should be a dictionary." % (str(info_file),))