• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pantsbuild / pants / 26342152999

23 May 2026 07:59PM UTC coverage: 91.165% (-1.6%) from 92.792%
26342152999

push

github

web-flow
Run Linux ARM CI on Depot runners (#23363)

RunsOn is deprecating their v2 stack, and rather than migrate
to v3 we should use the resources kindly donated by Depot.

GitHub also now has Linux ARM runners, should we need them.

87305 of 95766 relevant lines covered (91.16%)

3.87 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

66.1
/src/python/pants/backend/python/lint/add_trailing_comma/rules_integration_test.py
1
# Copyright 2022 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3

4
from __future__ import annotations
2✔
5

6
import pytest
2✔
7

8
from pants.backend.python import target_types_rules
2✔
9
from pants.backend.python.lint.add_trailing_comma.rules import (
2✔
10
    AddTrailingCommaFieldSet,
11
    AddTrailingCommaRequest,
12
)
13
from pants.backend.python.lint.add_trailing_comma.rules import rules as add_trailing_comma_rules
2✔
14
from pants.backend.python.lint.add_trailing_comma.subsystem import AddTrailingComma
2✔
15
from pants.backend.python.lint.add_trailing_comma.subsystem import (
2✔
16
    rules as add_trailing_comma_subsystem_rules,
17
)
18
from pants.backend.python.target_types import PythonSourcesGeneratorTarget
2✔
19
from pants.core.goals.fmt import FmtResult
2✔
20
from pants.core.util_rules import config_files, source_files
2✔
21
from pants.core.util_rules.source_files import SourceFiles, SourceFilesRequest
2✔
22
from pants.engine.addresses import Address
2✔
23
from pants.engine.target import Target
2✔
24
from pants.testutil.python_interpreter_selection import all_major_minor_python_versions
2✔
25
from pants.testutil.python_rule_runner import PythonRuleRunner
2✔
26
from pants.testutil.rule_runner import QueryRule
2✔
27

28

29
@pytest.fixture
2✔
30
def rule_runner() -> PythonRuleRunner:
2✔
31
    return PythonRuleRunner(
2✔
32
        rules=[
33
            *add_trailing_comma_rules(),
34
            *add_trailing_comma_subsystem_rules(),
35
            *source_files.rules(),
36
            *config_files.rules(),
37
            *target_types_rules.rules(),
38
            QueryRule(FmtResult, (AddTrailingCommaRequest.Batch,)),
39
            QueryRule(SourceFiles, (SourceFilesRequest,)),
40
        ],
41
        target_types=[PythonSourcesGeneratorTarget],
42
    )
43

44

45
GOOD_FILE = "foobar = [1, 2]\nbazqux = [\n  1,\n  2,\n]\n"
2✔
46
BAD_FILE = "foobar = [1, 2,]\nbazqux = [\n  1,\n  2\n]\n"
2✔
47

48

49
def run_add_trailing_comma(
2✔
50
    rule_runner: PythonRuleRunner,
51
    targets: list[Target],
52
    *,
53
    extra_args: list[str] | None = None,
54
) -> FmtResult:
55
    rule_runner.set_options(
2✔
56
        ["--backend-packages=pants.backend.python.lint.add_trailing_comma", *(extra_args or ())],
57
        env_inherit={"PATH", "PYENV_ROOT", "HOME"},
58
    )
59
    field_sets = [AddTrailingCommaFieldSet.create(tgt) for tgt in targets]
2✔
60
    input_sources = rule_runner.request(
2✔
61
        SourceFiles,
62
        [
63
            SourceFilesRequest(field_set.source for field_set in field_sets),
64
        ],
65
    )
66
    fmt_result = rule_runner.request(
2✔
67
        FmtResult,
68
        [
69
            AddTrailingCommaRequest.Batch(
70
                "",
71
                input_sources.snapshot.files,
72
                partition_metadata=None,
73
                snapshot=input_sources.snapshot,
74
            ),
75
        ],
76
    )
77
    return fmt_result
2✔
78

79

80
@pytest.mark.platform_specific_behavior
2✔
81
@pytest.mark.parametrize(
2✔
82
    "major_minor_interpreter",
83
    all_major_minor_python_versions(AddTrailingComma.default_interpreter_constraints),
84
)
85
def test_passing_source(rule_runner: PythonRuleRunner, major_minor_interpreter: str) -> None:
2✔
86
    rule_runner.write_files({"f.py": GOOD_FILE, "BUILD": "python_sources(name='t')"})
2✔
87
    tgt = rule_runner.get_target(Address("", target_name="t", relative_file_path="f.py"))
2✔
88
    fmt_result = run_add_trailing_comma(
2✔
89
        rule_runner,
90
        [tgt],
91
        extra_args=[
92
            f"--add-trailing-comma-interpreter-constraints=['=={major_minor_interpreter}.*']"
93
        ],
94
    )
95
    assert fmt_result.stdout == ""
2✔
96
    assert fmt_result.output == rule_runner.make_snapshot({"f.py": GOOD_FILE})
2✔
97
    assert fmt_result.did_change is False
2✔
98

99

100
def test_failing_source(rule_runner: PythonRuleRunner) -> None:
2✔
101
    rule_runner.write_files({"f.py": BAD_FILE, "BUILD": "python_sources(name='t')"})
×
102
    tgt = rule_runner.get_target(Address("", target_name="t", relative_file_path="f.py"))
×
103
    fmt_result = run_add_trailing_comma(rule_runner, [tgt])
×
104
    assert fmt_result.output == rule_runner.make_snapshot({"f.py": GOOD_FILE})
×
105
    assert fmt_result.did_change is True
×
106

107

108
def test_multiple_targets(rule_runner: PythonRuleRunner) -> None:
2✔
109
    rule_runner.write_files(
×
110
        {"good.py": GOOD_FILE, "bad.py": BAD_FILE, "BUILD": "python_sources(name='t')"}
111
    )
112
    tgts = [
×
113
        rule_runner.get_target(Address("", target_name="t", relative_file_path="good.py")),
114
        rule_runner.get_target(Address("", target_name="t", relative_file_path="bad.py")),
115
    ]
116
    fmt_result = run_add_trailing_comma(rule_runner, tgts)
×
117
    assert fmt_result.output == rule_runner.make_snapshot(
×
118
        {"good.py": GOOD_FILE, "bad.py": GOOD_FILE}
119
    )
120
    assert fmt_result.did_change is True
×
121

122

123
def test_stub_files(rule_runner: PythonRuleRunner) -> None:
2✔
124
    rule_runner.write_files(
×
125
        {
126
            "good.pyi": GOOD_FILE,
127
            "good.py": GOOD_FILE,
128
            "bad.pyi": BAD_FILE,
129
            "bad.py": BAD_FILE,
130
            "BUILD": "python_sources(name='t')",
131
        }
132
    )
133

134
    good_tgts = [
×
135
        rule_runner.get_target(Address("", target_name="t", relative_file_path="good.pyi")),
136
        rule_runner.get_target(Address("", target_name="t", relative_file_path="good.py")),
137
    ]
138
    fmt_result = run_add_trailing_comma(rule_runner, good_tgts)
×
139
    assert fmt_result.stdout == ""
×
140
    assert fmt_result.output == rule_runner.make_snapshot(
×
141
        {"good.py": GOOD_FILE, "good.pyi": GOOD_FILE}
142
    )
143
    assert not fmt_result.did_change
×
144

145
    bad_tgts = [
×
146
        rule_runner.get_target(Address("", target_name="t", relative_file_path="bad.pyi")),
147
        rule_runner.get_target(Address("", target_name="t", relative_file_path="bad.py")),
148
    ]
149
    fmt_result = run_add_trailing_comma(rule_runner, bad_tgts)
×
150
    assert fmt_result.output == rule_runner.make_snapshot(
×
151
        {"bad.py": GOOD_FILE, "bad.pyi": GOOD_FILE}
152
    )
153
    assert fmt_result.did_change
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc