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

pantsbuild / pants / 20332790708

18 Dec 2025 09:48AM UTC coverage: 64.992% (-15.3%) from 80.295%
20332790708

Pull #22949

github

web-flow
Merge f730a56cd into 407284c67
Pull Request #22949: Add experimental uv resolver for Python lockfiles

54 of 97 new or added lines in 5 files covered. (55.67%)

8270 existing lines in 295 files now uncovered.

48990 of 75379 relevant lines covered (64.99%)

1.81 hits per line

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

97.44
/src/python/pants/backend/terraform/testutil.py
1
# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3
from __future__ import annotations
1✔
4

5
from dataclasses import dataclass
1✔
6
from pathlib import Path
1✔
7
from textwrap import dedent  # noqa: PNT20
1✔
8

9
import pytest
1✔
10

11
from pants.backend.terraform import dependencies, dependency_inference, tool
1✔
12
from pants.backend.terraform.dependencies import (
1✔
13
    TerraformDependenciesRequest,
14
    TerraformDependenciesResponse,
15
    TerraformInitRequest,
16
    TerraformInvocationRequirements,
17
)
18
from pants.backend.terraform.goals.deploy import DeployTerraformFieldSet
1✔
19
from pants.backend.terraform.goals.deploy import rules as terraform_deploy_rules
1✔
20
from pants.backend.terraform.goals.lockfiles import rules as terraform_lockfile_rules
1✔
21
from pants.backend.terraform.target_types import (
1✔
22
    TerraformBackendTarget,
23
    TerraformDeploymentTarget,
24
    TerraformLockfileTarget,
25
    TerraformModuleTarget,
26
    TerraformVarFileTarget,
27
)
28
from pants.core.goals import deploy
1✔
29
from pants.core.goals.deploy import DeployProcess
1✔
30
from pants.core.register import rules as core_rules
1✔
31
from pants.core.util_rules import source_files
1✔
32
from pants.engine import process
1✔
33
from pants.engine.fs import DigestEntries
1✔
34
from pants.engine.internals.native_engine import Address, Digest
1✔
35
from pants.engine.rules import QueryRule
1✔
36
from pants.testutil.rule_runner import RuleRunner
1✔
37

38
all_terraform_target_types = [
1✔
39
    TerraformModuleTarget,
40
    TerraformDeploymentTarget,
41
    TerraformBackendTarget,
42
    TerraformVarFileTarget,
43
    TerraformLockfileTarget,
44
]
45

46

47
@pytest.fixture
1✔
48
def rule_runner_with_auto_approve() -> RuleRunner:
1✔
49
    rule_runner = RuleRunner(
1✔
50
        target_types=all_terraform_target_types,
51
        rules=[
52
            *dependency_inference.rules(),
53
            *dependencies.rules(),
54
            *tool.rules(),
55
            *terraform_deploy_rules(),
56
            *terraform_lockfile_rules(),
57
            *source_files.rules(),
58
            *deploy.rules(),
59
            *core_rules(),
60
            *process.rules(),
61
            QueryRule(DeployProcess, (DeployTerraformFieldSet,)),
62
            QueryRule(DigestEntries, (Digest,)),
63
            QueryRule(TerraformInvocationRequirements, (TerraformInitRequest,)),
64
            QueryRule(TerraformDependenciesResponse, (TerraformDependenciesRequest,)),
65
        ],
66
        preserve_tmpdirs=True,
67
    )
68
    # We have to forward "--auto-approve" to TF because `mock_console` is noninteractive
69
    rule_runner.set_options(["--download-terraform-args='-auto-approve'"])
1✔
70
    return rule_runner
1✔
71

72

73
@dataclass
1✔
74
class StandardDeployment:
1✔
75
    files: dict[str, str]
1✔
76
    state_file: Path
1✔
77
    target: Address = Address("src/tf", target_name="stg")
1✔
78

79
    def with_added_files(self, files: dict[str, str]) -> StandardDeployment:
1✔
UNCOV
80
        return StandardDeployment(
×
81
            files={**self.files, **files}, state_file=self.state_file, target=self.target
82
        )
83

84

85
@pytest.fixture
1✔
86
def standard_deployment(tmpdir) -> StandardDeployment:
1✔
87
    state_file = Path(str(tmpdir.mkdir(".terraform").join("state.json")))
