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
This commit is contained in:
parent
723d9af04d
commit
299008be36
18 changed files with 614 additions and 106 deletions
|
@ -1,17 +1,15 @@
|
|||
"""Functions that help us generate and use info.json files.
|
||||
"""
|
||||
import json
|
||||
from collections.abc import Mapping
|
||||
from glob import glob
|
||||
from pathlib import Path
|
||||
|
||||
import hjson
|
||||
import jsonschema
|
||||
from dotty_dict import dotty
|
||||
from milc import cli
|
||||
|
||||
from qmk.constants import CHIBIOS_PROCESSORS, LUFA_PROCESSORS, VUSB_PROCESSORS
|
||||
from qmk.c_parse import find_layouts
|
||||
from qmk.json_schema import deep_update, json_load, keyboard_validate, keyboard_api_validate
|
||||
from qmk.keyboard import config_h, rules_mk
|
||||
from qmk.keymap import list_keymaps
|
||||
from qmk.makefile import parse_rules_mk_file
|
||||
|
@ -82,52 +80,6 @@ def info_json(keyboard):
|
|||
return info_data
|
||||
|
||||
|
||||
def _json_load(json_file):
|
||||
"""Load a json file from disk.
|
||||
|
||||
Note: file must be a Path object.
|
||||
"""
|
||||
try:
|
||||
return hjson.load(json_file.open(encoding='utf-8'))
|
||||
|
||||
except json.decoder.JSONDecodeError as e:
|
||||
cli.log.error('Invalid JSON encountered attempting to load {fg_cyan}%s{fg_reset}:\n\t{fg_red}%s', json_file, e)
|
||||
exit(1)
|
||||
|
||||
|
||||
def _jsonschema(schema_name):
|
||||
"""Read a jsonschema file from disk.
|
||||
|
||||
FIXME(skullydazed/anyone): Refactor to make this a public function.
|
||||
"""
|
||||
schema_path = Path(f'data/schemas/{schema_name}.jsonschema')
|
||||
|
||||
if not schema_path.exists():
|
||||
schema_path = Path('data/schemas/false.jsonschema')
|
||||
|
||||
return _json_load(schema_path)
|
||||
|
||||
|
||||
def keyboard_validate(data):
|
||||
"""Validates data against the keyboard jsonschema.
|
||||
"""
|
||||
schema = _jsonschema('keyboard')
|
||||
validator = jsonschema.Draft7Validator(schema).validate
|
||||
|
||||
return validator(data)
|
||||
|
||||
|
||||
def keyboard_api_validate(data):
|
||||
"""Validates data against the api_keyboard jsonschema.
|
||||
"""
|
||||
base = _jsonschema('keyboard')
|
||||
relative = _jsonschema('api_keyboard')
|
||||
resolver = jsonschema.RefResolver.from_schema(base)
|
||||
validator = jsonschema.Draft7Validator(relative, resolver=resolver).validate
|
||||
|
||||
return validator(data)
|
||||
|
||||
|
||||
def _extract_features(info_data, rules):
|
||||
"""Find all the features enabled in rules.mk.
|
||||
"""
|
||||
|
@ -258,7 +210,7 @@ def _extract_config_h(info_data):
|
|||
|
||||
# Pull in data from the json map
|
||||
dotty_info = dotty(info_data)
|
||||
info_config_map = _json_load(Path('data/mappings/info_config.json'))
|
||||
info_config_map = json_load(Path('data/mappings/info_config.json'))
|
||||
|
||||
for config_key, info_dict in info_config_map.items():
|
||||
info_key = info_dict['info_key']
|
||||
|
@ -326,7 +278,7 @@ def _extract_rules_mk(info_data):
|
|||
|
||||
# Pull in data from the json map
|
||||
dotty_info = dotty(info_data)
|
||||
info_rules_map = _json_load(Path('data/mappings/info_rules.json'))
|
||||
info_rules_map = json_load(Path('data/mappings/info_rules.json'))
|
||||
|
||||
for rules_key, info_dict in info_rules_map.items():
|
||||
info_key = info_dict['info_key']
|
||||
|
@ -516,25 +468,12 @@ def unknown_processor_rules(info_data, rules):
|
|||
return info_data
|
||||
|
||||
|
||||
def deep_update(origdict, newdict):
|
||||
"""Update a dictionary in place, recursing to do a deep copy.
|
||||
"""
|
||||
for key, value in newdict.items():
|
||||
if isinstance(value, Mapping):
|
||||
origdict[key] = deep_update(origdict.get(key, {}), value)
|
||||
|
||||
else:
|
||||
origdict[key] = value
|
||||
|
||||
return origdict
|
||||
|
||||
|
||||
def merge_info_jsons(keyboard, info_data):
|
||||
"""Return a merged copy of all the info.json files for a keyboard.
|
||||
"""
|
||||
for info_file in find_info_json(keyboard):
|
||||
# Load and validate the JSON data
|
||||
new_info_data = _json_load(info_file)
|
||||
new_info_data = json_load(info_file)
|
||||
|
||||
if not isinstance(new_info_data, dict):
|
||||
_log_error(info_data, "Invalid file %s, root object should be a dictionary." % (str(info_file),))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue