guard-terraform 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/guard/terraform.rb +104 -0
- data/lib/guard/terraform/templates/Guardfile +10 -0
- data/lib/guard/terraform/version.rb +8 -0
- data/lib/terraform.rb +39 -0
- data/lib/terraform/version_requirement.rb +20 -0
- metadata +68 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ca3ea8a74f9eff42a135900b1365b7ef91ad4d8ab8a8860bb67478e7518be6e2
|
4
|
+
data.tar.gz: a31ec380ad1a26eae1e58a068aa9b9ca36bf65c6f14ab34808cab3bc1ccd9317
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: fc02153c09113c7b6c7d6b45c8ad94b3cb2bba8e551ec7178bbcd6f62125ea667e950949735b505c0b9a83d8120ee03a7f56c485490b4d2a91de982fc0b598bb
|
7
|
+
data.tar.gz: 39c791ea2b260282696c1c6495f00df39cf322a8ccf57c89702096e44c53290e755c7e06de003f7bd1148c95a5c2b4a597c6022d903d9608004c1ccf28b1e13f
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'guard/plugin'
|
4
|
+
|
5
|
+
require 'guard/terraform/version'
|
6
|
+
require 'terraform'
|
7
|
+
|
8
|
+
module Guard
|
9
|
+
# Guard plugin for checking Terraform configuration style
|
10
|
+
class Terraform < Plugin
|
11
|
+
# Include the `VERSION` constant
|
12
|
+
include TerraformVersion
|
13
|
+
|
14
|
+
DEFAULT_OPTIONS = {
|
15
|
+
all_on_start: true, # check all files on start?
|
16
|
+
|
17
|
+
diff: true, # show diffs of the changes?
|
18
|
+
write: false, # fix the formatting instead of just verifying?
|
19
|
+
}.freeze
|
20
|
+
|
21
|
+
attr_reader :options, :terraform, :tf_flags
|
22
|
+
|
23
|
+
def initialize(**options)
|
24
|
+
super
|
25
|
+
|
26
|
+
options = DEFAULT_OPTIONS.merge(options)
|
27
|
+
|
28
|
+
@options = {
|
29
|
+
all_on_start: options[:all_on_start],
|
30
|
+
}
|
31
|
+
|
32
|
+
# Enforce boolean values as they get passed to CLI
|
33
|
+
@tf_flags = {
|
34
|
+
diff: !!options[:diff], # rubocop:disable Style/DoubleNegation
|
35
|
+
write: !!options[:write], # rubocop:disable Style/DoubleNegation
|
36
|
+
check: !options[:write],
|
37
|
+
}
|
38
|
+
|
39
|
+
@terraform = ::Terraform.new
|
40
|
+
end
|
41
|
+
|
42
|
+
def start
|
43
|
+
UI.info "#{self.class} started"
|
44
|
+
UI.info "Terraform version: #{terraform.version}"
|
45
|
+
|
46
|
+
raise(StandardError, 'Terraform not found') if !terraform.version
|
47
|
+
|
48
|
+
run_all if options[:all_on_start]
|
49
|
+
end
|
50
|
+
|
51
|
+
def run_all
|
52
|
+
if terraform.pre_0_12?
|
53
|
+
# Terraform v<0.12 does not check *.tfvars by default,
|
54
|
+
# so collect them to the list, too
|
55
|
+
run(all_tf_files)
|
56
|
+
else
|
57
|
+
run('.', recursive: true)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def run_on_modifications(paths)
|
62
|
+
run(mungle_paths(paths))
|
63
|
+
end
|
64
|
+
|
65
|
+
alias run_on_additions run_on_modifications
|
66
|
+
|
67
|
+
def run(paths, **extra_flags)
|
68
|
+
flags = tf_flags.merge(extra_flags)
|
69
|
+
|
70
|
+
result = terraform.fmt(paths, flags) do |path, cmd|
|
71
|
+
UI.info("#{flags[:write] ? 'Enforcing' : 'Inspecting'} Terraform formatting: #{path}")
|
72
|
+
UI.debug(Shellwords.join(cmd))
|
73
|
+
end
|
74
|
+
|
75
|
+
return if result
|
76
|
+
|
77
|
+
notify_failure
|
78
|
+
throw(:task_has_failed)
|
79
|
+
end
|
80
|
+
|
81
|
+
def notify_failure
|
82
|
+
Notifier.notify(
|
83
|
+
'Terraform format check failed',
|
84
|
+
title: self.class.to_s,
|
85
|
+
image: :failed
|
86
|
+
)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Returns list of all Terraform files
|
90
|
+
def all_tf_files
|
91
|
+
Dir['**/*.{tf,tfvars}']
|
92
|
+
end
|
93
|
+
|
94
|
+
# Terraform 0.12+ only supports checking directories,
|
95
|
+
# older versions accept also files
|
96
|
+
def mungle_paths(paths)
|
97
|
+
return paths if terraform.pre_0_12?
|
98
|
+
|
99
|
+
paths.map do |path|
|
100
|
+
File.directory?(path) ? path : File.dirname(path)
|
101
|
+
end.uniq
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
# Options and default values
|
2
|
+
#
|
3
|
+
# all_on_start: true - check all files on start?
|
4
|
+
# diff: true - show diffs of the changes?
|
5
|
+
# write: false - fix the formatting instead of just verifying?
|
6
|
+
#
|
7
|
+
guard :terraform, write: false do
|
8
|
+
watch(/\.tf$/)
|
9
|
+
watch(/\.tfvars$/)
|
10
|
+
end
|
data/lib/terraform.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'terraform/version_requirement'
|
4
|
+
|
5
|
+
# Wrapper for Terraform commands
|
6
|
+
class Terraform
|
7
|
+
def fmt(paths, **flags)
|
8
|
+
base_cmd = %w[terraform fmt] + cli_flags(flags)
|
9
|
+
|
10
|
+
Array(paths).inject(true) do |result, path|
|
11
|
+
cmd = base_cmd + [path]
|
12
|
+
|
13
|
+
yield(path, cmd) if block_given?
|
14
|
+
|
15
|
+
system(*cmd) && result # carry on failure
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Find out current Terraform version
|
20
|
+
def version
|
21
|
+
@version ||= begin
|
22
|
+
m = /^Terraform v(?<version>[^\s]+)/.match(`terraform version`)
|
23
|
+
m && m[:version]
|
24
|
+
end
|
25
|
+
rescue Errno::ENOENT
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
|
29
|
+
# Checks if the version is older than 0.12
|
30
|
+
def pre_0_12?
|
31
|
+
VersionRequirement.new('< 0.12.0-alpha').satisfied_by?(version)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns `Array` of CLI flags for Terraform
|
35
|
+
# E.g. `{ foo: true, bar: 'baz' }` -> `[ '-foo=true', '-bar=baz' ]`
|
36
|
+
def cli_flags(**flags)
|
37
|
+
flags.map { |k, v| "-#{k}=#{v}" }
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Terraform
|
4
|
+
# Helper class for checking if versions match requirements
|
5
|
+
class VersionRequirement
|
6
|
+
attr_reader :requirement
|
7
|
+
|
8
|
+
def initialize(requirement)
|
9
|
+
@requirement = requirement && Gem::Requirement.new(*requirement)
|
10
|
+
end
|
11
|
+
|
12
|
+
def satisfied_by?(version)
|
13
|
+
!requirement || requirement.satisfied_by?(Gem::Version.new(version))
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
requirement.to_s
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: guard-terraform
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Teemu Matilainen
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-01-17 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: guard
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
27
|
+
description: Guard plugin for checking and optionally fixing Terraform configuration
|
28
|
+
formatting and style.
|
29
|
+
email:
|
30
|
+
- teemu.matilainen@iki.fi
|
31
|
+
executables: []
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- lib/guard/terraform.rb
|
36
|
+
- lib/guard/terraform/templates/Guardfile
|
37
|
+
- lib/guard/terraform/version.rb
|
38
|
+
- lib/terraform.rb
|
39
|
+
- lib/terraform/version_requirement.rb
|
40
|
+
homepage: https://github.com/tmatilai/guard-terraform
|
41
|
+
licenses:
|
42
|
+
- MIT
|
43
|
+
metadata:
|
44
|
+
homepage_uri: https://github.com/tmatilai/guard-terraform
|
45
|
+
source_code_uri: https://github.com/tmatilai/guard-terraform
|
46
|
+
documentation_uri: https://github.com/tmatilai/guard-terraform#readme
|
47
|
+
changelog_uri: https://github.com/tmatilai/guard-terraform/blob/master/CHANGELOG.md
|
48
|
+
bug_tracker_uri: https://github.com/tmatilai/guard-terraform/issues
|
49
|
+
post_install_message:
|
50
|
+
rdoc_options: []
|
51
|
+
require_paths:
|
52
|
+
- lib
|
53
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
requirements: []
|
64
|
+
rubygems_version: 3.0.1
|
65
|
+
signing_key:
|
66
|
+
specification_version: 4
|
67
|
+
summary: Guard plugin for Terraform configuration format
|
68
|
+
test_files: []
|