1✔
88
    return StandardDeployment(
1✔
89
        {
90
            "src/tf/BUILD": dedent(
91
                """
92
                terraform_deployment(
93
                    name="stg",
94
                    root_module=":mod",
95
                    dependencies=[":stg.tfvars", ":stg.tfbackend"],
96
                )
97
                terraform_backend(name="stg.tfbackend", source="stg.tfbackend")
98
                terraform_var_files(name="stg.tfvars")
99
                terraform_module(name="mod")
100
            """
101
            ),
102
            "src/tf/main.tf": dedent(
103
                """
104
                terraform {
105
                    backend "local" {
106
                        path = "/tmp/will/not/exist"
107
                    }
108
                    required_providers {
109
                        null = {
110
                          source = "hashicorp/null"
111
                          version = "~> 3.2.0, <= 3.2.2"
112
                        }
113
                    }
114
                }
115
                variable "var0" {}
116
                resource "null_resource" "dep" {}
117
                """
118
            ),
119
            "src/tf/stg.tfvars": "var0=0",
120
            "src/tf/stg.tfbackend": f'path="{state_file}"',
121
        },
122
        state_file,
123
    )
124

125

126
terraform_lockfile = """\
1✔
127
provider "registry.terraform.io/hashicorp/null" {
128
  version     = "3.2.0"
129
  constraints = "~> 3.2.0, <= 3.2.2"
130
  hashes = [
131
    "h1:pfjuwssoCoBDRbutlVLAP8wiDrkQ3G4d3rs+f7uSh2A=",
132
    "zh:1d88ea3af09dcf91ad0aaa0d3978ca8dcb49dc866c8615202b738d73395af6b5",
133
    "zh:3844db77bfac2aca43aaa46f3f698c8e5320a47e838ee1318408663449547e7e",
134
    "zh:538fadbd87c576a332b7524f352e6004f94c27afdd3b5d105820d328dc49c5e3",
135
    "zh:56def6f00fc2bc9c3c265b841ce71e80b77e319de7b0f662425b8e5e7eb26846",
136
    "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3",
137
    "zh:8fce56e5f1d13041d8047a1d0c93f930509704813a28f8d39c2b2082d7eebf9f",
138
    "zh:989e909a5eca96b8bdd4a0e8609f1bd525949fd226ae870acedf2da0c55b0451",
139
    "zh:99ddc34ad13e04e9c3477f5422fbec20fc13395ff940720c287bfa5c546d2fbc",
140
    "zh:b546666da4b4b60c0eec23faab7f94dc900e48f66b5436fc1ac0b87c6709ef04",
141
    "zh:d56643cb08cba6e074d70c4af37d5de2bd7c505f81d866d6d47c9e1d28ec65d1",
142
    "zh:f39ac5ff9e9d00e6a670bce6825529eded4b0b4966abba36a387db5f0712d7ba",
143
    "zh:fe102389facd09776502327352be99becc1ac09e80bc287db84a268172be641f",
144
  ]
145
}"""
146

147
terraform_lockfile_regenerated = """\
1✔
148
# This file is maintained automatically by "terraform init".
149
# Manual edits may be lost in future updates.
150

151
provider "registry.terraform.io/hashicorp/null" {
152
  version     = "3.2.2"
153
  constraints = "~> 3.2.0, <= 3.2.2"
154
  hashes = [
155
    "h1:Gef5VGfobY5uokA5nV/zFvWeMNR2Pmq79DH94QnNZPM=",
156
    "h1:zT1ZbegaAYHwQa+QwIFugArWikRJI9dqohj8xb0GY88=",
157
    "zh:3248aae6a2198f3ec8394218d05bd5e42be59f43a3a7c0b71c66ec0df08b69e7",
158
    "zh:32b1aaa1c3013d33c245493f4a65465eab9436b454d250102729321a44c8ab9a",
159
    "zh:38eff7e470acb48f66380a73a5c7cdd76cc9b9c9ba9a7249c7991488abe22fe3",
160
    "zh:4c2f1faee67af104f5f9e711c4574ff4d298afaa8a420680b0cb55d7bbc65606",
161
    "zh:544b33b757c0b954dbb87db83a5ad921edd61f02f1dc86c6186a5ea86465b546",
162
    "zh:696cf785090e1e8cf1587499516b0494f47413b43cb99877ad97f5d0de3dc539",
163
    "zh:6e301f34757b5d265ae44467d95306d61bef5e41930be1365f5a8dcf80f59452",
164
    "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3",
165
    "zh:913a929070c819e59e94bb37a2a253c228f83921136ff4a7aa1a178c7cce5422",
166
    "zh:aa9015926cd152425dbf86d1abdbc74bfe0e1ba3d26b3db35051d7b9ca9f72ae",
167
    "zh:bb04798b016e1e1d49bcc76d62c53b56c88c63d6f2dfe38821afef17c416a0e1",
168
    "zh:c23084e1b23577de22603cff752e59128d83cfecc2e6819edadd8cf7a10af11e",
169
  ]
170
}
171
"""
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