ruby-terraform 0.65.0.pre.7 → 0.65.0.pre.12

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