Skip to content

Commit ba18d88

Browse files
committed
Add ranges to terraform_required_version errors
1 parent 5382486 commit ba18d88

File tree

2 files changed

+89
-7
lines changed

2 files changed

+89
-7
lines changed

rules/terraform_required_version.go

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package rules
22

33
import (
4+
"path/filepath"
5+
46
"github.com/hashicorp/hcl/v2"
57
"github.com/terraform-linters/tflint-plugin-sdk/hclext"
68
"github.com/terraform-linters/tflint-plugin-sdk/tflint"
@@ -78,13 +80,37 @@ func (r *TerraformRequiredVersionRule) Check(runner tflint.Runner) error {
7880
exists = exists || ok
7981
}
8082

81-
if !exists {
82-
return runner.EmitIssue(
83-
r,
84-
`terraform "required_version" attribute is required`,
85-
hcl.Range{},
86-
)
83+
if exists {
84+
return nil
85+
}
86+
87+
var missingRange hcl.Range
88+
89+
if len(body.Blocks) > 0 {
90+
missingRange = body.Blocks[0].DefRange
91+
} else {
92+
// If there are no "terraform" blocks, create a hcl.Range for the files
93+
var filename string
94+
for k := range files {
95+
filename = k
96+
break
97+
}
98+
99+
if len(files) == 1 {
100+
missingRange = hcl.Range{
101+
Filename: filename,
102+
}
103+
} else {
104+
// If there are multiple files, reference the module directory
105+
missingRange = hcl.Range{
106+
Filename: filepath.Dir(filename) + string(filepath.Separator),
107+
}
108+
}
87109
}
88110

89-
return nil
111+
return runner.EmitIssue(
112+
r,
113+
`terraform "required_version" attribute is required`,
114+
missingRange,
115+
)
90116
}

rules/terraform_required_version_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package rules
22

33
import (
4+
"path/filepath"
45
"testing"
56

7+
"github.com/hashicorp/hcl/v2"
68
"github.com/terraform-linters/tflint-plugin-sdk/helper"
79
)
810

@@ -25,6 +27,17 @@ terraform {}
2527
{
2628
Rule: NewTerraformRequiredVersionRule(),
2729
Message: "terraform \"required_version\" attribute is required",
30+
Range: hcl.Range{
31+
Filename: "module.tf",
32+
Start: hcl.Pos{
33+
Line: 2,
34+
Column: 1,
35+
},
36+
End: hcl.Pos{
37+
Line: 2,
38+
Column: 10,
39+
},
40+
},
2841
},
2942
},
3043
},
@@ -53,6 +66,23 @@ terraform {
5366
`,
5467
Expected: helper.Issues{},
5568
},
69+
{
70+
Name: "no terraform block",
71+
Content: `
72+
locals {
73+
foo = "bar"
74+
}
75+
`,
76+
Expected: helper.Issues{
77+
{
78+
Rule: NewTerraformRequiredVersionRule(),
79+
Message: "terraform \"required_version\" attribute is required",
80+
Range: hcl.Range{
81+
Filename: "module.tf",
82+
},
83+
},
84+
},
85+
},
5686
}
5787

5888
rule := NewTerraformRequiredVersionRule()
@@ -73,3 +103,29 @@ terraform {
73103
})
74104
}
75105
}
106+
107+
func Test_TerraformRequiredVersionRuleMultipleFiles(t *testing.T) {
108+
rule := NewTerraformRequiredVersionRule()
109+
110+
t.Run("multiple files no terraform blocks", func(t *testing.T) {
111+
files := map[string]string{
112+
filepath.FromSlash("modules/foo/outputs.tf"): "",
113+
filepath.FromSlash("modules/foo/main.tf"): "",
114+
filepath.FromSlash("modules/foo/variables.tf"): "",
115+
}
116+
runner := helper.TestRunner(t, files)
117+
if err := rule.Check(runner); err != nil {
118+
t.Fatal(err)
119+
}
120+
121+
helper.AssertIssues(t, helper.Issues{
122+
{
123+
Rule: NewTerraformRequiredVersionRule(),
124+
Message: "terraform \"required_version\" attribute is required",
125+
Range: hcl.Range{
126+
Filename: filepath.FromSlash("modules/foo/"),
127+
},
128+
},
129+
}, runner.Issues)
130+
})
131+
}

0 commit comments

Comments
 (0)