ruby-terraform 0.65.0.pre.8 → 0.65.0.pre.13

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/Gemfile.lock +11 -6
  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 +61 -4
  8. data/lib/ruby_terraform/commands.rb +31 -8
  9. data/lib/ruby_terraform/commands/apply.rb +19 -12
  10. data/lib/ruby_terraform/commands/base.rb +32 -39
  11. data/lib/ruby_terraform/commands/clean.rb +4 -2
  12. data/lib/ruby_terraform/commands/destroy.rb +24 -13
  13. data/lib/ruby_terraform/commands/force_unlock.rb +24 -0
  14. data/lib/ruby_terraform/commands/format.rb +16 -12
  15. data/lib/ruby_terraform/commands/get.rb +13 -8
  16. data/lib/ruby_terraform/commands/graph.rb +24 -0
  17. data/lib/ruby_terraform/commands/import.rb +22 -11
  18. data/lib/ruby_terraform/commands/init.rb +21 -9
  19. data/lib/ruby_terraform/commands/login.rb +20 -0
  20. data/lib/ruby_terraform/commands/logout.rb +20 -0
  21. data/lib/ruby_terraform/commands/output.rb +17 -15
  22. data/lib/ruby_terraform/commands/plan.rb +20 -9
  23. data/lib/ruby_terraform/commands/providers.rb +16 -0
  24. data/lib/ruby_terraform/commands/providers_lock.rb +28 -0
  25. data/lib/ruby_terraform/commands/providers_mirror.rb +24 -0
  26. data/lib/ruby_terraform/commands/providers_schema.rb +25 -0
  27. data/lib/ruby_terraform/commands/refresh.rb +23 -8
  28. data/lib/ruby_terraform/commands/remote_config.rb +8 -6
  29. data/lib/ruby_terraform/commands/show.rb +13 -9
  30. data/lib/ruby_terraform/commands/state_list.rb +20 -0
  31. data/lib/ruby_terraform/commands/state_move.rb +34 -0
  32. data/lib/ruby_terraform/commands/state_pull.rb +16 -0
  33. data/lib/ruby_terraform/commands/state_push.rb +24 -0
  34. data/lib/ruby_terraform/commands/state_remove.rb +32 -0
  35. data/lib/ruby_terraform/commands/state_replace_provider.rb +35 -0
  36. data/lib/ruby_terraform/commands/state_show.rb +24 -0
  37. data/lib/ruby_terraform/commands/taint.rb +36 -0
  38. data/lib/ruby_terraform/commands/untaint.rb +37 -0
  39. data/lib/ruby_terraform/commands/validate.rb +14 -13
  40. data/lib/ruby_terraform/commands/workspace_delete.rb +32 -0
  41. data/lib/ruby_terraform/commands/workspace_list.rb +24 -0
  42. data/lib/ruby_terraform/commands/workspace_new.rb +32 -0
  43. data/lib/ruby_terraform/commands/workspace_select.rb +24 -0
  44. data/lib/ruby_terraform/commands/workspace_show.rb +16 -0
  45. data/lib/ruby_terraform/errors.rb +2 -0
  46. data/lib/ruby_terraform/errors/execution_error.rb +2 -0
  47. data/lib/ruby_terraform/options.rb +28 -3
  48. data/lib/ruby_terraform/options/common.rb +11 -0
  49. data/lib/ruby_terraform/options/definition.rb +170 -0
  50. data/lib/ruby_terraform/options/definitions.rb +103 -0
  51. data/lib/ruby_terraform/options/factory.rb +12 -101
  52. data/lib/ruby_terraform/options/name.rb +13 -19
  53. data/lib/ruby_terraform/options/types.rb +27 -0
  54. data/lib/ruby_terraform/options/types/base.rb +8 -13
  55. data/lib/ruby_terraform/options/types/flag.rb +3 -3
  56. data/lib/ruby_terraform/options/types/standard.rb +3 -27
  57. data/lib/ruby_terraform/options/values.rb +38 -0
  58. data/lib/ruby_terraform/options/values/base.rb +15 -0
  59. data/lib/ruby_terraform/options/values/boolean.rb +15 -11
  60. data/lib/ruby_terraform/options/values/complex.rb +19 -0
  61. data/lib/ruby_terraform/options/values/key_value.rb +21 -0
  62. data/lib/ruby_terraform/options/values/string.rb +17 -0
  63. data/lib/ruby_terraform/output.rb +9 -7
  64. data/lib/ruby_terraform/version.rb +3 -1
  65. data/ruby_terraform.gemspec +59 -0
  66. metadata +64 -6
  67. data/lib/ruby_terraform/commands/workspace.rb +0 -24
  68. data/lib/ruby_terraform/options/types/boolean.rb +0 -16
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyTerraform
4
+ module Options
5
+ DEFINITIONS =
6
+ [
7
+ # complex repeatable options with space separator
8
+ %w[-var].map do |o|
9
+ definition(
10
+ name: o, option_type: :standard, value_type: :complex,
11
+ repeatable: true, separator: ' '
12
+ )
13
+ end,
14
+
15
+ # complex repeatable options with default separator
16
+ %w[-backend-config].map do |o|
17
+ definition(
18
+ name: o, option_type: :standard, value_type: :complex,
19
+ repeatable: true,
20
+ override_keys: { singular: false, plural: :backend_config }
21
+ )
22
+ end,
23
+
24
+ # string repeatable options
25
+ %w[-var-file -target -platform].map do |o|
26
+ definition(
27
+ name: o, option_type: :standard, value_type: :string,
28
+ repeatable: true
29
+ )
30
+ end,
31
+
32
+ # boolean options
33
+ %w[
34
+ -auto-approve
35
+ -backend
36
+ -get
37
+ -get-plugins
38
+ -input
39
+ -list
40
+ -lock
41
+ -refresh
42
+ -upgrade
43
+ -verify-plugins
44
+ -write
45
+ ].map do |o|
46
+ definition(name: o, option_type: :standard, value_type: :boolean)
47
+ end,
48
+
49
+ # flag options
50
+ %w[
51
+ -allow-missing
52
+ -allow-missing-config
53
+ -check
54
+ -compact-warnings
55
+ -destroy
56
+ -detailed-exitcode
57
+ -diff
58
+ -draw-cycles
59
+ -force
60
+ -force-copy
61
+ -ignore-remote-version
62
+ -json
63
+ -no-color
64
+ -raw
65
+ -reconfigure
66
+ -recursive
67
+ -update
68
+ ].map do |o|
69
+ definition(name: o, option_type: :flag, value_type: :boolean)
70
+ end,
71
+
72
+ # string options
73
+ %w[
74
+ -backup
75
+ -backup-out
76
+ -chdir
77
+ -from-module
78
+ -fs-mirror
79
+ -lock-timeout
80
+ -module-depth
81
+ -net-mirror
82
+ -parallelism
83
+ -plugin-dir
84
+ -provider
85
+ -state
86
+ -state-out
87
+ -type
88
+ ].map do |o|
89
+ definition(name: o, option_type: :standard, value_type: :string)
90
+ end,
91
+
92
+ # string options with extra keys
93
+ definition(
94
+ name: '-config', option_type: :standard, value_type: :string,
95
+ extra_keys: { singular: %i[directory] }
96
+ ),
97
+ definition(
98
+ name: '-out', option_type: :standard, value_type: :string,
99
+ extra_keys: { singular: %i[plan] }
100
+ )
101
+ ].flatten.freeze
102
+ end
103
+ end
@@ -1,115 +1,26 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'name'
2
- require_relative 'types/boolean'
3
- require_relative 'types/flag'
4
- require_relative 'types/standard'
5
4
 
