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

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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +18 -10
  3. data/lib/ruby_terraform.rb +131 -4
  4. data/lib/ruby_terraform/commands.rb +29 -8
  5. data/lib/ruby_terraform/commands/apply.rb +85 -6
  6. data/lib/ruby_terraform/commands/base.rb +21 -18
  7. data/lib/ruby_terraform/commands/clean.rb +2 -2
  8. data/lib/ruby_terraform/commands/destroy.rb +17 -8
  9. data/lib/ruby_terraform/commands/force_unlock.rb +24 -0
  10. data/lib/ruby_terraform/commands/format.rb +11 -9
  11. data/lib/ruby_terraform/commands/get.rb +8 -5
  12. data/lib/ruby_terraform/commands/graph.rb +24 -0
  13. data/lib/ruby_terraform/commands/import.rb +15 -6
  14. data/lib/ruby_terraform/commands/init.rb +16 -6
  15. data/lib/ruby_terraform/commands/login.rb +20 -0
  16. data/lib/ruby_terraform/commands/logout.rb +20 -0
  17. data/lib/ruby_terraform/commands/output.rb +10 -10
  18. data/lib/ruby_terraform/commands/plan.rb +15 -6
  19. data/lib/ruby_terraform/commands/providers.rb +16 -0
  20. data/lib/ruby_terraform/commands/providers_lock.rb +28 -0
  21. data/lib/ruby_terraform/commands/providers_mirror.rb +24 -0
  22. data/lib/ruby_terraform/commands/providers_schema.rb +25 -0
  23. data/lib/ruby_terraform/commands/refresh.rb +19 -6
  24. data/lib/ruby_terraform/commands/remote_config.rb +4 -4
  25. data/lib/ruby_terraform/commands/show.rb +8 -6
  26. data/lib/ruby_terraform/commands/state_list.rb +20 -0
  27. data/lib/ruby_terraform/commands/state_move.rb +34 -0
  28. data/lib/ruby_terraform/commands/state_pull.rb +16 -0
  29. data/lib/ruby_terraform/commands/state_push.rb +24 -0
  30. data/lib/ruby_terraform/commands/state_remove.rb +32 -0
  31. data/lib/ruby_terraform/commands/state_replace_provider.rb +35 -0
  32. data/lib/ruby_terraform/commands/state_show.rb +24 -0
  33. data/lib/ruby_terraform/commands/taint.rb +36 -0
  34. data/lib/ruby_terraform/commands/untaint.rb +37 -0
  35. data/lib/ruby_terraform/commands/validate.rb +8 -9
  36. data/lib/ruby_terraform/commands/workspace_delete.rb +32 -0
  37. data/lib/ruby_terraform/commands/workspace_list.rb +24 -0
  38. data/lib/ruby_terraform/commands/workspace_new.rb +32 -0
  39. data/lib/ruby_terraform/commands/workspace_select.rb +24 -0
  40. data/lib/ruby_terraform/commands/workspace_show.rb +16 -0
  41. data/lib/ruby_terraform/options.rb +26 -3
  42. data/lib/ruby_terraform/options/common.rb +12 -0
  43. data/lib/ruby_terraform/options/definition.rb +172 -0
  44. data/lib/ruby_terraform/options/definitions.rb +103 -0
  45. data/lib/ruby_terraform/options/factory.rb +10 -101
  46. data/lib/ruby_terraform/options/name.rb +11 -19
  47. data/lib/ruby_terraform/options/types.rb +27 -0
  48. data/lib/ruby_terraform/options/types/base.rb +6 -13
  49. data/lib/ruby_terraform/options/types/flag.rb +1 -3
  50. data/lib/ruby_terraform/options/types/standard.rb +1 -27
  51. data/lib/ruby_terraform/options/values.rb +38 -0
  52. data/lib/ruby_terraform/options/values/base.rb +15 -0
  53. data/lib/ruby_terraform/options/values/boolean.rb +13 -11
  54. data/lib/ruby_terraform/options/values/complex.rb +19 -0
  55. data/lib/ruby_terraform/options/values/key_value.rb +21 -0
  56. data/lib/ruby_terraform/options/values/string.rb +17 -0
  57. data/lib/ruby_terraform/output.rb +7 -7
  58. data/lib/ruby_terraform/version.rb +1 -1
  59. data/ruby_terraform.gemspec +3 -1
  60. metadata +63 -6
  61. data/lib/ruby_terraform/commands/workspace.rb +0 -26
  62. data/lib/ruby_terraform/options/types/boolean.rb +0 -18
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+ require_relative '../options/common'
5
+
6
+ module RubyTerraform
7
+ module Commands
8
+ class WorkspaceList < Base
9
+ include RubyTerraform::Options::Common
10
+
11
+ def subcommands
12
+ %w[workspace list]
13
+ end
14
+
15
+ def arguments(parameters)
16
+ [parameters[:directory]]
17
+ end
18
+
19
+ def parameter_defaults(_parameters)
20
+ { directory: nil }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+ require_relative '../options/common'
5
+
6
+ module RubyTerraform
7
+ module Commands
8
+ class WorkspaceNew < Base
9
+ include RubyTerraform::Options::Common
10
+
11
+ def subcommands
12
+ %w[workspace new]
13
+ end
14
+
15
+ def options
16
+ %w[
17
+ -lock
18
+ -lock-timeout
19
+ -state
20
+ ] + super
21
+ end
22
+
23
+ def arguments(parameters)
24
+ [parameters[:workspace], parameters[:directory]]
25
+ end
26
+
27
+ def parameter_defaults(_parameters)
28
+ { directory: nil }
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+ require_relative '../options/common'
5
+
6
+ module RubyTerraform
7
+ module Commands
8
+ class WorkspaceSelect < Base
9
+ include RubyTerraform::Options::Common
10
+
11
+ def subcommands
12
+ %w[workspace select]
13
+ end
14
+
15
+ def arguments(parameters)
16
+ [parameters[:workspace], parameters[:directory]]
17
+ end
18
+
19
+ def parameter_defaults(_parameters)
20
+ { directory: nil }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+ require_relative '../options/common'
5
+
6
+ module RubyTerraform
7
+ module Commands
8
+ class WorkspaceShow < Base
9
+ include RubyTerraform::Options::Common
10
+
11
+ def subcommands
12
+ %w[workspace show]
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,7 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'options/name'
4
- require_relative 'options/types/flag'
5
- require_relative 'options/types/boolean'
6
- require_relative 'options/types/standard'
4
+ require_relative 'options/types'
5
+ require_relative 'options/values'
6
+ require_relative 'options/definition'
7
7
  require_relative 'options/factory'
