info_json.py 2.2 KB

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