6
5
  module RubyTerraform
7
6
  module Options
8
7
  class Factory
9
- PLURAL_OPTIONS =
10
- Set.new(
11
- %w[
12
- -var
13
- -target
14
- -var-file
15
- ]
16
- ).freeze
17
-
18
- BOOLEAN_OPTIONS =
19
- Set.new(
20
- %w[
21
- -auto-approve
22
- -backend
23
- -get
24
- -get-plugins
25
- -input
26
- -list
27
- -lock
28
- -refresh
29
- -upgrade
30
- -verify-plugins
31
- -write
32
- ]
33
- ).freeze
34
-
35
- FLAG_OPTIONS =
36
- Set.new(
37
- %w[
38
- -allow-missing
39
- -allow-missing-config
40
- -check
41
- -compact-warnings
42
- -destroy
43
- -detailed-exitcode
44
- -diff
45
- -draw-cycles
46
- -force
47
- -force-copy
48
- -ignore-remote-version
49
- -json
50
- -no-color
51
- -raw
52
- -reconfigure
53
- -recursive
54
- -update
55
- ]
56
- ).freeze
57
-
58
- OVERRIDE_OPTIONS =
59
- {
60
- config: :directory,
61
- out: :plan
62
- }.freeze
63
-
64
- def self.from(values, switches)
65
- new(values, switches).from
8
+ def initialize(definitions)
9
+ @definitions = definitions
66
10
  end
