aboutsummaryrefslogtreecommitdiff
path: root/lib/python/qmk/cli/generate/info_json.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python/qmk/cli/generate/info_json.py')
-rwxr-xr-xlib/python/qmk/cli/generate/info_json.py65
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/python/qmk/cli/generate/info_json.py b/lib/python/qmk/cli/generate/info_json.py
new file mode 100755
index 000000000..f3fc54ddc
--- /dev/null
+++ b/lib/python/qmk/cli/generate/info_json.py
@@ -0,0 +1,65 @@
1"""Keyboard information script.
2
3Compile an info.json for a particular keyboard and pretty-print it.
4"""
5import json
6
7from jsonschema import Draft7Validator, validators
8from milc import cli
9
10from qmk.decorators import automagic_keyboard, automagic_keymap
11from qmk.info import info_json, _jsonschema
12from qmk.info_json_encoder import InfoJSONEncoder
13from qmk.path import is_keyboard
14
15
16def pruning_validator(validator_class):
17 """Extends Draft7Validator to remove properties that aren't specified in the schema.
18 """
19 validate_properties = validator_class.VALIDATORS["properties"]
20
21 def remove_additional_properties(validator, properties, instance, schema):
22 for prop in list(instance.keys()):
23 if prop not in properties:
24 del instance[prop]
25
26 for error in validate_properties(validator, properties, instance, schema):
27 yield error
28
29 return validators.extend(validator_class, {"properties": remove_additional_properties})
30
31
32def strip_info_json(kb_info_json):
33 """Remove the API-only properties from the info.json.
34 """
35 pruning_draft_7_validator = pruning_validator(Draft7Validator)
36 schema = _jsonschema('keyboard')
37 validator = pruning_draft_7_validator(schema).validate
38
39 return validator(kb_info_json)
40
41
42@cli.argument('-kb', '--keyboard', help='Keyboard to show info for.')
43@cli.argument('-km', '--keymap', help='Show the layers for a JSON keymap too.')
44@cli.subcommand('Generate an info.json file for a keyboard.', hidden=False if cli.config.user.developer else True)
45@automagic_keyboard
46@automagic_keymap
47def generate_info_json(cli):
48 """Generate an info.json file for a keyboard
49 """
50 # Determine our keyboard(s)
51 if not cli.config.generate_info_json.keyboard:
52 cli.log.error('Missing parameter: --keyboard')
53 cli.subcommands['info'].print_help()
54 return False
55
56 if not is_keyboard(cli.config.generate_info_json.keyboard):
57 cli.log.error('Invalid keyboard: "%s"', cli.config.generate_info_json.keyboard)
58 return False
59
60 # Build the info.json file
61 kb_info_json = info_json(cli.config.generate_info_json.keyboard)
62 strip_info_json(kb_info_json)
63
64 # Display the results
65 print(json.dumps(kb_info_json, indent=2, cls=InfoJSONEncoder))