Publish community layout data to API

This commit is contained in:
zvecr 2024-07-29 17:31:33 +01:00
parent 02b43b4b60
commit 7edfac5f60

View File

@ -14,6 +14,7 @@ from qmk.keymap import list_keymaps
from qmk.keyboard import find_readme, list_keyboards, keyboard_alias_definitions from qmk.keyboard import find_readme, list_keyboards, keyboard_alias_definitions
from qmk.keycodes import load_spec, list_versions, list_languages from qmk.keycodes import load_spec, list_versions, list_languages
COMMUNITY_PATH = Path('layouts/default/')
DATA_PATH = Path('data') DATA_PATH = Path('data')
TEMPLATE_PATH = DATA_PATH / 'templates/api/' TEMPLATE_PATH = DATA_PATH / 'templates/api/'
BUILD_API_PATH = Path('.build/api_data/') BUILD_API_PATH = Path('.build/api_data/')
@ -89,6 +90,18 @@ def _filtered_keyboard_list():
return keyboard_list return keyboard_list
def _copy_community_layouts(v1_dir):
available_layouts = sorted([x.name for x in COMMUNITY_PATH.iterdir() if x.is_dir()])
layouts_out = v1_dir / 'layouts'
layouts_out.mkdir(parents=True, exist_ok=True)
for layout in available_layouts:
layout_json = COMMUNITY_PATH / layout / 'info.json'
shutil.copyfile(layout_json, v1_dir / 'layouts' / f'{layout}.json')
return available_layouts
@cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't write the data to disk.") @cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Don't write the data to disk.")
@cli.argument('-f', '--filter', arg_only=True, action='append', default=[], help="Filter the list of keyboards based on partial name matches the supplied value. May be passed multiple times.") @cli.argument('-f', '--filter', arg_only=True, action='append', default=[], help="Filter the list of keyboards based on partial name matches the supplied value. May be passed multiple times.")
@cli.subcommand('Generate QMK API data', hidden=False if cli.config.user.developer else True) @cli.subcommand('Generate QMK API data', hidden=False if cli.config.user.developer else True)
@ -101,6 +114,7 @@ def generate_api(cli):
keyboard_aliases_file = v1_dir / 'keyboard_aliases.json' # A list of historical keyboard names and their new name keyboard_aliases_file = v1_dir / 'keyboard_aliases.json' # A list of historical keyboard names and their new name
keyboard_metadata_file = v1_dir / 'keyboard_metadata.json' # All the data configurator/via needs for initialization keyboard_metadata_file = v1_dir / 'keyboard_metadata.json' # All the data configurator/via needs for initialization
constants_metadata_file = v1_dir / 'constants_metadata.json' # Metadata for available constants constants_metadata_file = v1_dir / 'constants_metadata.json' # Metadata for available constants
layouts_metadata_file = v1_dir / 'layouts_metadata.json' # Metadata for available layouts
usb_file = v1_dir / 'usb.json' # A mapping of USB VID/PID -> keyboard target usb_file = v1_dir / 'usb.json' # A mapping of USB VID/PID -> keyboard target
if BUILD_API_PATH.exists(): if BUILD_API_PATH.exists():
@ -181,6 +195,7 @@ def generate_api(cli):
# Feature specific handling # Feature specific handling
_resolve_keycode_specs(v1_dir) _resolve_keycode_specs(v1_dir)
available_layouts = _copy_community_layouts(v1_dir)
# Write the global JSON files # Write the global JSON files
keyboard_all_json = json.dumps({'last_updated': current_datetime(), 'keyboards': kb_all}, separators=(',', ':')) keyboard_all_json = json.dumps({'last_updated': current_datetime(), 'keyboards': kb_all}, separators=(',', ':'))
@ -189,6 +204,7 @@ def generate_api(cli):
keyboard_aliases_json = json.dumps({'last_updated': current_datetime(), 'keyboard_aliases': keyboard_aliases}, separators=(',', ':')) keyboard_aliases_json = json.dumps({'last_updated': current_datetime(), 'keyboard_aliases': keyboard_aliases}, separators=(',', ':'))
keyboard_metadata_json = json.dumps(keyboard_metadata, separators=(',', ':')) keyboard_metadata_json = json.dumps(keyboard_metadata, separators=(',', ':'))
constants_metadata_json = json.dumps({'last_updated': current_datetime(), 'constants': _list_constants(v1_dir)}, separators=(',', ':')) constants_metadata_json = json.dumps({'last_updated': current_datetime(), 'constants': _list_constants(v1_dir)}, separators=(',', ':'))
layouts_metadata_json = json.dumps({'last_updated': current_datetime(), 'layouts': available_layouts}, separators=(',', ':'))
if not cli.args.dry_run: if not cli.args.dry_run:
keyboard_all_file.write_text(keyboard_all_json, encoding='utf-8') keyboard_all_file.write_text(keyboard_all_json, encoding='utf-8')
@ -197,3 +213,4 @@ def generate_api(cli):
keyboard_aliases_file.write_text(keyboard_aliases_json, encoding='utf-8') keyboard_aliases_file.write_text(keyboard_aliases_json, encoding='utf-8')
keyboard_metadata_file.write_text(keyboard_metadata_json, encoding='utf-8') keyboard_metadata_file.write_text(keyboard_metadata_json, encoding='utf-8')
constants_metadata_file.write_text(constants_metadata_json, encoding='utf-8') constants_metadata_file.write_text(constants_metadata_json, encoding='utf-8')
layouts_metadata_file.write_text(layouts_metadata_json, encoding='utf-8')