67
11
 
68
- private_class_method :new
69
-
70
- def initialize(values, names)
71
- @names = names.map { |switch| Name.new(switch) }
72
- @values = values
73
- end
74
-
75
- def from
76
- names.each_with_object([]) do |name, options|
77
- options.append(*options_from_name(name))
78
- end
12
+ def resolve(names, parameters)
13
+ names
14
+ .map { |name| Name.new(name) }
15
+ .inject([]) do |options, name|
16
+ options + resolve_name(name, parameters)
17
+ end
79
18
  end
80
19
 
81
20
  private
82
21
 
83
- attr_reader :names, :values
84
-
85
- def options_from_name(name)
86
- return plural_options(name) if PLURAL_OPTIONS.include?(name)
87
- return boolean_option(name) if BOOLEAN_OPTIONS.include?(name)
88
- return flag_option(name) if FLAG_OPTIONS.include?(name)
89
- return override_option(name) if OVERRIDE_OPTIONS.key?(name.as_key)
90
-
91
- standard_option(name, name.as_key)
92
- end
93
-
94
- def boolean_option(name)
95
- [Types::Boolean.new(name.to_s, values[name.as_key])]
96
- end
97
-
98
- def flag_option(name)
99
- [Types::Flag.new(name.to_s, values[name.as_key])]
100
- end
101
-
102
- def standard_option(name, hash_key)
103
- [Types::Standard.new(name.to_s, values[hash_key])]
104
- end
105
-
106
- def override_option(name)
107
- standard_option(name, OVERRIDE_OPTIONS[name.as_key])
108
- end
109
-
110
- def plural_options(name)
111
- standard_option(name.to_s, name.as_key) +
112
- standard_option(name.to_s, name.as_plural_key)
22
+ def resolve_name(name, parameters)
23
+ @definitions.find { |d| d.matches?(name) }.build(parameters)
113
24
  end
114
25
  end
115
26
  end
@@ -1,19 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'immutable-struct'
4
+
1
5
  module RubyTerraform
2
6
  module Options
3
- class Name
7
+ class Name < ImmutableStruct.new(:name)
4
8
  def initialize(name)
5
- @name = name
9
+ super(name: name.to_s)
6
10
  end
7
11
 
8
- def without_prefix
9
- @name[0] == '-' ? @name[1..] : @name
10
- end
11
-
12
- def to_s
12
+ def name
13
13
  "-#{without_prefix}"
14
14
  end
15
15
 
16
- def as_key
16
+ alias to_s name
17
+
18
+ def as_singular_key
17
19
  snake_case.to_sym
18
20
  end
19
21
 
@@ -21,20 +23,12 @@ module RubyTerraform
21
23
  "#{snake_case}s".to_sym
22
24
  end
23
25
 
24
- def ==(other)
25
- to_s == other
26
- end
27
-
28
- def eql?(other)
29
- to_s == other
30
- end
26
+ private
31
27
 
