fune/testing/web-platform/tests/docs/wpt_lint_rules.py
ziransun fb58dfe87e Bug 1678273 [wpt PR 26574] - Run Sphinx generation in Python 3., a=testonly
Automatic update from web-platform-tests
Run Sphinx generation in Python 3. (#26574)

Fixes #23081

This CL made the following changes:
[1] Upgrading Sphinx version to 2.4.4 to support python 3.5+
[2] Fixing bugs invoked during Py3 run.
    a) Replace reference of "index" in checklist.md with relative path for
       index.md. This is due to "more than one target found for cross-reference"
       error thrown by Sphinx referring to it. It's a known issue in
       sphinx (https://github.com/sphinx-doc/sphinx/issues/2549)
    b) Fix Sphinx in third_party/pywebsocket3. A PR has been sent at
       https://github.com/GoogleChromeLabs/pywebsocket3/pull/16

Note: Command to run with Python3 is: wpt --py3 build-docs

Co-authored-by: Robert Ma <bob1211@gmail.com>
--

wpt-commits: da46f68d5b82371132b4f877e05b9b457de89af9
wpt-pr: 26574
2020-12-03 09:54:48 +00:00

79 lines
2.6 KiB
Python

from docutils.parsers.rst import Directive, nodes
from docutils.utils import new_document
from recommonmark.parser import CommonMarkParser
import importlib
import textwrap
from six import iteritems
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 iteritems(module.__dict__):
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]