File: test_docs.py

package info (click to toggle)
black 25.12.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 7,180 kB
  • sloc: python: 113,389; makefile: 25
file content (74 lines) | stat: -rw-r--r-- 2,522 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
"""

Test that the docs are up to date.

"""

import re
from collections.abc import Sequence
from itertools import islice
from pathlib import Path

import pytest

from black.mode import UNSTABLE_FEATURES, Preview

DOCS_PATH = Path("docs/the_black_code_style/future_style.md")


def check_feature_list(
    lines: Sequence[str], expected_feature_names: set[str], label: str
) -> str | None:
    start_index = lines.index(f"(labels/{label}-features)=\n")
    if start_index == -1:
        return (
            f"Could not find the {label} features list in {DOCS_PATH}. Ensure the"
            " preview-features label is present."
        )
    num_blank_lines_seen = 0
    seen_preview_feature_names = set()
    for line in islice(lines, start_index + 1, None):
        if not line.strip():
            num_blank_lines_seen += 1
            if num_blank_lines_seen == 3:
                break
            continue
        if line.startswith("- "):
            match = re.search(r"^- `([a-z\d_]+)`", line)
            if match:
                seen_preview_feature_names.add(match.group(1))

    if seen_preview_feature_names - expected_feature_names:
        extra = ", ".join(sorted(seen_preview_feature_names - expected_feature_names))
        return (
            f"The following features should not be in the list of {label} features:"
            f" {extra}. Please remove them from the {label}-features label in"
            f" {DOCS_PATH}"
        )
    elif expected_feature_names - seen_preview_feature_names:
        missing = ", ".join(sorted(expected_feature_names - seen_preview_feature_names))
        return (
            f"The following features are missing from the list of {label} features:"
            f" {missing}. Please document them under the {label}-features label in"
            f" {DOCS_PATH}"
        )
    else:
        return None


def test_feature_lists_are_up_to_date() -> None:
    repo_root = Path(__file__).parent.parent
    if not (repo_root / "docs").exists():
        pytest.skip("docs not found")
    with (repo_root / DOCS_PATH).open(encoding="utf-8") as f:
        future_style = f.readlines()
    preview_error = check_feature_list(
        future_style,
        {feature.name for feature in set(Preview) - UNSTABLE_FEATURES},
        "preview",
    )
    assert preview_error is None, preview_error
    unstable_error = check_feature_list(
        future_style, {feature.name for feature in UNSTABLE_FEATURES}, "unstable"
    )
    assert unstable_error is None, unstable_error