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

pantsbuild / pants / 19015773527

02 Nov 2025 05:33PM UTC coverage: 17.872% (-62.4%) from 80.3%
19015773527

Pull #22816

github

web-flow
Merge a12d75757 into 6c024e162
Pull Request #22816: Update Pants internal Python to 3.14

4 of 5 new or added lines in 3 files covered. (80.0%)

28452 existing lines in 683 files now uncovered.

9831 of 55007 relevant lines covered (17.87%)

0.18 hits per line

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

0.0
/src/python/pants/backend/sql/lint/sqlfluff/rules.py
1
# Copyright 2024 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
UNCOV
3
from __future__ import annotations
×
4

UNCOV
5
from collections.abc import Iterable
×
UNCOV
6
from dataclasses import dataclass
×
UNCOV
7
from typing import Any, assert_never
×
8

UNCOV
9
from pants.backend.python.util_rules import pex
×
UNCOV
10
from pants.backend.python.util_rules.pex import PexRequest, VenvPexProcess, create_venv_pex
×
UNCOV
11
from pants.backend.sql.lint.sqlfluff.subsystem import Sqlfluff, SqlfluffFieldSet, SqlfluffMode
×
UNCOV
12
from pants.core.goals.fix import FixResult, FixTargetsRequest
×
UNCOV
13
from pants.core.goals.fmt import FmtResult, FmtTargetsRequest
×
UNCOV
14
from pants.core.goals.lint import LintResult, LintTargetsRequest
×
UNCOV
15
from pants.core.util_rules.config_files import find_config_file
×
UNCOV
16
from pants.core.util_rules.partitions import PartitionerType
×
UNCOV
17
from pants.core.util_rules.source_files import SourceFilesRequest, determine_source_files
×
UNCOV
18
from pants.engine.fs import MergeDigests
×
UNCOV
19
from pants.engine.internals.native_engine import Snapshot
×
UNCOV
20
from pants.engine.intrinsics import execute_process, merge_digests
×
UNCOV
21
from pants.engine.process import FallibleProcessResult
×
UNCOV
22
from pants.engine.rules import Rule, collect_rules, concurrently, implicitly, rule
×
UNCOV
23
from pants.util.logging import LogLevel
×
UNCOV
24
from pants.util.meta import classproperty
×
UNCOV
25
from pants.util.strutil import pluralize
×
26

27

UNCOV
28
class SqlfluffFixRequest(FixTargetsRequest):
×
UNCOV
29
    field_set_type = SqlfluffFieldSet
×
UNCOV
30
    tool_subsystem = Sqlfluff  # type: ignore[assignment]
×
UNCOV
31
    partitioner_type = PartitionerType.DEFAULT_SINGLE_PARTITION
×
32

33
    # We don't need to include automatically added lint rules for this SqlfluffFixRequest,
34
    # because these lint rules are already checked by SqlfluffLintRequest.
UNCOV
35
    enable_lint_rules = False
×
36

37

UNCOV
38
class SqlfluffLintRequest(LintTargetsRequest):
×
UNCOV
39
    field_set_type = SqlfluffFieldSet
×
UNCOV
40
    tool_subsystem = Sqlfluff  # type: ignore[assignment]
×
UNCOV
41
    partitioner_type = PartitionerType.DEFAULT_SINGLE_PARTITION
×
42

43

UNCOV
44
class SqlfluffFormatRequest(FmtTargetsRequest):
×
UNCOV
45
    field_set_type = SqlfluffFieldSet
×
UNCOV
46
    tool_subsystem = Sqlfluff  # type: ignore[assignment]
×
UNCOV
47
    partitioner_type = PartitionerType.DEFAULT_SINGLE_PARTITION
×
48

UNCOV
49
    @classproperty
×
UNCOV
50
    def tool_name(cls) -> str:
×
51
        return "sqlfluff format"
×
52

UNCOV
53
    @classproperty
×
UNCOV
54
    def tool_id(cls) -> str:
×
55
        return "sqlfluff-format"
×
56

57

