From d4eb95038e41d7dba8f3e7826595275d0aa72916 Mon Sep 17 00:00:00 2001 From: Alex Rudd Date: Thu, 24 May 2018 14:46:12 +0100 Subject: [PATCH 1/4] Detect variables with dashes and numbers in them --- configuration.mock | 11 ++++++++++- generator_test.go | 5 +++-- terraform.go | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/configuration.mock b/configuration.mock index b21df5b..835d2fd 100644 --- a/configuration.mock +++ b/configuration.mock @@ -8,4 +8,13 @@ resource "aws_nat_gateway" "nat" { allocation_id = "${element(aws_eip.nat.*.id, count.index)}" subnet_id = "${element(aws_subnet.public.*.id, count.index)}" count = "${length(var.public_subnets)}" -} \ No newline at end of file +} + +data "template_file" "template1" { + template = "${file("${path.module}/template1.tpl")}" + vars { + t1_var1 = "${var.t1_var1}" + t1-var2 = "${var.t1-var2}" + t1-var3 = "${var.t1-Var3}" + } +} diff --git a/generator_test.go b/generator_test.go index aa6c669..d5f8e53 100644 --- a/generator_test.go +++ b/generator_test.go @@ -41,8 +41,9 @@ func TestMatchVariable(t *testing.T) { for _, text := range messages { ter.matchVarPref(text, varPrefix) } - if len(ter.Variables) != 1 { - t.Errorf("Should return one variable. but returned %d", len(ter.Variables)) + if len(ter.Variables) != 4 { + t.Errorf("Should return four variable. but returned %d", len(ter.Variables)) + t.Errorf("Variables found: %s", ter.Variables) } } diff --git a/terraform.go b/terraform.go index b653763..41d110d 100644 --- a/terraform.go +++ b/terraform.go @@ -11,7 +11,7 @@ type terraformVars struct { func (t *terraformVars) matchVarPref(row, varPrefix string) { if strings.Contains(row, varPrefix) { - pattern := regexp.MustCompile(`var.([a-z?_]+)`) + pattern := regexp.MustCompile(`var.([a-z?0-9?_][a-z?0-9?_?-]*)`) match := pattern.FindAllStringSubmatch(row, 1) if len(match) != 0 { res := replacer.Replace(match[0][0]) From 427d9ad8e1d547bf7364db9d1550e07504435c32 Mon Sep 17 00:00:00 2001 From: Alex Rudd Date: Thu, 24 May 2018 16:00:33 +0100 Subject: [PATCH 2/4] Sort variables before writing them to file --- generator.go | 1 + terraform.go | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/generator.go b/generator.go index 2b974ae..da543e0 100644 --- a/generator.go +++ b/generator.go @@ -72,6 +72,7 @@ func main() { f, err := os.Create(dstFile) checkError(err) + t.sortVars() err = varTemplate.Execute(f, t.Variables) checkError(err) log.Infof("Variables are generated to %q file", dstFile) diff --git a/terraform.go b/terraform.go index 41d110d..835612f 100644 --- a/terraform.go +++ b/terraform.go @@ -2,6 +2,7 @@ package main import ( "regexp" + "sort" "strings" ) @@ -21,3 +22,7 @@ func (t *terraformVars) matchVarPref(row, varPrefix string) { } } } + +func (t *terraformVars) sortVars() { + sort.Sort(sort.StringSlice(t.Variables)) +} From 876a465b47cf203e1a1ccaca7889aaccc73170d3 Mon Sep 17 00:00:00 2001 From: Alex Rudd Date: Thu, 24 May 2018 16:13:26 +0100 Subject: [PATCH 3/4] Use tab for variable block indentation --- generator.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/generator.go b/generator.go index da543e0..c9e9f2d 100644 --- a/generator.go +++ b/generator.go @@ -17,10 +17,9 @@ var tfFileExt = "*.tf" var dstFile = "./variables.tf" var varTemplate = template.Must(template.New("var_file").Parse(`{{range .}} variable "{{ . }}" { - description = "" + description = "" } - {{end}} -`)) +{{end}}`)) func init() { replacer = strings.NewReplacer(":", ".", From ee166746307ad13c4ae33d0496886f079baf8149 Mon Sep 17 00:00:00 2001 From: Alex Rudd Date: Thu, 24 May 2018 17:02:58 +0100 Subject: [PATCH 4/4] Handle multiple variables per line and match capitals --- configuration.mock | 2 +- generator_test.go | 4 ++-- terraform.go | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/configuration.mock b/configuration.mock index 835d2fd..910ac97 100644 --- a/configuration.mock +++ b/configuration.mock @@ -15,6 +15,6 @@ data "template_file" "template1" { vars { t1_var1 = "${var.t1_var1}" t1-var2 = "${var.t1-var2}" - t1-var3 = "${var.t1-Var3}" + t1-var3 = "${var.t1-Var3}-${var.t1-inline}" } } diff --git a/generator_test.go b/generator_test.go index d5f8e53..7094413 100644 --- a/generator_test.go +++ b/generator_test.go @@ -41,8 +41,8 @@ func TestMatchVariable(t *testing.T) { for _, text := range messages { ter.matchVarPref(text, varPrefix) } - if len(ter.Variables) != 4 { - t.Errorf("Should return four variable. but returned %d", len(ter.Variables)) + if len(ter.Variables) != 5 { + t.Errorf("Should return five variable. but returned %d", len(ter.Variables)) t.Errorf("Variables found: %s", ter.Variables) } diff --git a/terraform.go b/terraform.go index 835612f..75ac454 100644 --- a/terraform.go +++ b/terraform.go @@ -12,10 +12,10 @@ type terraformVars struct { func (t *terraformVars) matchVarPref(row, varPrefix string) { if strings.Contains(row, varPrefix) { - pattern := regexp.MustCompile(`var.([a-z?0-9?_][a-z?0-9?_?-]*)`) - match := pattern.FindAllStringSubmatch(row, 1) - if len(match) != 0 { - res := replacer.Replace(match[0][0]) + pattern := regexp.MustCompile(`var.([a-z?A-Z?0-9?_][a-z?A-Z?0-9?_?-]*)`) + match := pattern.FindAllStringSubmatch(row, -1) + for _, m := range match { + res := replacer.Replace(m[0]) if !containsElement(t.Variables, res) { t.Variables = append(t.Variables, res) }