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

Sign up to get free protection for your applications and to get access to all the features.
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