UNCOV
58
@dataclass(frozen=True)
×
UNCOV
59
class _RunSqlfluffRequest:
×
UNCOV
60
    snapshot: Snapshot
×
UNCOV
61
    mode: SqlfluffMode
×
62

63

UNCOV
64
async def run_sqlfluff(
×
65
    request: _RunSqlfluffRequest,
66
    sqlfluff: Sqlfluff,
67
) -> FallibleProcessResult:
68
    sqlfluff_pex_get = create_venv_pex(**implicitly({sqlfluff.to_pex_request(): PexRequest}))
×
69
    config_files_get = find_config_file(sqlfluff.config_request(request.snapshot.dirs))
×
70
    sqlfluff_pex, config_files = await concurrently(sqlfluff_pex_get, config_files_get)
×
71
    input_digest = await merge_digests(
×
72
        MergeDigests((request.snapshot.digest, config_files.snapshot.digest))
73
    )
74

75
    initial_args: tuple[str, ...] = ()
×
76
    if request.mode is SqlfluffMode.FMT:
×
77
        initial_args = ("format",)
×
78
    elif request.mode is SqlfluffMode.FIX:
×
79
        initial_args = ("fix", *sqlfluff.fix_args)
×
80
    elif request.mode is SqlfluffMode.LINT:
×
81
        initial_args = ("lint",)
×
82
    else:
83
        assert_never(request.mode)
×
84

85
    conf_args = ["--config", sqlfluff.config] if sqlfluff.config else []
×
86

87
    result = await execute_process(
×
88
        **implicitly(
89
            VenvPexProcess(
90
                sqlfluff_pex,
91
                argv=(*initial_args, *conf_args, *sqlfluff.args, *request.snapshot.files),
92
                input_digest=input_digest,
93
                output_files=request.snapshot.files,
94
                description=f"Run sqlfluff {' '.join(initial_args)} on {pluralize(len(request.snapshot.files), 'file')}.",
95
                level=LogLevel.DEBUG,
96
            )
97
        )
98
    )
99
    return result
×
100

101

UNCOV
102
@rule(desc="Fix with sqlfluff fix", level=LogLevel.DEBUG)
×
UNCOV
103
async def sqlfluff_fix(request: SqlfluffFixRequest.Batch, sqlfluff: Sqlfluff) -> FixResult:
×
104
    result = await run_sqlfluff(
×
105
        _RunSqlfluffRequest(snapshot=request.snapshot, mode=SqlfluffMode.FIX), sqlfluff
106
    )
107
    return await FixResult.create(request, result)
×
108

109

UNCOV
110
@rule(desc="Lint with sqlfluff lint", level=LogLevel.DEBUG)
×
UNCOV
111
async def sqlfluff_lint(
×
112
    request: SqlfluffLintRequest.Batch[SqlfluffFieldSet, Any], sqlfluff: Sqlfluff
113
) -> LintResult:
114
    source_files = await determine_source_files(
×
115
        SourceFilesRequest(field_set.source for field_set in request.elements)
116
    )
117
    result = await run_sqlfluff(
×
118
        _RunSqlfluffRequest(snapshot=source_files.snapshot, mode=SqlfluffMode.LINT), sqlfluff
119
    )
120
    return LintResult.create(request, result)
×
121

122

UNCOV
123
@rule(desc="Format with sqlfluff format", level=LogLevel.DEBUG)
×
UNCOV
124
async def sqlfluff_fmt(request: SqlfluffFormatRequest.Batch, sqlfluff: Sqlfluff) -> FmtResult:
×
125
    result = await run_sqlfluff(
×
126
        _RunSqlfluffRequest(snapshot=request.snapshot, mode=SqlfluffMode.FMT), sqlfluff
127
    )
128
    return await FmtResult.create(request, result)
×
129

130

UNCOV
131
def rules() -> Iterable[Rule]:
×
UNCOV
132
    return (
×
133
        *collect_rules(),
134
        *SqlfluffLintRequest.rules(),
135
        *SqlfluffFixRequest.rules(),
136
        *SqlfluffFormatRequest.rules(),
137
        *pex.rules(),
138
    )
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

© 2025 Coveralls, Inc