|  | #!/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() |