onnx-mlir/doc/doc_check/directive.py

82 lines
3.1 KiB
Python
Raw Normal View History

[RFC] Doc-check utility. (#12) * 1. Implement doc-check utility. * 1. Move ONNF installation script to a standalone script file. * 1. Modify build script to install llvm-project next to ONNF. The build script used to install llvm-project inside ONNF, which didn't make sense. * 1. Check out code to ONNF directory. * 1. Pass path parameter correctly. * 1. Debugging buildbot. * 1. Remove debug code. * 1. Update installation instructions in README.md. 2. Enforce consistency with scripts used in testing using doc-check. * 1. Fix error with respect to syntax to build multiple CMake targets. * 1. Move doc-check to doc_check. 2. Remove directive_config in top-level driver. * 1. Build onnf and check-mlir-lit separately because only CMake 3.15+ supports building multiple targets in one cmake --build run. * 1. Use new env variables to locate LLVM-Project. * 1. Documentation nits. * 1. Prettify buildbot scripts. * 1. Fix build script error. * 1. Support exclude_dirs in DocCheck. 2. Add README for DocCheck. * 1. Mark python3 interpreter as required. 2. Use imported interpreter target. * 1. Automatically deduce doc file extension in DocCheckCtx. 2. Rename ctx.open -> ctx.open_doc since it should only be used to open doc file. 3. Always read line in parser, instead of reading lines in driver and then passing it to parser.py. * 1. Rename parser -> doc_parser due to name conflict with python built-in module. 2. Explose doc_check module directory first before importing; otherwise if the doc_check utility is invoked by other script, importing will not work correctly. * 1. Keep renaming parser -> doc_parser. 2. Explicitly define a default configuration parser that parses the configuration into a python dictionary. * 1. Add test for doc-check. 2. Exclude doc-check tests from project dock-check because base directory is different. * 1. Raise ValueError if directive configuration fails to parse. 2. Format code. * Shorten test case documentation. Show example of using same-as-file directive, check with DocCheck. * 1. Shorten test case documentation. 2. More documentation, check documentation with DocCheck. * 1. Add copyright notice. * 1. Make documentation clearer. 2. Prettify build-scripts. * 1. Provide more documentation. 2. Fix some non-compliance with pep8 recommendations. Co-authored-by: Gheorghe-Teodor Bercea <gt.bercea@gmail.com>
2020-01-10 07:35:52 +08:00
# ===----------------- directive.py - Directive Base Class ----------------===//
#
# Copyright 2019-2020 The IBM Research Authors.
#
# =============================================================================
#
# ===----------------------------------------------------------------------===//
import re
import ast
from typing import List, Dict, Callable, Any, Pattern, Tuple
from doc_parser import failure, success, succeeded
from utils import DocCheckerCtx
DirectiveConfigList = List[Dict[str, Any]]
ConfigParseResult = Tuple[str, Dict[str, Any]]
class Directive(object):
""""""
def __init__(self, ext_to_regexes: Dict[str, str],
config_parsers: List[Callable[[str, DirectiveConfigList],
ConfigParseResult]],
handler: Callable[[Dict[str, Any], DocCheckerCtx], None]):
"""
:param ext_to_regexes: specify a regex expression to match the directive (for each file extension type).
:param config_parsers: specify a list of parsers to parse configuration. They will be invoked in order until one indicates parsing is successful.
:param handler: a function to perform the invariance check specified by the directive.
"""
self.ext_to_patterns: Dict[str, Pattern] = {}
for ext, pattern in ext_to_regexes.items():
self.ext_to_patterns[ext] = re.compile(pattern)
self.config_parsers: List[Callable[[str, DirectiveConfigList],
ConfigParseResult]] = config_parsers
self.handler = handler
def try_parse_directive(
self, ctx: DocCheckerCtx,
directive_config: DirectiveConfigList) -> Tuple[str, Any]:
"""
:param ctx: parser context.
:param directive_config: a list used to output parsed directive configuration.
:return: parse result.
"""
line = ctx.doc_file.next_non_empty_line()
[RFC] Doc-check utility. (#12) * 1. Implement doc-check utility. * 1. Move ONNF installation script to a standalone script file. * 1. Modify build script to install llvm-project next to ONNF. The build script used to install llvm-project inside ONNF, which didn't make sense. * 1. Check out code to ONNF directory. * 1. Pass path parameter correctly. * 1. Debugging buildbot. * 1. Remove debug code. * 1. Update installation instructions in README.md. 2. Enforce consistency with scripts used in testing using doc-check. * 1. Fix error with respect to syntax to build multiple CMake targets. * 1. Move doc-check to doc_check. 2. Remove directive_config in top-level driver. * 1. Build onnf and check-mlir-lit separately because only CMake 3.15+ supports building multiple targets in one cmake --build run. * 1. Use new env variables to locate LLVM-Project. * 1. Documentation nits. * 1. Prettify buildbot scripts. * 1. Fix build script error. * 1. Support exclude_dirs in DocCheck. 2. Add README for DocCheck. * 1. Mark python3 interpreter as required. 2. Use imported interpreter target. * 1. Automatically deduce doc file extension in DocCheckCtx. 2. Rename ctx.open -> ctx.open_doc since it should only be used to open doc file. 3. Always read line in parser, instead of reading lines in driver and then passing it to parser.py. * 1. Rename parser -> doc_parser due to name conflict with python built-in module. 2. Explose doc_check module directory first before importing; otherwise if the doc_check utility is invoked by other script, importing will not work correctly. * 1. Keep renaming parser -> doc_parser. 2. Explicitly define a default configuration parser that parses the configuration into a python dictionary. * 1. Add test for doc-check. 2. Exclude doc-check tests from project dock-check because base directory is different. * 1. Raise ValueError if directive configuration fails to parse. 2. Format code. * Shorten test case documentation. Show example of using same-as-file directive, check with DocCheck. * 1. Shorten test case documentation. 2. More documentation, check documentation with DocCheck. * 1. Add copyright notice. * 1. Make documentation clearer. 2. Prettify build-scripts. * 1. Provide more documentation. 2. Fix some non-compliance with pep8 recommendations. Co-authored-by: Gheorghe-Teodor Bercea <gt.bercea@gmail.com>
2020-01-10 07:35:52 +08:00
matches = self.ext_to_patterns[ctx.doc_file_ext()].findall(line)
if len(matches) > 1:
raise ValueError("more than one directives in a line")
match = matches[0] if len(matches) else None
if match:
for parser in self.config_parsers:
if succeeded(parser(match, directive_config)):
return success()
raise ValueError("Failed to parse configuration.")
else:
return failure()
def handle(self, config, ctx):
self.handler(config, ctx)
def generic_config_parser(
match: str, directive_config: DirectiveConfigList) -> Tuple[str, Any]:
"""
Generic configuration parser.
Will return success if and only if configuration is specified as a python dictionary literal.
@param match: the content from which to parse the directive configuration.
@param directive_config: a list to output the parsed directive_config.
@return: parsing result.
"""
try:
directive_config.append(ast.literal_eval(match))
return success()
except (SyntaxError, ValueError):
# If literal_eval failed, return parsing failure.
return failure()