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

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