You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
2.4 KiB

  1. """Keyboard information script.
  2. Compile an info.json for a particular keyboard and pretty-print it.
  3. """
  4. import json
  5. from jsonschema import Draft7Validator, validators
  6. from milc import cli
  7. from qmk.decorators import automagic_keyboard, automagic_keymap
  8. from qmk.info import info_json
  9. from qmk.json_encoders import InfoJSONEncoder
  10. from qmk.json_schema import load_jsonschema
  11. from qmk.keyboard import keyboard_completer, keyboard_folder
  12. from qmk.path import is_keyboard
  13. def pruning_validator(validator_class):
  14. """Extends Draft7Validator to remove properties that aren't specified in the schema.
  15. """
  16. validate_properties = validator_class.VALIDATORS["properties"]
  17. def remove_additional_properties(validator, properties, instance, schema):
  18. for prop in list(instance.keys()):
  19. if prop not in properties:
  20. del instance[prop]
  21. for error in validate_properties(validator, properties, instance, schema):
  22. yield error
  23. return validators.extend(validator_class, {"properties": remove_additional_properties})
  24. def strip_info_json(kb_info_json):
  25. """Remove the API-only properties from the info.json.
  26. """
  27. pruning_draft_7_validator = pruning_validator(Draft7Validator)
  28. schema = load_jsonschema('keyboard')
  29. validator = pruning_draft_7_validator(schema).validate
  30. return validator(kb_info_json)
  31. @cli.argument('-kb', '--keyboard', type=keyboard_folder, completer=keyboard_completer, help='Keyboard to show info for.')
  32. @cli.argument('-km', '--keymap', help='Show the layers for a JSON keymap too.')
  33. @cli.subcommand('Generate an info.json file for a keyboard.', hidden=False if cli.config.user.developer else True)
  34. @automagic_keyboard
  35. @automagic_keymap
  36. def generate_info_json(cli):
  37. """Generate an info.json file for a keyboard
  38. """
  39. # Determine our keyboard(s)
  40. if not cli.config.generate_info_json.keyboard:
  41. cli.log.error('Missing parameter: --keyboard')
  42. cli.subcommands['info'].print_help()
  43. return False
  44. if not is_keyboard(cli.config.generate_info_json.keyboard):
  45. cli.log.error('Invalid keyboard: "%s"', cli.config.generate_info_json.keyboard)
  46. return False
  47. # Build the info.json file
  48. kb_info_json = info_json(cli.config.generate_info_json.keyboard)
  49. strip_info_json(kb_info_json)
  50. # Display the results
  51. print(json.dumps(kb_info_json, indent=2, cls=InfoJSONEncoder))