ruby-terraform 0.65.0.pre.4 → 0.65.0.pre.9

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +8 -5
  4. data/Rakefile +7 -3
  5. data/bin/console +1 -0
  6. data/lib/ruby-terraform.rb +2 -0
  7. data/lib/ruby_terraform.rb +5 -2
  8. data/lib/ruby_terraform/commands.rb +2 -0
  9. data/lib/ruby_terraform/commands/apply.rb +32 -40
  10. data/lib/ruby_terraform/commands/base.rb +59 -18
  11. data/lib/ruby_terraform/commands/clean.rb +2 -0
  12. data/lib/ruby_terraform/commands/destroy.rb +28 -38
  13. data/lib/ruby_terraform/commands/format.rb +15 -17
  14. data/lib/ruby_terraform/commands/get.rb +15 -8
  15. data/lib/ruby_terraform/commands/import.rb +25 -34
  16. data/lib/ruby_terraform/commands/init.rb +21 -34
  17. data/lib/ruby_terraform/commands/output.rb +23 -22
  18. data/lib/ruby_terraform/commands/plan.rb +24 -37
  19. data/lib/ruby_terraform/commands/refresh.rb +22 -33
  20. data/lib/ruby_terraform/commands/remote_config.rb +14 -16
  21. data/lib/ruby_terraform/commands/show.rb +13 -13
  22. data/lib/ruby_terraform/commands/validate.rb +22 -30
  23. data/lib/ruby_terraform/commands/workspace.rb +15 -10
  24. data/lib/ruby_terraform/errors.rb +2 -0
  25. data/lib/ruby_terraform/errors/execution_error.rb +2 -0
  26. data/lib/ruby_terraform/options.rb +7 -0
  27. data/lib/ruby_terraform/options/factory.rb +118 -0
  28. data/lib/ruby_terraform/options/name.rb +45 -0
  29. data/lib/ruby_terraform/options/types/base.rb +26 -0
  30. data/lib/ruby_terraform/options/types/boolean.rb +18 -0
  31. data/lib/ruby_terraform/options/types/flag.rb +18 -0
  32. data/lib/ruby_terraform/options/types/standard.rb +43 -0
  33. data/lib/ruby_terraform/options/values/boolean.rb +31 -0
  34. data/lib/ruby_terraform/output.rb +17 -11
  35. data/lib/ruby_terraform/version.rb +3 -1
  36. data/ruby_terraform.gemspec +58 -0
  37. metadata +27 -4
@@ -1,20 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'base'
2
4
 
3
5
  module RubyTerraform
4
6
  module Commands
5
7
  class Workspace < Base
6
- def configure_command(builder, opts)
7
- directory = opts[:directory] || nil
8
- operation = opts[:operation] || 'list'
9
- workspace = opts[:workspace] || nil
8
+ def subcommands(parameters)
9
+ commands = ['workspace', parameters[:operation]]
10
+ if parameters[:workspace] && parameters[:operation] != 'list'
11
+ commands << parameters[:workspace]
12
+ else
13
+ commands
14
+ end
15
+ end
10
16
 
11
- builder = builder
12
- .with_subcommand('workspace')
13
- .with_subcommand(operation)
17
+ def arguments(parameters)
18
+ [parameters[:directory]]
19
+ end
14
20
 
15
- builder = builder.with_subcommand(workspace) if
16
- workspace && operation != 'list'
17
- builder.with_argument(directory)
21
+ def parameter_defaults(_parameters)
22
+ { directory: nil, operation: 'list', workspace: nil }
18
23
  end
19
24
  end
20
25
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'errors/execution_error'
2
4
 
3
5
  module RubyTerraform
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyTerraform
2
4
  module Errors
