blob: 01b8413d8c9fd6538c2c3b90b941ff6cfac8fd78 [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2022 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import click
import coloredlogs
import enum
import logging
import os
import sys
from typing import List, Optional
try:
from idl import matter_idl_parser
except:
sys.path.append(os.path.abspath(os.path.dirname(__file__)))
from idl import matter_idl_parser
import idl.lint
# Supported log levels, mapping string values required for argument
# parsing into logging constants
__LOG_LEVELS__ = {
"debug": logging.DEBUG,
"info": logging.INFO,
"warn": logging.WARN,
"fatal": logging.FATAL,
}
@click.command()
@click.option(
"--log-level",
default="INFO",
type=click.Choice(__LOG_LEVELS__.keys(), case_sensitive=False),
help="Determines the verbosity of script output",
)
@click.option(
"--rules",
default=os.path.abspath(os.path.join(os.path.dirname(__file__), "rules.matterlint")),
type=click.Path(exists=True),
help="Rules file to use",
)
@click.argument("idl_path", type=click.Path(exists=True))
def main(log_level, rules, idl_path):
"""
Lints MATTER IDL files (.matter) using given RULES
"""
coloredlogs.install(
level=__LOG_LEVELS__[log_level], fmt="%(asctime)s %(levelname)-7s %(message)s"
)
lint_rules = []
logging.info("Loading rules from %s" % rules)
lint_rules.extend(idl.lint.CreateParser(rules).parse())
logging.info("Parsing idl from %s" % idl_path)
idl_tree = matter_idl_parser.CreateParser().parse(open(idl_path, "rt").read(), file_name=idl_path)
logging.info("Running %d lint rules" % len(lint_rules))
errors = []
for rule in lint_rules:
logging.info(" Running %s" % rule.name)
errors.extend(rule.LintIdl(idl_tree))
logging.info("Done")
for e in errors:
logging.error("ERROR: %s" % e)
if errors:
logging.error("Found %d lint errors" % len(errors))
sys.exit(1)
if __name__ == "__main__":
main()