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.

49 lines
1.9 KiB

  1. """Keyboard information script.
  2. Compile an info.json for a particular keyboard and pretty-print it.
  3. """
  4. import json
  5. from milc import cli
  6. from qmk.info_json_encoder import InfoJSONEncoder
  7. from qmk.decorators import automagic_keyboard, automagic_keymap
  8. from qmk.info import info_json
  9. from qmk.path import is_keyboard
  10. @cli.argument('-kb', '--keyboard', help='Keyboard to show info for.')
  11. @cli.argument('-km', '--keymap', help='Show the layers for a JSON keymap too.')
  12. @cli.subcommand('Generate an info.json file for a keyboard.', hidden=False if cli.config.user.developer else True)
  13. @automagic_keyboard
  14. @automagic_keymap
  15. def generate_info_json(cli):
  16. """Generate an info.json file for a keyboard
  17. """
  18. # Determine our keyboard(s)
  19. if not cli.config.generate_info_json.keyboard:
  20. cli.log.error('Missing paramater: --keyboard')
  21. cli.subcommands['info'].print_help()
  22. return False
  23. if not is_keyboard(cli.config.generate_info_json.keyboard):
  24. cli.log.error('Invalid keyboard: "%s"', cli.config.generate_info_json.keyboard)
  25. return False
  26. # Build the info.json file
  27. kb_info_json = info_json(cli.config.generate_info_json.keyboard)
  28. pared_down_json = {}
  29. for key in ('manufacturer', 'maintainer', 'usb', 'keyboard_name', 'width', 'height', 'debounce', 'diode_direction', 'features', 'community_layouts', 'layout_aliases', 'matrix_pins', 'rgblight', 'url'):
  30. if key in kb_info_json:
  31. pared_down_json[key] = kb_info_json[key]
  32. pared_down_json['layouts'] = {}
  33. if 'layouts' in kb_info_json:
  34. for layout_name, layout in kb_info_json['layouts'].items():
  35. pared_down_json['layouts'][layout_name] = {}
  36. pared_down_json['layouts'][layout_name]['key_count'] = layout.get('key_count', len(layout['layout']))
  37. pared_down_json['layouts'][layout_name]['layout'] = layout['layout']
  38. # Display the results
  39. print(json.dumps(pared_down_json, indent=2, cls=InfoJSONEncoder))