Add support for qmk_configurator style aliases (#11954)
* Add support for qmk_configurator style aliases * add the keyboard aliases to the api data * add support for a keyboard metadata file * make flake8 happypython_optimizations
parent
723d9af04d
commit
299008be36
@ -0,0 +1,443 @@ |
||||
{ |
||||
# Format for each entry: |
||||
# <alias>: { |
||||
# target: <keyboard_folder>, |
||||
# layouts: { |
||||
# <layout_alias>: <layout_target> |
||||
# } |
||||
# } |
||||
# |
||||
# Both target and layouts are optional. |
||||
'2_milk': { |
||||
target: 'spaceman/2_milk' |
||||
}, |
||||
'aeboards/ext65': { |
||||
target: 'aeboards/ext65/rev1' |
||||
}, |
||||
'ai03/equinox': { |
||||
target: 'ai03/equinox/rev1' |
||||
}, |
||||
aleth42: { |
||||
target: 'aleth42/rev1' |
||||
}, |
||||
alice: { |
||||
target: 'tgr/alice' |
||||
}, |
||||
angel17: { |
||||
target: 'angel17/alpha' |
||||
}, |
||||
angel64: { |
||||
target: 'angel64/alpha' |
||||
}, |
||||
at101_blackheart: { |
||||
target: 'at101_bh' |
||||
}, |
||||
'atom47/rev2': { |
||||
target: 'maartenwut/atom47/rev2' |
||||
}, |
||||
'atom47/rev3': { |
||||
target: 'maartenwut/atom47/rev3' |
||||
}, |
||||
bear_face: { |
||||
target: 'bear_face/v1' |
||||
}, |
||||
'bpiphany/pegasushoof': { |
||||
target: 'bpiphany/pegasushoof/2013' |
||||
}, |
||||
chavdai40: { |
||||
target: 'chavdai40/rev1' |
||||
}, |
||||
'candybar/lefty': { |
||||
target: 'tkc/candybar/lefty' |
||||
}, |
||||
'candybar/righty': { |
||||
target: 'tkc/candybar/righty' |
||||
}, |
||||
canoe: { |
||||
target: 'percent/canoe' |
||||
}, |
||||
'cmm_studio/saka68': { |
||||
target: 'cmm_studio/saka68/solder' |
||||
}, |
||||
'crkbd/rev1': { |
||||
target: 'crkbd/rev1/legacy' |
||||
}, |
||||
'doro67/multi': { |
||||
layouts: { |
||||
LAYOUT_ansi: 'LAYOUT_65_ansi_blocker' |
||||
} |
||||
}, |
||||
'doro67/regular': { |
||||
layouts: { |
||||
LAYOUT: 'LAYOUT_65_ansi_blocker' |
||||
} |
||||
}, |
||||
'doro67/rgb': { |
||||
layouts: { |
||||
LAYOUT: 'LAYOUT_65_ansi_blocker' |
||||
} |
||||
}, |
||||
drakon: { |
||||
target: 'jagdpietr/drakon' |
||||
}, |
||||
'dztech/dz60rgb': { |
||||
target: 'dztech/dz60rgb/v1' |
||||
}, |
||||
'dztech/dz60rgb_ansi': { |
||||
target: 'dztech/dz60rgb_ansi/v1' |
||||
}, |
||||
'dztech/dz60rgb_wkl': { |
||||
target: 'dztech/dz60rgb_wkl/v1' |
||||
}, |
||||
'dztech/dz65rgb': { |
||||
target: 'dztech/dz65rgb/v1' |
||||
}, |
||||
eek: { |
||||
target: 'eek/silk_down' |
||||
}, |
||||
ergoinu: { |
||||
target: 'dm9records/ergoinu' |
||||
}, |
||||
'exclusive/e85': { |
||||
target: 'exclusive/e85/hotswap' |
||||
}, |
||||
gh60: { |
||||
target: 'gh60/revc' |
||||
}, |
||||
'handwired/ferris': { |
||||
target: 'ferris/0_1' |
||||
}, |
||||
'helix/pico/sc/back': { |
||||
target: 'helix/pico/sc' |
||||
}, |
||||
'helix/pico/sc/under': { |
||||
target: 'helix/pico/sc' |
||||
}, |
||||
'helix/rev2/back/oled': { |
||||
target: 'helix/rev2/back' |
||||
}, |
||||
'helix/rev2/oled': { |
||||
target: 'helix/rev2' |
||||
}, |
||||
'helix/rev2/oled/back': { |
||||
target: 'helix/rev2/back' |
||||
}, |
||||
'helix/rev2/oled/under': { |
||||
target: 'helix/rev2/under' |
||||
}, |
||||
'helix/rev2/sc/back': { |
||||
target: 'helix/rev2/sc' |
||||
}, |
||||
'helix/rev2/sc/oled': { |
||||
target: 'helix/rev2/sc' |
||||
}, |
||||
'helix/rev2/sc/oledback': { |
||||
target: 'helix/rev2/sc' |
||||
}, |
||||
'helix/rev2/sc/oledunder': { |
||||
target: 'helix/rev2/sc' |
||||
}, |
||||
'helix/rev2/sc/under': { |
||||
target: 'helix/rev2/sc' |
||||
}, |
||||
'helix/rev2/under': { |
||||
target: 'helix/rev2/sc' |
||||
}, |
||||
'helix/rev2/under/oled': { |
||||
target: 'helix/rev2/under' |
||||
}, |
||||
id80: { |
||||
target: 'id80/ansi' |
||||
}, |
||||
idb_60: { |
||||
target: 'idb/idb_60', |
||||
layouts: { |
||||
LAYOUT: 'LAYOUT_all' |
||||
} |
||||
}, |
||||
jones: { |
||||
target: 'jones/v03_1' |
||||
}, |
||||
katana60: { |
||||
target: 'rominronin/katana60/rev1' |
||||
}, |
||||
'kbdfans/kbd67mkiirgb': { |
||||
target: 'kbdfans/kbd67/mkiirgb', |
||||
layouts: { |
||||
LAYOUT: 'LAYOUT_65_ansi_blocker' |
||||
} |
||||
}, |
||||
'kbdfans/kbd67/mkiirgb': { |
||||
target: 'kbdfans/kbd67/mkiirgb/v1' |
||||
}, |
||||
'keebio/dsp40': { |
||||
target: 'keebio/dsp40/rev1' |
||||
}, |
||||
'keycapsss/plaid_pad': { |
||||
target: 'keycapsss/plaid_pad/rev1' |
||||
}, |
||||
kudox: { |
||||
target: 'kudox/rev1' |
||||
}, |
||||
'lfkeyboards/lfk78': { |
||||
target: 'lfkeyboards/lfk78/revj' |
||||
}, |
||||
'lfkeyboards/smk65': { |
||||
target: 'lfkeyboards/smk65/revb' |
||||
}, |
||||
'maartenwut/atom47/rev2': { |
||||
target: 'evyd13/atom47/rev2' |
||||
}, |
||||
'maartenwut/atom47/rev3': { |
||||
target: 'evyd13/atom47/rev3' |
||||
}, |
||||
'maartenwut/eon40': { |
||||
target: 'evyd13/eon40' |
||||
}, |
||||
'maartenwut/eon65': { |
||||
target: 'evyd13/eon65' |
||||
}, |
||||
'maartenwut/eon75': { |
||||
target: 'evyd13/eon75' |
||||
}, |
||||
'maartenwut/eon87': { |
||||
target: 'evyd13/eon87' |
||||
}, |
||||
'maartenwut/eon95': { |
||||
target: 'evyd13/eon95' |
||||
}, |
||||
'maartenwut/gh80_1800': { |
||||
target: 'evyd13/gh80_1800' |
||||
}, |
||||
'maartenwut/gh80_3700': { |
||||
target: 'evyd13/gh80_3700' |
||||
}, |
||||
'maartenwut/minitomic': { |
||||
target: 'evyd13/minitomic' |
||||
}, |
||||
'maartenwut/mx5160': { |
||||
target: 'evyd13/mx5160' |
||||
}, |
||||
'maartenwut/nt660': { |
||||
target: 'evyd13/nt660' |
||||
}, |
||||
'maartenwut/omrontkl': { |
||||
target: 'evyd13/omrontkl' |
||||
}, |
||||
'maartenwut/plain60': { |
||||
target: 'evyd13/plain60' |
||||
}, |
||||
'maartenwut/pockettype': { |
||||
target: 'evyd13/pockettype' |
||||
}, |
||||
'maartenwut/quackfire': { |
||||
target: 'evyd13/quackfire' |
||||
}, |
||||
'maartenwut/solheim68': { |
||||
target: 'evyd13/solheim68' |
||||
}, |
||||
'maartenwut/ta65': { |
||||
target: 'evyd13/ta65' |
||||
}, |
||||
'maartenwut/wasdat': { |
||||
target: 'evyd13/wasdat' |
||||
}, |
||||
'maartenwut/wasdat_code': { |
||||
target: 'evyd13/wasdat_code' |
||||
}, |
||||
'maartenwut/wonderland': { |
||||
target: 'evyd13/wonderland' |
||||
}, |
||||
'mechlovin/hannah910': { |
||||
target: 'mechlovin/hannah910/rev1' |
||||
}, |
||||
'mechlovin/adelais/rgb_led': { |
||||
target: 'mechlovin/adelais/rgb_led/rev1' |
||||
}, |
||||
'mechlovin/adelais/standard_led': { |
||||
target: 'mechlovin/adelais/standard_led/rev2' |
||||
}, |
||||
'mechlovin/delphine': { |
||||
target: 'mechlovin/delphine/mono_led' |
||||
}, |
||||
'mechlovin/hannah60rgb': { |
||||
target: 'mechlovin/hannah60rgb/rev1' |
||||
}, |
||||
'melgeek/z70ultra': { |
||||
target: 'melgeek/z70ultra/rev1' |
||||
}, |
||||
'mechlovin/hannah65': { |
||||
target: 'mechlovin/hannah65/rev1' |
||||
}, |
||||
model01: { |
||||
target: 'keyboardio/model01' |
||||
}, |
||||
m0lly: { |
||||
target: 'tkc/m0lly' |
||||
}, |
||||
'montsinger/rebound': { |
||||
target: 'montsinger/rebound/rev1' |
||||
}, |
||||
nomu30: { |
||||
target: 'nomu30/rev1' |
||||
}, |
||||
'noxary/268_2': { |
||||
layouts: { |
||||
LAYOUT: 'LAYOUT_65_ansi_blocker' |
||||
} |
||||
}, |
||||
oddball: { |
||||
target: 'oddball/v1' |
||||
}, |
||||
omnikey_blackheart: { |
||||
target: 'omnikey_bh' |
||||
}, |
||||
'pabile/p20': { |
||||
target: 'pabile/p20/ver1' |
||||
}, |
||||
'pancake/feather': { |
||||
target: 'spaceman/pancake/feather' |
||||
}, |
||||
'pancake/promicro': { |
||||
target: 'spaceman/pancake/promicro' |
||||
}, |
||||
'percent/canoe': { |
||||
layouts: { |
||||
LAYOUT_iso: 'LAYOUT_65_iso_blocker' |
||||
} |
||||
}, |
||||
plaid: { |
||||
target: 'dm9records/plaid' |
||||
}, |
||||
plain60: { |
||||
target: 'maartenwut/plain60' |
||||
}, |
||||
'ploopyco/trackball': { |
||||
target: 'ploopyco/trackball/rev1_005' |
||||
}, |
||||
polilla: { |
||||
target: 'polilla/rev1' |
||||
}, |
||||
'preonic/rev1': { |
||||
layouts: { |
||||
LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12' |
||||
} |
||||
}, |
||||
'preonic/rev2': { |
||||
layouts: { |
||||
LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12' |
||||
} |
||||
}, |
||||
'preonic/rev3': { |
||||
layouts: { |
||||
LAYOUT_preonic_grid: 'LAYOUT_ortho_5x12' |
||||
} |
||||
}, |
||||
'primekb/prime_l': { |
||||
target: 'primekb/prime_l/v1' |
||||
}, |
||||
'primekb/prime_l_v2': { |
||||
target: 'primekb/prime_l/v2' |
||||
}, |
||||
'projectkb/alice': { |
||||
target: 'projectkb/alice/rev1' |
||||
}, |
||||
'rama/koyu': { |
||||
target: 'wilba_tech/rama_works_koyu' |
||||
}, |
||||
'rama/m6_a': { |
||||
target: 'wilba_tech/rama_works_m6_a' |
||||
}, |
||||
'rama/m6_b': { |
||||
target: 'wilba_tech/rama_works_m6_b' |
||||
}, |
||||
'rama/m10_b': { |
||||
target: 'wilba_tech/rama_works_m10_b' |
||||
}, |
||||
'rama/m60_a': { |
||||
target: 'wilba_tech/rama_works_m60_a' |
||||
}, |
||||
'rama/u80_a': { |
||||
target: 'wilba_tech/rama_works_u80_a' |
||||
}, |
||||
'ramonimbao/herringbone': { |
||||
target: 'ramonimbao/herringbone/v1' |
||||
}, |
||||
'rgbkb/pan': { |
||||
target: 'rgbkb/pan/rev1/32a' |
||||
}, |
||||
'rgbkb/pan/rev1': { |
||||
target: 'rgbkb/pan/rev1/32a' |
||||
}, |
||||
romac: { |
||||
target: 'kingly_keys/romac' |
||||
}, |
||||
ropro: { |
||||
target: 'kingly_keys/ropro' |
||||
}, |
||||
satan: { |
||||
target: 'gh60/satan' |
||||
}, |
||||
skog: { |
||||
target: 'percent/skog' |
||||
}, |
||||
speedo: { |
||||
target: 'cozykeys/speedo/v2' |
||||
}, |
||||
stoutgat: { |
||||
target: 'tkw/stoutgat/v1' |
||||
}, |
||||
suihankey: { |
||||
target: 'suihankey/split/alpha' |
||||
}, |
||||
ta65: { |
||||
target: 'maartenwut/ta65' |
||||
}, |
||||
tartan: { |
||||
target: 'dm9records/tartan' |
||||
}, |
||||
tkc1800: { |
||||
target: 'tkc/tkc1800' |
||||
}, |
||||
'tkw/stoutgat/v2': { |
||||
target: 'tkw/stoutgat/v2/f411' |
||||
}, |
||||
underscore33: { |
||||
target: 'underscore33/rev1' |
||||
}, |
||||
vinta: { |
||||
layouts: { |
||||
LAYOUT_67_ansi: 'LAYOUT_65_ansi_blocker' |
||||
} |
||||
}, |
||||
wasdat: { |
||||
target: 'maartenwut/wasdat' |
||||
}, |
||||
'westfoxtrot/cypher': { |
||||
target: 'westfoxtrot/cypher/rev1' |
||||
}, |
||||
'whale/sk': { |
||||
target: 'whale/sk/v3' |
||||
}, |
||||
'xelus/dawn60': { |
||||
target: 'xelus/dawn60/rev1' |
||||
}, |
||||
'xelus/valor': { |
||||
target: 'xelus/valor/rev1' |
||||
}, |
||||
yd60mq: { |
||||
target: 'yd60mq/12led' |
||||
}, |
||||
ymd75: { |
||||
target: 'ymd75/rev1' |
||||
}, |
||||
z150_blackheart: { |
||||
target: 'z150_bh' |
||||
}, |
||||
zeal60: { |
||||
target: 'wilba_tech/zeal60' |
||||
}, |
||||
zeal65: { |
||||
target: 'wilba_tech/zeal65' |
||||
} |
||||
} |
@ -0,0 +1,68 @@ |
||||
"""Functions that help us generate and use info.json files. |
||||
""" |
||||
import json |
||||
from collections.abc import Mapping |
||||
from pathlib import Path |
||||
|
||||
import hjson |
||||
import jsonschema |
||||
from milc import cli |
||||
|
||||
|
||||
def json_load(json_file): |
||||
"""Load a json file from disk. |
||||
|
||||
Note: file must be a Path object. |
||||
""" |
||||
try: |
||||
return hjson.load(json_file.open()) |
||||
|
||||
except json.decoder.JSONDecodeError as e: |
||||
cli.log.error('Invalid JSON encountered attempting to load {fg_cyan}%s{fg_reset}:\n\t{fg_red}%s', json_file, e) |
||||
exit(1) |
||||
|
||||
|
||||
def load_jsonschema(schema_name): |
||||
"""Read a jsonschema file from disk. |
||||
|
||||
FIXME(skullydazed/anyone): Refactor to make this a public function. |
||||
""" |
||||
schema_path = Path(f'data/schemas/{schema_name}.jsonschema') |
||||
|
||||
if not schema_path.exists(): |
||||
schema_path = Path('data/schemas/false.jsonschema') |
||||
|
||||
return json_load(schema_path) |
||||
|
||||
|
||||
def keyboard_validate(data): |
||||
"""Validates data against the keyboard jsonschema. |
||||
""" |
||||
schema = load_jsonschema('keyboard') |
||||
validator = jsonschema.Draft7Validator(schema).validate |
||||
|
||||
return validator(data) |
||||
|
||||
|
||||
def keyboard_api_validate(data): |
||||
"""Validates data against the api_keyboard jsonschema. |
||||
""" |
||||
base = load_jsonschema('keyboard') |
||||
relative = load_jsonschema('api_keyboard') |
||||
resolver = jsonschema.RefResolver.from_schema(base) |
||||
validator = jsonschema.Draft7Validator(relative, resolver=resolver).validate |
||||
|
||||
return validator(data) |
||||
|
||||
|
||||
def deep_update(origdict, newdict): |
||||
"""Update a dictionary in place, recursing to do a deep copy. |
||||
""" |
||||
for key, value in newdict.items(): |
||||
if isinstance(value, Mapping): |
||||
origdict[key] = deep_update(origdict.get(key, {}), value) |
||||
|
||||
else: |
||||
origdict[key] = value |
||||
|
||||
return origdict |
Loading…
Reference in new issue