3
5
  class ExecutionError < StandardError
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'options/name'
4
+ require_relative 'options/types/flag'
5
+ require_relative 'options/types/boolean'
6
+ require_relative 'options/types/standard'
7
+ require_relative 'options/factory'
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'name'
4
+ require_relative 'types/boolean'
5
+ require_relative 'types/flag'
6
+ require_relative 'types/standard'
7
+
8
+ module RubyTerraform
9
+ module Options
10
+ class Factory
11
+ PLURAL_OPTIONS =
12
+ Set.new(
13
+ %w[
14
+ -var
15
+ -target
16
+ -var-file
17
+ ]
18
+ ).freeze
19
+
20
+ BOOLEAN_OPTIONS =
21
+ Set.new(
22
+ %w[
23
+ -auto-approve
24
+ -backend
25
+ -get
26
+ -get-plugins
27
+ -input
28
+ -list
29
+ -lock
30
+ -refresh
31
+ -upgrade
32
+ -verify-plugins
33
+ -write
34
+ ]
35
+ ).freeze
36
+
37
+ FLAG_OPTIONS =
38
+ Set.new(
39
+ %w[
40
+ -allow-missing
41
+ -allow-missing-config
42
+ -check
43
+ -compact-warnings
44
+ -destroy
45
+ -detailed-exitcode
46
+ -diff
47
+ -draw-cycles
48
+ -force
49
+ -force-copy
50
+ -ignore-remote-version
51
+ -json
52
+ -no-color
53
+ -raw
54
+ -reconfigure
55
+ -recursive
56
+ -update
57
+ ]
58
+ ).freeze
59
+
60
+ OVERRIDE_OPTIONS =
61
+ {
62
+ config: :directory,
63
+ out: :plan
64
+ }.freeze
65
+
66
+ def self.from(names, parameters)
67
+ new(names, parameters).from
68
+ end
69
+
70
+ private_class_method :new
71
+
72
+ def initialize(names, parameters)
73
+ @names = names.map { |name| Name.new(name) }
74
+ @parameters = parameters
75
+ end
76
+
77
+ def from
78
+ names.each_with_object([]) do |name, options|
79
+ options.append(*options_from_name(name))
80
+ end
81
+ end
82
+
83
+ private
84
+
85
+ attr_reader :names, :parameters
86
+
87
+ def options_from_name(name)
88
+ return plural_options(name) if PLURAL_OPTIONS.include?(name)
89
+ return boolean_option(name) if BOOLEAN_OPTIONS.include?(name)
90
+ return flag_option(name) if FLAG_OPTIONS.include?(name)
91
+ return override_option(name) if OVERRIDE_OPTIONS.key?(name.as_key)
92
+
93
+ standard_option(name, name.as_key)
94
+ end
95
+
96
+ def boolean_option(name)
97
+ [Types::Boolean.new(name.to_s, parameters[name.as_key])]
98
+ end
99
+
100
+ def flag_option(name)
101
+ [Types::Flag.new(name.to_s, parameters[name.as_key])]
102
+ end
103
+
104
+ def standard_option(name, hash_key)
105
+ [Types::Standard.new(name.to_s, parameters[hash_key])]
106
+ end
107
+
108
+ def override_option(name)
109
+ standard_option(name, OVERRIDE_OPTIONS[name.as_key])
110
+ end
111
+
112
+ def plural_options(name)
113
+ standard_option(name.to_s, name.as_key) +
114
+ standard_option(name.to_s, name.as_plural_key)
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyTerraform
4
+ module Options
5
+ class Name
6
+ def initialize(name)
7
+ @name = name
8
+ end
9
+
10
+ def without_prefix
11
+ @name[0] == '-' ? @name[1..] : @name
12
+ end
13
+
14
+ def to_s
15
+ "-#{without_prefix}"
16
+ end
17
+
18
+ def as_key
19
+ snake_case.to_sym
20
+ end
21
+
22
+ def as_plural_key
23
+ "#{snake_case}s".to_sym
24
+ end
25
+
26
+ def ==(other)
27
+ to_s == other
28
+ end
29
+
30
+ def eql?(other)
31
+ to_s == other
32
+ end
33
+
34
+ def hash
35
+ to_s.hash
36
+ end
37
+
38
+ private
39
+
40
+ def snake_case
41
+ without_prefix.gsub('-', '_')
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyTerraform
4
+ module Options
5
+ module Types
6
+ class Base
7
+ def initialize(name, value)
8
+ @name = name
9
+ coerce_value(value)
10
+ end
11
+
12
+ def apply(_builder)
13
+ raise 'not implemented'
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :name, :value
19
+
20
+ def coerce_value(value)
21
+ @value = value
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+ require_relative '../values/boolean'
5
+
6
+ module RubyTerraform
7
+ module Options
8
+ module Types
9
+ class Boolean < Base
10
+ include Values::Boolean
11
+
12
+ def apply(builder)
13
+ builder.with_option(name, value)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+ require_relative '../values/boolean'
5
+
6
+ module RubyTerraform
7
+ module Options
8
+ module Types
9
+ class Flag < Base
10
+ include Values::Boolean
11
+
12
+ def apply(builder)
13
+ value ? builder.with_flag(name) : builder
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ require_relative 'base'
6
+
7
+ module RubyTerraform
8
+ module Options
9
+ module Types
10
+ class Standard < Base
11
+ def apply(builder)
12
+ if value.respond_to?(:keys)
13
+ apply_hash(builder)
14
+ elsif value.respond_to?(:each)
15
+ apply_array(builder)
16
+ else
17
+ builder.with_option(name, value)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def apply_hash(builder)
24
+ builder.with_repeated_option(
25
+ name,
26
+ value.map do |hash_key, hash_value|
27
+ "'#{hash_key}=#{as_string(hash_value)}'"
28
+ end,
29
+ separator: ' '
30
+ )
31
+ end
32
+
33
+ def apply_array(builder)
34
+ builder.with_repeated_option(name, value)
35
+ end
36
+
37
+ def as_string(value)
38
+ value.is_a?(String) ? value : JSON.generate(value)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyTerraform
4
+ module Options
5
+ module Values
6
+ module Boolean
7
+ def coerce_value(value)
8
+ @value = to_boolean(value)
9
+ end
10
+
11
+ private
12
+
13
+ def to_boolean(value)
14
+ return nil if value.nil?
15
+ return value if a_boolean?(value)
16
+ return true if true_as_string?(value)
17
+
18
+ false
19
+ end
20
+
21
+ def a_boolean?(value)
22
+ value.is_a?(TrueClass) || value.is_a?(FalseClass)
23
+ end
24
+
25
+ def true_as_string?(value)
26
+ value.respond_to?(:downcase) && value.downcase == 'true'
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,20 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyTerraform
2
4
  class Output