32
- def hash
33
- to_s.hash
28
+ def without_prefix
29
+ @name.sub(/^-+/, '')
34
30
  end
35
31
 
36
- private
37
-
38
32
  def snake_case
39
33
  without_prefix.gsub('-', '_')
40
34
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'types/base'
4
+ require_relative 'types/standard'
5
+ require_relative 'types/flag'
6
+
7
+ module RubyTerraform
8
+ module Options
9
+ module Types
10
+ def self.standard(name, value, **opts)
11
+ Standard.new(name, value, **opts)
12
+ end
13
+
14
+ def self.flag(name, value)
15
+ Flag.new(name, value)
16
+ end
17
+
18
+ def self.resolve(type)
19
+ case type
20
+ when :standard then Types::Standard
21
+ when :flag then Types::Flag
22
+ else type
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,22 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'immutable-struct'
4
+
1
5
  module RubyTerraform
2
6
  module Options
3
7
  module Types
4
- class Base
5
- def initialize(name, value)
6
- @name = name
7
- coerce_value(value)
8
+ class Base < ImmutableStruct.new(:name, :value, :separator)
9
+ def initialize(name, value, **opts)
10
+ super(name: name, value: value, separator: opts[:separator])
8
11
  end
9
12
 
10
13
  def apply(_builder)
11
- raise 'not implemented'
12
- end
13
-
14
- private
15
-
16
- attr_reader :name, :value
17
-
18
- def coerce_value(value)
19
- @value = value
14
+ raise 'Not implemented.'
20
15
  end
21
16
  end
22
17
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'base'
2
4
  require_relative '../values/boolean'
3
5
 
@@ -5,10 +7,8 @@ module RubyTerraform
5
7
  module Options
6
8
  module Types
7
9
  class Flag < Base
8
- include Values::Boolean
9
-
10
10
  def apply(builder)
11
- value ? builder.with_flag(name) : builder
11
+ value.resolve ? builder.with_flag(name) : builder
12
12
  end
13
13
  end
14
14
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
 
3
5
  require_relative 'base'
@@ -7,33 +9,7 @@ module RubyTerraform
7
9
  module Types
8
10
  class Standard < Base
9
11
  def apply(builder)
10
- if value.respond_to?(:keys)
11
- apply_hash(builder)
12
- elsif value.respond_to?(:each)
13
- apply_array(builder)
14
- else
15
- builder.with_option(name, value)
16
- end
17
- end
18
-
19
- private
20
-
21
- def apply_hash(builder)
22
- builder.with_repeated_option(
23
- name,
24
- value.map do |hash_key, hash_value|
25
- "'#{hash_key}=#{as_string(hash_value)}'"
26
- end,
27
- separator: ' '
28
- )
29
- end
30
-
31
- def apply_array(builder)
32
- builder.with_repeated_option(name, value)
33
- end
34
-
35
- def as_string(value)
36
- value.is_a?(String) ? value : JSON.generate(value)
12
+ builder.with_option(name, value.render, separator: separator)
37
13
  end
38
14
  end
39
15
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'values/boolean'
4
+ require_relative 'values/string'
5
+ require_relative 'values/complex'
6
+ require_relative 'values/key_value'
7
+
8
+ module RubyTerraform
9
+ module Options
10
+ module Values
11
+ def self.boolean(value)
12
+ Boolean.new(value)
13
+ end
14
+
15
+ def self.string(value)
16
+ String.new(value)
17
+ end
18
+
19
+ def self.complex(value)
20
+ Complex.new(value)
21
+ end
22
+
23
+ def self.key_value(key, value)
24
+ KeyValue.new(key, value)
25
+ end
26
+
27
+ def self.resolve(type)
28
+ case type
29
+ when :string then Values::String
30
+ when :boolean then Values::Boolean
31
+ when :complex then Values::Complex
32
+ when :key_value then Values::KeyValue
33
+ else type
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'immutable-struct'
4
+
5
+ module RubyTerraform
6
+ module Options
7
+ module Values
8
+ class Base < ImmutableStruct.new(:value)
9
+ def initialize(value)
10
+ super(value: value)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end