zmk/app/scripts/west_commands/metadata.py

65 lines
1.8 KiB
Python

# Copyright (c) 2021 The ZMK Contributors
# SPDX-License-Identifier: MIT
"""Metadata command for ZMK."""
from functools import cached_property
import glob
import json
import jsonschema
import sys
import yaml
from west.commands import WestCommand
from west import log # use this for user output
class Metadata(WestCommand):
def __init__(self):
super().__init__(
name="metadata",
help="ZMK hardware metadata commands",
description="Operate on the board/shield metadata.",
)
def do_add_parser(self, parser_adder):
parser = parser_adder.add_parser(
self.name, help=self.help, description=self.description
)
parser.add_argument(
"subcommand",
default="check",
help='The subcommand to run. Defaults to "check".',
nargs="?",
)
return parser # gets stored as self.parser
@cached_property
def schema(self):
return json.load(open("../schema/hardware-metadata.schema.json", "r"))
def validate_file(self, file):
print("Validating: " + file)
with open(file, "r") as stream:
try:
jsonschema.validate(yaml.safe_load(stream), self.schema)
except yaml.YAMLError as exc:
print("Failed loading metadata yaml: " + file)
print(exc)
return False
except jsonschema.ValidationError as vexc:
print("Failed validation of: " + file)
print(vexc)
return False
return True
def do_run(self, args, unknown_args):
status = all(
[
self.validate_file(f)
for f in glob.glob("boards/**/*.zmk.yml", recursive=True)
]
)
sys.exit(0 if status else 1)