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