mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-06-08 09:22:49 +00:00
Initial validation of xap.hjson
This commit is contained in:
parent
429c592289
commit
f44a988476
254
data/schemas/xap.jsonschema
Normal file
254
data/schemas/xap.jsonschema
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
{
|
||||||
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
|
"$id": "qmk.xap.v1",
|
||||||
|
"title": "XAP Spec",
|
||||||
|
"definitions": {
|
||||||
|
"data_type": {
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"enum": [
|
||||||
|
"bool",
|
||||||
|
"u8",
|
||||||
|
"u16",
|
||||||
|
"u32",
|
||||||
|
"u64",
|
||||||
|
"struct",
|
||||||
|
"string"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "string",
|
||||||
|
"pattern": "^u\\d{1,2}\\[\\d{1,2}\\]*$"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"router_type": {
|
||||||
|
"enum": [
|
||||||
|
"command",
|
||||||
|
"router"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"permission": {
|
||||||
|
"enum": [
|
||||||
|
"secure",
|
||||||
|
"ignore"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"struct": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"route": {
|
||||||
|
"type": "object",
|
||||||
|
"propertyNames": {
|
||||||
|
"$ref": "qmk.definitions.v1#/hex_number_2d"
|
||||||
|
},
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/definitions/router_type"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"define": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"$ref": "#/definitions/permission"
|
||||||
|
},
|
||||||
|
"enable_if_preprocessor": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"request_type": {
|
||||||
|
"$ref": "#/definitions/data_type"
|
||||||
|
},
|
||||||
|
"request_struct_length": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"request_purpose": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"return_type": {
|
||||||
|
"$ref": "#/definitions/data_type"
|
||||||
|
},
|
||||||
|
"request_struct_members": {
|
||||||
|
"$ref": "#definitions/struct"
|
||||||
|
},
|
||||||
|
"return_struct_length": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"return_constant": {
|
||||||
|
"type": [
|
||||||
|
"array",
|
||||||
|
"string"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"return_struct_members": {
|
||||||
|
"$ref": "#definitions/struct"
|
||||||
|
},
|
||||||
|
"return_purpose": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"return_execute": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"routes": {
|
||||||
|
"$ref": "#/definitions/route"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"version"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"version": {
|
||||||
|
"$ref": "qmk.definitions.v1#/bcd_version"
|
||||||
|
},
|
||||||
|
"define": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"uses": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": {
|
||||||
|
"$ref": "qmk.definitions.v1#/bcd_version"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"documentation": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"order": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"term_definitions": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type_docs": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type_definitions": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"$ref": "#/definitions/data_type"
|
||||||
|
},
|
||||||
|
"struct_length": {
|
||||||
|
"type": "number"
|
||||||
|
},
|
||||||
|
"struct_members": {
|
||||||
|
"$ref": "#definitions/struct"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response_flags": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"define_prefix": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"bits": {
|
||||||
|
"type": "object",
|
||||||
|
"propertyNames": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"define": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"broadcast_messages": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"define_prefix": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"messages": {
|
||||||
|
"type": "object",
|
||||||
|
"propertyNames": {
|
||||||
|
"$ref": "qmk.definitions.v1#/hex_number_2d"
|
||||||
|
},
|
||||||
|
"additionalProperties": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"define": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"return_type": {
|
||||||
|
"$ref": "#/definitions/data_type"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"routes": {
|
||||||
|
"$ref": "#/definitions/route"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -2,12 +2,13 @@
|
|||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import hjson
|
import hjson
|
||||||
|
import jsonschema
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import OrderedDict
|
from typing import OrderedDict
|
||||||
from jinja2 import Environment, FileSystemLoader, select_autoescape
|
from jinja2 import Environment, FileSystemLoader, select_autoescape
|
||||||
|
|
||||||
from qmk.constants import QMK_FIRMWARE
|
from qmk.constants import QMK_FIRMWARE
|
||||||
from qmk.json_schema import json_load
|
from qmk.json_schema import json_load, validate
|
||||||
from qmk.decorators import lru_cache
|
from qmk.decorators import lru_cache
|
||||||
from qmk.keymap import locate_keymap
|
from qmk.keymap import locate_keymap
|
||||||
from qmk.path import keyboard
|
from qmk.path import keyboard
|
||||||
@ -135,7 +136,16 @@ def merge_xap_defs(kb, km):
|
|||||||
if km_xap.exists():
|
if km_xap.exists():
|
||||||
definitions.append({'routes': {'0x03': hjson.load(km_xap.open(encoding='utf-8'))}})
|
definitions.append({'routes': {'0x03': hjson.load(km_xap.open(encoding='utf-8'))}})
|
||||||
|
|
||||||
return _merge_ordered_dicts(definitions)
|
defs = _merge_ordered_dicts(definitions)
|
||||||
|
|
||||||
|
try:
|
||||||
|
validate(defs, 'qmk.xap.v1')
|
||||||
|
|
||||||
|
except jsonschema.ValidationError as e:
|
||||||
|
print(f'Invalid XAP spec: {e.message}')
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
return defs
|
||||||
|
|
||||||
|
|
||||||
@lru_cache(timeout=5)
|
@lru_cache(timeout=5)
|
||||||
|
Loading…
Reference in New Issue
Block a user