diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/docs/wpt_lint_rules.py | |
parent | Initial commit. (diff) | |
download | firefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/docs/wpt_lint_rules.py')
-rw-r--r-- | testing/web-platform/tests/docs/wpt_lint_rules.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/testing/web-platform/tests/docs/wpt_lint_rules.py b/testing/web-platform/tests/docs/wpt_lint_rules.py new file mode 100644 index 0000000000..01f965edfd --- /dev/null +++ b/testing/web-platform/tests/docs/wpt_lint_rules.py @@ -0,0 +1,78 @@ +from docutils.parsers.rst import Directive, nodes +from docutils.utils import new_document +from recommonmark.parser import CommonMarkParser +import importlib +import textwrap + +class WPTLintRules(Directive): + """A docutils directive to generate documentation for the + web-platform-test-test's linting tool from its source code. Requires a + single argument: a Python module specifier for a file which declares + linting rules.""" + has_content = True + required_arguments = 1 + optional_arguments = 0 + _md_parser = CommonMarkParser() + + @staticmethod + def _parse_markdown(markdown): + WPTLintRules._md_parser.parse(markdown, new_document("<string>")) + return WPTLintRules._md_parser.document.children[0] + + @property + def module_specifier(self): + return self.arguments[0] + + def _get_rules(self): + try: + module = importlib.import_module(self.module_specifier) + except ImportError: + raise ImportError( + """wpt-lint-rules: unable to resolve the module at "{}".""".format(self.module_specifier) + ) + + for binding_name, value in module.__dict__.items(): + if hasattr(value, "__abstractmethods__") and len(value.__abstractmethods__): + continue + + description = getattr(value, "description", None) + name = getattr(value, "name", None) + to_fix = getattr(value, "to_fix", None) + + if description is None: + continue + + if to_fix is not None: + to_fix = textwrap.dedent(to_fix) + + yield { + "name": name, + "description": textwrap.dedent(description), + "to_fix": to_fix + } + + + def run(self): + definition_list = nodes.definition_list() + + for rule in sorted(self._get_rules(), key=lambda rule: rule['name']): + item = nodes.definition_list_item() + definition = nodes.definition() + term = nodes.term() + item += term + item += definition + definition_list += item + + term += nodes.literal(text=rule["name"]) + definition += WPTLintRules._parse_markdown(rule["description"]) + + if rule["to_fix"]: + definition += nodes.strong(text="To fix:") + definition += WPTLintRules._parse_markdown(rule["to_fix"]) + + if len(definition_list.children) == 0: + raise Exception( + """wpt-lint-rules: no linting rules found at "{}".""".format(self.module_specifier) + ) + + return [definition_list] |