8
+ require_relative 'options/common'
9
+
10
+ module RubyTerraform
11
+ module Options
12
+ def self.name(name)
13
+ Name.new(name)
14
+ end
15
+
16
+ def self.definition(opts)
17
+ Definition.new(opts)
18
+ end
19
+
20
+ def self.types
21
+ Types
22
+ end
23
+
24
+ def self.values
25
+ Values
26
+ end
27
+ end
28
+ end
29
+
30
+ require_relative 'options/definitions'
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyTerraform
4
+ module Options
5
+ module Common
6
+ # @!visibility private
7
+ def options
8
+ %w[-chdir]
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,172 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'immutable-struct'
4
+
5
+ require_relative 'name'
6
+ require_relative 'types'
7
+ require_relative 'values'
8
+
9
+ module RubyTerraform
10
+ module Options
11
+ # rubocop:disable Metrics/ClassLength
12
+ class Definition < ImmutableStruct.new(
13
+ :name,
14
+ :option_type,
15
+ :value_type,
16
+ :override_keys,
17
+ :extra_keys,
18
+ :separator,
19
+ :repeatable?
20
+ )
21
+ # rubocop:disable Metrics/MethodLength
22
+ def initialize(opts)
23
+ raise 'Missing name.' unless opts[:name]
24
+
25
+ super(
26
+ name: Name.new(opts[:name]),
27
+ option_type: Types.resolve(opts[:option_type]) || Types::Standard,
28
+ value_type: Values.resolve(opts[:value_type]) || Values::String,
29
+ repeatable: opts[:repeatable] || false,
30
+ separator: opts[:separator],
31
+ extra_keys:
32
+ { singular: [], plural: [] }
33
+ .merge(opts[:extra_keys] || {}),
34
+ override_keys:
35
+ { singular: nil, plural: nil }
36
+ .merge(opts[:override_keys] || {})
37
+ )
38
+ end
39
+ # rubocop:enable Metrics/MethodLength
40
+
41
+ def matches?(name)
42
+ @name == Name.new(name)
43
+ end
44
+
45
+ def build(parameters)
46
+ build_singular_options(parameters) + build_plural_options(parameters)
47
+ end
48
+
49
+ private
50
+
51
+ def resolved_singular_key
52
+ if override_keys[:singular] == false
53
+ nil
54
+ else
55
+ override_keys[:singular] || name.as_singular_key
56
+ end
57
+ end
58
+
59
+ def all_singular_keys
60
+ ([resolved_singular_key] + extra_keys[:singular]).compact
61
+ end
62
+
63
+ def resolved_plural_key
64
+ if override_keys[:plural] == false
65
+ nil
66
+ else
67
+ override_keys[:plural] || name.as_plural_key
68
+ end
69
+ end
70
+
71
+ def all_plural_keys
72
+ ([resolved_plural_key] + extra_keys[:plural]).compact
73
+ end
74
+
75
+ def too_many_values?(values)
76
+ !repeatable? && values.length > 1
77
+ end
78
+
79
+ def values(parameters, keys)
80
+ keys.map { |k| parameters[k] }.compact
81
+ end
82
+
83
+ def needs_plural?(value)
84
+ repeatable? && !value.nil?
85
+ end
86
+
87
+ def only_singular?(value)
88
+ !needs_plural?(value)
89
+ end
90
+
91
+ def key_valued?(value)
92
+ value.respond_to?(:keys)
93
+ end
94
+
95
+ def multi_valued?(value)
96
+ value.respond_to?(:each)
97
+ end
98
+
99
+ def build_option(value)
100
+ option_type.new(name, value, separator: separator)
101
+ end
102
+
103
+ def build_value(value)
104
+ value_type.new(value)
105
+ end
106
+
107
+ def build_key_value(key, value)
108
+ Values::KeyValue.new(key, build_value(value))
109
+ end
110
+
111
+ def build_singular(value)
112
+ build_single_option(value)
113
+ end
114
+
115
+ def build_singulars(values)
116
+ values.map { |p| build_singular(p) }.flatten
117
+ end
118
+
119
+ def build_singular_options(parameters)
120
+ keys = all_singular_keys
121
+ values = values(parameters, keys)
122
+
123
+ if too_many_values?(values)
124
+ raise "Multiple values provided for '#{name}' " \
125
+ "(with keys #{keys}) and option not repeatable."
126
+ end
127
+
128
+ build_singulars(values)
129
+ end
130
+
131
+ def build_plural(value)
132
+ if only_singular?(value)
133
+ build_no_options
134
+ elsif key_valued?(value)
135
+ build_key_value_options(value)
136
+ elsif multi_valued?(value)
137
+ build_multiple_options(value)
138
+ else
139
+ build_single_option(value)
140
+ end
141
+ end
142
+
143
+ def build_plurals(values)
144
+ values.map { |p| build_plural(p) }.flatten
145
+ end
146
+
147
+ def build_plural_options(parameters)
148
+ keys = all_plural_keys
149
+ values = values(parameters, keys)
150
+
151
+ build_plurals(values)
152
+ end
153
+
154
+ def build_key_value_options(value)
155
+ value.map { |k, v| build_option(build_key_value(k, v)) }
156
+ end
157
+
158
+ def build_multiple_options(value)
159
+ value.map { |v| build_option(build_value(v)) }
160
+ end
161
+
162
+ def build_single_option(value)
163
+ [build_option(build_value(value))]
164
+ end
165
+
166
+ def build_no_options
167
+ []
168
+ end
169
+ end
170
+ # rubocop:enable Metrics/ClassLength
171
+ end
172
+ end
@@ -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,117 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'name'
4
- require_relative 'types/boolean'
5
- require_relative 'types/flag'
6
- require_relative 'types/standard'
7
4
 
8
5
  module RubyTerraform
9
6
  module Options
10
7
  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
8
+ def initialize(definitions)
9
+ @definitions = definitions
75
10
  end
76
11
 
77
- def from
78
- names.each_with_object([]) do |name, options|
79
- options.append(*options_from_name(name))
80
- 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
81
18
  end
82
19
 
83
20
  private
84
21
 
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)
22
+ def resolve_name(name, parameters)
23
+ @definitions.find { |d| d.matches?(name) }.build(parameters)
115
24
  end
116
25
  end
117
26
  end