2020-12-30 18:27:37 +00:00
|
|
|
"""Keyboard information script.
|
|
|
|
|
|
|
|
Compile an info.json for a particular keyboard and pretty-print it.
|
|
|
|
"""
|
|
|
|
import json
|
|
|
|
|
2021-01-09 21:34:14 +00:00
|
|
|
from jsonschema import Draft7Validator, validators
|
2020-12-30 18:27:37 +00:00
|
|
|
from milc import cli
|
|
|
|
|
|
|
|
from qmk.decorators import automagic_keyboard, automagic_keymap
|
2021-03-24 16:26:38 +00:00
|
|
|
from qmk.info import info_json
|
2021-03-25 11:38:10 +00:00
|
|
|
from qmk.json_encoders import InfoJSONEncoder
|
2021-03-24 16:26:38 +00:00
|
|
|
from qmk.json_schema import load_jsonschema
|
|
|
|
from qmk.keyboard import keyboard_folder
|
2020-12-30 18:27:37 +00:00
|
|
|
from qmk.path import is_keyboard
|
|
|
|
|
|
|
|
|
2021-01-09 21:34:14 +00:00
|
|
|
def pruning_validator(validator_class):
|
|
|
|
"""Extends Draft7Validator to remove properties that aren't specified in the schema.
|
|
|
|
"""
|
|
|
|
validate_properties = validator_class.VALIDATORS["properties"]
|
|
|
|
|
|
|
|
def remove_additional_properties(validator, properties, instance, schema):
|
|
|
|
for prop in list(instance.keys()):
|
|
|
|
if prop not in properties:
|
|
|
|
del instance[prop]
|
|
|
|
|
|
|
|
for error in validate_properties(validator, properties, instance, schema):
|
|
|
|
yield error
|
|
|
|
|
|
|
|
return validators.extend(validator_class, {"properties": remove_additional_properties})
|
|
|
|
|
|
|
|
|
|
|
|
def strip_info_json(kb_info_json):
|
|
|
|
"""Remove the API-only properties from the info.json.
|
|
|
|
"""
|
|
|
|
pruning_draft_7_validator = pruning_validator(Draft7Validator)
|
2021-03-24 16:26:38 +00:00
|
|
|
schema = load_jsonschema('keyboard')
|
2021-01-09 21:34:14 +00:00
|
|
|
validator = pruning_draft_7_validator(schema).validate
|
|
|
|
|
|
|
|
return validator(kb_info_json)
|
|
|
|
|
|
|
|
|
2021-03-24 16:26:38 +00:00
|
|
|
@cli.argument('-kb', '--keyboard', type=keyboard_folder, help='Keyboard to show info for.')
|
2020-12-30 18:27:37 +00:00
|
|
|
@cli.argument('-km', '--keymap', help='Show the layers for a JSON keymap too.')
|
|
|
|
@cli.subcommand('Generate an info.json file for a keyboard.', hidden=False if cli.config.user.developer else True)
|
|
|
|
@automagic_keyboard
|
|
|
|
@automagic_keymap
|
|
|
|
def generate_info_json(cli):
|
|
|
|
"""Generate an info.json file for a keyboard
|
|
|
|
"""
|
|
|
|
# Determine our keyboard(s)
|
|
|
|
if not cli.config.generate_info_json.keyboard:
|
2021-01-09 21:34:14 +00:00
|
|
|
cli.log.error('Missing parameter: --keyboard')
|
2020-12-30 18:27:37 +00:00
|
|
|
cli.subcommands['info'].print_help()
|
|
|
|
return False
|
|
|
|
|
|
|
|
if not is_keyboard(cli.config.generate_info_json.keyboard):
|
|
|
|
cli.log.error('Invalid keyboard: "%s"', cli.config.generate_info_json.keyboard)
|
|
|
|
return False
|
|
|
|
|
|
|
|
# Build the info.json file
|
|
|
|
kb_info_json = info_json(cli.config.generate_info_json.keyboard)
|
2021-01-09 21:34:14 +00:00
|
|
|
strip_info_json(kb_info_json)
|
2020-12-30 18:27:37 +00:00
|
|
|
|
|
|
|
# Display the results
|
2021-01-09 21:34:14 +00:00
|
|
|
print(json.dumps(kb_info_json, indent=2, cls=InfoJSONEncoder))
|