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

pantsbuild / pants / 23177125175

17 Mar 2026 03:32AM UTC coverage: 52.677% (-40.3%) from 92.932%
23177125175

Pull #23177

github

web-flow
Merge 1824dfbf4 into 0b9fdfb0e
Pull Request #23177: Bump the gha-deps group across 1 directory with 4 updates

31687 of 60153 relevant lines covered (52.68%)

1.05 hits per line

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

92.86
/src/python/pants/backend/terraform/target_types.py
1
# Copyright 2021 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
from dataclasses import dataclass
2✔
7

8
from pants.engine.internals.native_engine import AddressInput
2✔
9
from pants.engine.rules import collect_rules, rule
2✔
10
from pants.engine.target import (
2✔
11
    COMMON_TARGET_FIELDS,
12
    AllTargets,
13
    AsyncFieldMixin,
14
    Dependencies,
15
    DescriptionField,
16
    FieldSet,
17
    MultipleSourcesField,
18
    SingleSourceField,
19
    StringField,
20
    Target,
21
    Targets,
22
    generate_multiple_sources_field_help_message,
23
)
24
from pants.util.strutil import help_text, softwrap
2✔
25

26

27
class TerraformDependenciesField(Dependencies):
2✔
28
    pass
2✔
29

30

31
class TerraformModuleSourcesField(MultipleSourcesField):
2✔
32
    default = ("*.tf",)
2✔
33
    expected_file_extensions = (".tf",)
2✔
34
    ban_subdirectories = True
2✔
35
    help = generate_multiple_sources_field_help_message(
2✔
36
        "Example: `sources=['example.tf', 'new_*.tf', '!old_ignore.tf']`"
37
    )
38

39

40
@dataclass(frozen=True)
2✔
41
class TerraformFieldSet(FieldSet):
2✔
42
    required_fields = (TerraformModuleSourcesField,)
2✔
43

44
    sources: TerraformModuleSourcesField
2✔
45
    dependencies: TerraformDependenciesField
2✔
46

47

48
class TerraformModuleTarget(Target):
2✔
49
    alias = "terraform_module"
2✔
50
    core_fields = (*COMMON_TARGET_FIELDS, TerraformDependenciesField, TerraformModuleSourcesField)
2✔
51
    help = help_text(
2✔
52
        """
53
        A single Terraform module corresponding to a directory.
54

55
        There must only be one `terraform_module` in a directory.
56

57
        Use `terraform_modules` to generate `terraform_module` targets for less boilerplate.
58
        """
59
    )
60

61

62
class TerraformRootModuleField(StringField, AsyncFieldMixin):
2✔
63
    """The module to use as the root module for a Terraform deployment."""
64

65
    required = True
2✔
66
    alias = "root_module"
2✔
67
    help = help_text(
2✔
68
        """
69
        The Terraform module to use as the root module.
70

71
        Example: `root_module=":my_module"`
72
        """
73
    )
74

75
    def to_address_input(self) -> AddressInput:
2✔
76
        if not self.value:
×
77
            raise ValueError(
×
78
                softwrap(
79
                    f"""
80
            A Terraform deployment must have a nonempty {self.alias} field,
81
             but {self.address} was empty"""
82
                )
83
            )
84
        return AddressInput.parse(
×
85
            self.value,
86
            relative_to=self.address.spec_path,
87
            description_of_origin=f"the `{self.alias} field in the `{TerraformDeploymentTarget.alias}` target {self.address}",
88
        )
89

90

91
class TerraformBackendConfigField(SingleSourceField):
2✔
92
    default = ".tfbackend"
2✔
93
    help = "Configuration to be merged with what is in the root module's 'backend' block"
2✔
94

95

96
class TerraformBackendTarget(Target):
2✔
97
    alias = "terraform_backend"
2✔
98
    core_fields = (*COMMON_TARGET_FIELDS, TerraformBackendConfigField)
2✔
99
    help = "Configuration to be merged with what is in the root module's 'backend' block"
2✔
100

101

102
class TerraformVarFileSourceField(MultipleSourcesField):
2✔
103
    default = ("*.tfvars",)
2✔
104
    expected_file_extensions = (".tfvars",)
2✔
105
    help = generate_multiple_sources_field_help_message(
2✔
106
        "Example: `sources=['common.tfvars', 'prod.tfvars']`"
107
    )
108

109

110
class TerraformVarFileTarget(Target):
2✔
111
    alias = "terraform_var_files"
2✔
112
    core_fields = (*COMMON_TARGET_FIELDS, TerraformVarFileSourceField)
2✔
113
    help = "Terraform vars files"
2✔
114

115

116
class TerraformDeploymentTarget(Target):
2✔
117
    alias = "terraform_deployment"
2✔
118
    core_fields = (
2✔
119
        *COMMON_TARGET_FIELDS,
120
        TerraformDependenciesField,
121
        TerraformRootModuleField,
122
    )
123
    help = "A deployment of Terraform"
2✔
124

125

126
@dataclass(frozen=True)
2✔
127
class TerraformDeploymentFieldSet(FieldSet):
2✔
128
    required_fields = (
2✔
129
        TerraformDependenciesField,
130
        TerraformRootModuleField,
131
    )
132
    description: DescriptionField
2✔
133
    root_module: TerraformRootModuleField
2✔
134
    dependencies: TerraformDependenciesField
2✔
135

136

137
class AllTerraformDeploymentTargets(Targets):
2✔
138
    pass
2✔
139

140

141
@rule
2✔
142
async def all_terraform_deployment_targets(targets: AllTargets) -> AllTerraformDeploymentTargets:
2✔
143
    return AllTerraformDeploymentTargets(
×
144
        tgt for tgt in targets if TerraformDeploymentFieldSet.is_applicable(tgt)
145
    )
146

147

148
class LockfileSourceField(SingleSourceField):
2✔
149
    """Source field for synthesized `_lockfile` targets."""
150

151
    default = ".terraform.lock.hcl"
2✔
152

153

154
class LockfileDependenciesField(Dependencies):
2✔
155
    pass
2✔
156

157

158
class TerraformLockfileTarget(Target):
2✔
159
    alias = "_terraform_lockfile"
2✔
160
    core_fields = (*COMMON_TARGET_FIELDS, LockfileSourceField, LockfileDependenciesField)
2✔
161
    help = help_text(
2✔
162
        """
163
        A target for lockfiles in order to include them in the dependency graph of other targets.
164

165
        This tracks them so that `--changed-since --changed-dependents` works properly for targets
166
        relying on a particular lockfile.
167
        """
168
    )
169

170

171
def rules():
2✔
172
    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