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 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
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Guard
4
+ # Use own namespace to avoid inheriting from `Guard::Plugin`
5
+ module TerraformVersion
6
+ VERSION = '1.0.0'
7
+ end
8
+ 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: []