You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.8 KiB
64 lines
1.8 KiB
# 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)
|
|
|