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.
59 lines
2.0 KiB
59 lines
2.0 KiB
# 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)
|
|
|