guard-terraform 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: []
|