60 lines
2 KiB
Python
60 lines
2 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
|
||
|
from jsonschema import validate, ValidationError
|
||
|
import os
|
||
|
import sys
|
||
|
import yaml
|
||
|
from textwrap import dedent # just for nicer code indentation
|
||
|
|
||
|
from west.commands import WestCommand
|
||
|
from west import log # use this for user output
|
||
|
|
||
|
|
||
|
class Metadata(WestCommand):
|
||
|
def __init__(self):
|
||
|
super().__init__(
|
||
|
'metadata', # gets stored as self.name
|
||
|
'ZMK hardware metadata commands', # self.help
|
||
|
# self.description:
|
||
|
dedent('''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:
|
||
|
validate(yaml.safe_load(stream), self.schema)
|
||
|
except yaml.YAMLError as exc:
|
||
|
print("Failed loading metadata yaml: " + file)
|
||
|
print(exc)
|
||
|
return False
|
||
|
except 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)
|