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

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,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+ require_relative '../options/common'
5
+
6
+ module RubyTerraform
7
+ module Commands
8
+ class Untaint < Base
9
+ include RubyTerraform::Options::Common
10
+
11
+ def subcommands
12
+ %w[untaint]
13
+ end
14
+
15
+ def options
16
+ %w[
17
+ -allow-missing
18
+ -backup
19
+ -lock
20
+ -lock-timeout
21
+ -no-color
22
+ -state
23
+ -state-out
24
+ -ignore-remote-version
25
+ ] + super
26
+ end
27
+
28
+ def arguments(parameters)
29
+ [parameters[:name]]
30
+ end
31
+
32
+ def parameter_overrides(parameters)
33
+ { backup: parameters[:no_backup] ? '-' : parameters[:backup] }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,28 +1,29 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'base'
4
+ require_relative '../options/common'
2
5
 
3
6
  module RubyTerraform
4
7
  module Commands
5
8
  class Validate < Base
6
- def switches
9
+ include RubyTerraform::Options::Common
10
+
11
+ def subcommands
12
+ %w[validate]
13
+ end
14
+
15
+ def options
7
16
  %w[
8
- -check-variables
9
17
  -json
10
18
  -no-color
11
- -state
12
- -var
13
- -var-file
14
- ]
15
- end
16
-
17
- def subcommands(_values)
18
- %w[validate]
19
+ ] + super
19
20
  end
20
21
 
21
- def arguments(values)
22
- [values[:directory]]
22
+ def arguments(parameters)
23
+ [parameters[:directory]]
23
24
  end
24
25
 
25
- def option_default_values(_opts)
26
+ def parameter_defaults(_parameters)
26
27
  { vars: {}, var_files: [] }
27
28
  end
28
29
  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 WorkspaceDelete < Base
9
+ include RubyTerraform::Options::Common
10
+
11
+ def subcommands
12
+ %w[workspace delete]
13
+ end
14
+
15
+ def options
16
+ %w[
17
+ -force
18
+ -lock
19
+ -lock-timeout
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 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,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
@@ -1,5 +1,30 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'options/name'
2
- require_relative 'options/types/flag'
3
- require_relative 'options/types/boolean'
4
- require_relative 'options/types/standard'
4
+ require_relative 'options/types'
5
+ require_relative 'options/values'
6
+ require_relative 'options/definition'
5
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,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyTerraform
4
+ module Options
5
+ module Common
6
+ def options
7
+ %w[-chdir]
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,170 @@
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
+ def initialize(opts) # rubocop:disable Metrics/MethodLength
22
+ raise 'Missing name.' unless opts[:name]
23
+
24
+ super(
25
+ name: Name.new(opts[:name]),
26
+ option_type: Types.resolve(opts[:option_type]) || Types::Standard,
27
+ value_type: Values.resolve(opts[:value_type]) || Values::String,
28
+ repeatable: opts[:repeatable] || false,
29
+ separator: opts[:separator],
30
+ extra_keys:
31
+ { singular: [], plural: [] }
32
+ .merge(opts[:extra_keys] || {}),
33
+ override_keys:
34
+ { singular: nil, plural: nil }
35
+ .merge(opts[:override_keys] || {})
36
+ )
37
+ end
38
+
39
+ def matches?(name)
40
+ @name == Name.new(name)
41
+ end
42
+
43
+ def build(parameters)
44
+ build_singular_options(parameters) + build_plural_options(parameters)
45
+ end
46
+
47
+ private
48
+
49
+ def resolved_singular_key
50
+ if override_keys[:singular] == false
51
+ nil
52
+ else
53
+ override_keys[:singular] || name.as_singular_key
54
+ end
55
+ end
56
+
57
+ def all_singular_keys
58
+ ([resolved_singular_key] + extra_keys[:singular]).compact
59
+ end
60
+
61
+ def resolved_plural_key
62
+ if override_keys[:plural] == false
63
+ nil
64
+ else
65
+ override_keys[:plural] || name.as_plural_key
66
+ end
67
+ end
68
+
69
+ def all_plural_keys
70
+ ([resolved_plural_key] + extra_keys[:plural]).compact
71
+ end
72
+
73
+ def too_many_values?(values)
74
+ !repeatable? && values.length > 1
75
+ end
76
+
77
+ def values(parameters, keys)
78
+ keys.map { |k| parameters[k] }.compact
79
+ end
80
+
81
+ def needs_plural?(value)
82
+ repeatable? && !value.nil?
83
+ end
84
+
85
+ def only_singular?(value)
86
+ !needs_plural?(value)
87
+ end
88
+
89
+ def key_valued?(value)
90
+ value.respond_to?(:keys)
91
+ end
92
+
93
+ def multi_valued?(value)
94
+ value.respond_to?(:each)
95
+ end
96
+
97
+ def build_option(value)
98
+ option_type.new(name, value, separator: separator)
99
+ end
100
+
101
+ def build_value(value)
102
+ value_type.new(value)
103
+ end
104
+
105
+ def build_key_value(key, value)
106
+ Values::KeyValue.new(key, build_value(value))
107
+ end
108
+
109
+ def build_singular(value)
110
+ build_single_option(value)
111
+ end
112
+
113
+ def build_singulars(values)
114
+ values.map { |p| build_singular(p) }.flatten
115
+ end
116
+
117
+ def build_singular_options(parameters)
118
+ keys = all_singular_keys
119
+ values = values(parameters, keys)
120
+
121
+ if too_many_values?(values)
122
+ raise "Multiple values provided for '#{name}' " \
123
+ "(with keys #{keys}) and option not repeatable."
124
+ end
125
+
126
+ build_singulars(values)
127
+ end
128
+
129
+ def build_plural(value)
130
+ if only_singular?(value)
131
+ build_no_options
132
+ elsif key_valued?(value)
133
+ build_key_value_options(value)
134
+ elsif multi_valued?(value)
135
+ build_multiple_options(value)
136
+ else
137
+ build_single_option(value)
138
+ end
139
+ end
140
+
141
+ def build_plurals(values)
142
+ values.map { |p| build_plural(p) }.flatten
143
+ end
144
+
145
+ def build_plural_options(parameters)
146
+ keys = all_plural_keys
147
+ values = values(parameters, keys)
148
+
149
+ build_plurals(values)
150
+ end
151
+
152
+ def build_key_value_options(value)
153
+ value.map { |k, v| build_option(build_key_value(k, v)) }
154
+ end
155
+
156
+ def build_multiple_options(value)
157
+ value.map { |v| build_option(build_value(v)) }
158
+ end
159
+
160
+ def build_single_option(value)
161
+ [build_option(build_value(value))]
162
+ end
163
+
164
+ def build_no_options
165
+ []
166
+ end
167
+ end
168
+ # rubocop:enable Metrics/ClassLength
169
+ end
170
+ end