• 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/helm/check/kubeconform/common.py
1
# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3

UNCOV
4
from __future__ import annotations
×
5

UNCOV
6
import logging
×
UNCOV
7
import os
×
UNCOV
8
from abc import ABCMeta
×
UNCOV
9
from dataclasses import dataclass
×
UNCOV
10
from itertools import chain
×
11

UNCOV
12
from pants.backend.helm.check.kubeconform.extra_fields import KubeconformFieldSet
×
UNCOV
13
from pants.backend.helm.check.kubeconform.subsystem import KubeconformSubsystem
×
UNCOV
14
from pants.backend.helm.subsystems.helm import HelmSubsystem
×
UNCOV
15
from pants.backend.helm.util_rules.renderer import RenderedHelmFiles
×
UNCOV
16
from pants.core.goals.check import CheckRequest, CheckResult
×
UNCOV
17
from pants.core.util_rules.env_vars import environment_vars_subset
×
UNCOV
18
from pants.core.util_rules.external_tool import DownloadedExternalTool, download_external_tool
×
UNCOV
19
from pants.engine.env_vars import EnvironmentVarsRequest
×
UNCOV
20
from pants.engine.fs import CreateDigest, FileEntry
×
UNCOV
21
from pants.engine.intrinsics import create_digest, execute_process
×
UNCOV
22
from pants.engine.platform import Platform
×
UNCOV
23
from pants.engine.process import Process, ProcessCacheScope
×
UNCOV
24
from pants.engine.rules import collect_rules, concurrently, implicitly, rule
×
UNCOV
25
from pants.util.frozendict import FrozenDict
×
UNCOV
26
from pants.util.logging import LogLevel
×
27

UNCOV
28
logger = logging.getLogger(__name__)
×
29

30

UNCOV
31
class KubeconformCheckRequest(CheckRequest, metaclass=ABCMeta):
×
UNCOV
32
    tool_name = KubeconformSubsystem.name
×
33

34

UNCOV
35
@dataclass(frozen=True)
×
UNCOV
36
class RunKubeconformRequest:
×
UNCOV
37
    field_set: KubeconformFieldSet
×
UNCOV
38
    rendered_files: RenderedHelmFiles
×
39

40

UNCOV
41
@dataclass(frozen=True)
×
UNCOV
42
class KubeconformSetup:
×
UNCOV
43
    binary: DownloadedExternalTool
×
UNCOV
44
    env: FrozenDict[str, str]
×
45

UNCOV
46
    @property
×
UNCOV
47
    def cache_dir(self) -> str:
×
48
        return "__kubeconform_cache"
×
49

UNCOV
50
    @property
×
UNCOV
51
    def append_only_caches(self) -> dict[str, str]:
×
52
        return {"kubeconform": self.cache_dir}
×
53

54

UNCOV
55
@rule
×
UNCOV
56
async def setup_kube_conform(
×
57
    helm: HelmSubsystem,
58
    kubeconform: KubeconformSubsystem,
59
    platform: Platform,
60
) -> KubeconformSetup:
61
    downloaded_tool, env = await concurrently(
×
62
        download_external_tool(kubeconform.get_request(platform)),
63
        environment_vars_subset(EnvironmentVarsRequest(helm.extra_env_vars), **implicitly()),
64
    )
65
    return KubeconformSetup(downloaded_tool, env)
×
66

67

UNCOV
68
@rule
×
UNCOV
69
async def run_kubeconform(
×
70
    request: RunKubeconformRequest, setup: KubeconformSetup, kubeconform: KubeconformSubsystem
71
) -> CheckResult:
72
    tool_relpath = "__kubeconform"
×
73
    chart_relpath = "__chart"
×
74
    immutable_input_digests = {
×
75
        tool_relpath: setup.binary.digest,
76
        chart_relpath: request.rendered_files.chart.snapshot.digest,
77
    }
78

79
    debug_requested = 0 < logger.getEffectiveLevel() <= LogLevel.DEBUG.level
×
80
    ignore_sources = request.field_set.ignore_sources.value or ()
×
81

82
    result = await execute_process(
×
83
        Process(
84
            argv=[
85
                os.path.join(tool_relpath, setup.binary.exe),
86
                "-cache",
87
                setup.cache_dir,
88
                *(("-n", str(kubeconform.concurrency)) if kubeconform.concurrency else ()),
89
                *(("-debug",) if debug_requested else ()),
90
                *(("-summary",) if kubeconform.summary else ()),
91
                *(("-verbose",) if kubeconform.verbose else ()),
92
                *(("-strict",) if request.field_set.strict.value else ()),
93
                *(
94
                    ("-ignore-missing-schemas",)
95
                    if request.field_set.ignore_missing_schemas.value
96
                    else ()
97
                ),
98
                *chain.from_iterable(
99
                    ("-ignore-filename-pattern", pattern) for pattern in ignore_sources
100
                ),
101
                *chain.from_iterable(
102
                    ("-schema-location", schema) for schema in kubeconform.schema_locations
103
                ),
104
                *(
105
                    ("-kubernetes-version", request.field_set.kubernetes_version.value)
106
                    if request.field_set.kubernetes_version.value
107
                    else ()
108
                ),
109
                *(
110
                    ("-reject", ",".join(request.field_set.reject_kinds.value))
111
                    if request.field_set.reject_kinds.value
112
                    else ()
113
                ),
114
                *(
115
                    ("-skip", ",".join(request.field_set.skip_kinds.value))
116
                    if request.field_set.skip_kinds.value
117
                    else ()
118
                ),
119
                "-output",
120
                kubeconform.output_type.value,
121
                *(request.rendered_files.snapshot.files),
122
            ],
123
            env=setup.env,
124
            immutable_input_digests=immutable_input_digests,
125
            input_digest=request.rendered_files.snapshot.digest,
126
            append_only_caches=setup.append_only_caches,
127
            description=f"Validating Kubernetes manifests for {request.field_set.address}",
128
            level=LogLevel.DEBUG,
129
            cache_scope=ProcessCacheScope.SUCCESSFUL,
130
        ),
131
        **implicitly(),
132
    )
133

134
    report_digest = await create_digest(
×
135
        CreateDigest(
136
            [
137
                FileEntry(
138
                    path=f"{request.field_set.address.path_safe_spec}-kubeconform.stdout",
139
                    file_digest=result.stdout_digest,
140
                )
141
            ]
142
        )
143
    )
144

145
    return CheckResult.from_fallible_process_result(
×
146
        result, partition_description=request.field_set.address.spec, report=report_digest
147
    )
148

149

UNCOV
150
def rules():
×
UNCOV
151
    return collect_rules()
×
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