3
- def self.for(opts)
4
- name = opts[:name]
5
- backend_config = opts[:backend_config]
5
+ class << self
6
+ def for(opts)
7
+ Dir.chdir(create_config_directory(opts)) do
8
+ RubyTerraform.init(backend_config: opts[:backend_config])
9
+ RubyTerraform.output(name: opts[:name])
10
+ end
11
+ end
6
12
 
7
- source_directory = opts[:source_directory]
8
- work_directory = opts[:work_directory]
13
+ private
9
14
 
10
- configuration_directory = File.join(work_directory, source_directory)
15
+ def create_config_directory(opts)
16
+ source_directory = opts[:source_directory]
17
+ work_directory = opts[:work_directory]
11
18
 
12
- FileUtils.mkdir_p File.dirname(configuration_directory)
13
- FileUtils.cp_r source_directory, configuration_directory
19
+ configuration_directory = File.join(work_directory, source_directory)
20
+ FileUtils.mkdir_p File.dirname(configuration_directory)
21
+ FileUtils.cp_r source_directory, configuration_directory
14
22
 
15
- Dir.chdir(configuration_directory) do
16
- RubyTerraform.init(backend_config: backend_config)
17
- RubyTerraform.output(name: name)
23
+ configuration_directory
18
24
  end
19
25
  end
20
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RubyTerraform
2
- VERSION = '0.65.0.pre.4'.freeze
4
+ VERSION = '0.65.0.pre.9'
3
5
  end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'ruby_terraform/version'
6
+ require 'date'
7
+
8
+ files = %w[
9
+ bin
10
+ lib
11
+ CODE_OF_CONDUCT.md
12
+ ruby_terraform.gemspec
13
+ Gemfile
14
+ LICENSE.txt
15
+ Rakefile
16
+ README.md
17
+ ]
18
+
19
+ Gem::Specification.new do |spec|
20
+ spec.name = 'ruby-terraform'
21
+ spec.version = RubyTerraform::VERSION
22
+ spec.authors = ['Toby Clemson']
23
+ spec.email = ['tobyclemson@gmail.com']
24
+
25
+ spec.summary = 'A simple Ruby wrapper for invoking Terraform commands.'
26
+ spec.description =
27
+ 'Wraps the Terraform CLI so that Terraform can be invoked from a Ruby ' \
28
+ 'script or Rakefile.'
29
+ spec.homepage = 'https://github.com/infrablocks/ruby_terraform'
30
+ spec.license = 'MIT'
31
+
32
+ spec.files = `git ls-files -z`.split("\x0").select do |f|
33
+ f.match(/^(#{files.map { |g| Regexp.escape(g) }.join('|')})/)
34
+ end
35
+ spec.bindir = 'exe'
36
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
37
+ spec.require_paths = ['lib']
38
+
39
+ spec.required_ruby_version = '>= 2.6'
40
+
41
+ spec.add_dependency 'lino', '>= 2.3'
42
+
43
+ spec.add_development_dependency 'bundler', '~> 2.0'
44
+ spec.add_development_dependency 'faker', '~> 2.17'
45
+ spec.add_development_dependency 'gem-release', '~> 2.1'
46
+ spec.add_development_dependency 'guard', '~> 2.16'
47
+ spec.add_development_dependency 'guard-rspec', '~> 4.7'
48
+ spec.add_development_dependency 'rake', '~> 13.0'
49
+ spec.add_development_dependency 'rake_circle_ci', '~> 0.9'
50
+ spec.add_development_dependency 'rake_github', '~> 0.5'
51
+ spec.add_development_dependency 'rake_gpg', '~> 0.12'
52
+ spec.add_development_dependency 'rake_ssh', '~> 0.4'
53
+ spec.add_development_dependency 'rspec', '~> 3.9'
54
+ spec.add_development_dependency 'rubocop', '~> 1.12'
55
+ spec.add_development_dependency 'rubocop-rake', '~> 0.5'
56
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.2'
57
+ spec.add_development_dependency 'simplecov', '~> 0.21'
58
+ end