1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# 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)
|