ruby-terraform 0.65.0.pre.11 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5a58448ed0c98cd15f8213caa98af1fca20e27ab725b3fecb9dcdb873d899c74
4
- data.tar.gz: 484fbd1f6621cfb00422b8efe9d9eebfc5d048a720f440f9e11a946b9e14696a
3
+ metadata.gz: 1aa09973516552eca1e86476c1a12da268f105a8a78d87ac4366c59e8051e5d4
4
+ data.tar.gz: ccfc2afc555c53f30fb61f429e33d9451102aba3d3a39b68e69ebb546406bc10
5
5
  SHA512:
6
- metadata.gz: c634e5a5ff4d6a4063528c44d79e167015f70f21adc4957383bdea35b4f2054f53c9083d8903eb30ab7664437607e8dd3d5cd1e22472315af6a3766714bb8eba
7
- data.tar.gz: '0059b146054f5113031f90b402049144c38cbb0918252752f4ac9320008a4183c724732ca1fb6f28b841b9d6bf1cf7658fc004bcc0e52f76626fae6cecfd2cb4'
6
+ metadata.gz: ed32ad7e4f4b6f98a78cea339ddfc2464d11a892a9ad8d4402a9af7a7d2224bae3cd75384c1a85c210a12efecd40b22bd85b575031ecef390c6da637150756e9
7
+ data.tar.gz: 98304e9c66825275ee0891b244bbe5ee47c3073f0b2c845afbb8cd30bd1297e791ab8367e151ebaf9b2452c0490ad3b55e013416b92f49b6af0dcc305b6ff190
data/Gemfile.lock CHANGED
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-terraform (0.65.0.pre.11)
5
- lino (>= 2.3)
4
+ ruby-terraform (0.65.0.pre.12)
5
+ immutable-struct (>= 2.4)
6
+ lino (>= 2.5)
6
7
 
7
8
  GEM
8
9
  remote: https://rubygems.org/
@@ -50,7 +51,8 @@ GEM
50
51
  concurrent-ruby (~> 1.0)
51
52
  i18n (1.8.10)
52
53
  concurrent-ruby (~> 1.0)
53
- lino (2.3.0)
54
+ immutable-struct (2.4.1)
55
+ lino (2.5.0)
54
56
  hamster (~> 3.0)
55
57
  open4 (~> 1.3)
56
58
  listen (3.5.1)
@@ -69,9 +71,9 @@ GEM
69
71
  sawyer (~> 0.8.0, >= 0.5.3)
70
72
  open4 (1.3.4)
71
73
  parallel (1.20.1)
72
- parser (3.0.0.0)
74
+ parser (3.0.1.0)
73
75
  ast (~> 2.4.1)
74
- pry (0.14.0)
76
+ pry (0.14.1)
75
77
  coderay (~> 1.1)
76
78
  method_source (~> 1.0)
77
79
  public_suffix (4.0.6)
@@ -174,4 +176,4 @@ DEPENDENCIES
174
176
  simplecov (~> 0.21)
175
177
 
176
178
  BUNDLED WITH
177
- 2.2.15
179
+ 2.2.16
@@ -62,7 +62,7 @@ module RubyTerraform
62
62
  workspace_show: RubyTerraform::Commands::WorkspaceShow
63
63
  }.each do |method, command_class|
64
64
  define_method(method) do |parameters = {}|
65
- command_class.new.execute(parameters)
65
+ exec(command_class, parameters)
66
66
  end
67
67
  end
68
68
 
@@ -98,7 +98,7 @@ module RubyTerraform
98
98
  end
99
99
 
100
100
  class Configuration
101
- attr_accessor :binary, :logger, :stdin, :stdout, :stderr
101
+ attr_accessor :binary, :logger, :options, :stdin, :stdout, :stderr
102
102
 
103
103
  def default_logger
104
104
  logger = Logger.new($stdout)
@@ -106,9 +106,14 @@ module RubyTerraform
106
106
  logger
107
107
  end
108
108
 
109
+ def default_options
110
+ Options::Factory.new(Options::DEFINITIONS)
111
+ end
112
+
109
113
  def initialize
110
114
  @binary = 'terraform'
111
115
  @logger = default_logger
116
+ @options = default_options
112
117
  @stdin = ''
113
118
  @stdout = $stdout
114
119
  @stderr = $stderr
@@ -3,20 +3,17 @@
3
3
  require 'lino'
4
4
 
5
5
  require_relative '../errors'
6
- require_relative '../options/factory'
7
6
 
8
7
  module RubyTerraform
9
8
  module Commands
10
9
  class Base
11
- def initialize(
12
- binary: nil, logger: nil, stdin: nil, stdout: nil, stderr: nil
13
- )
14
- @binary = binary || RubyTerraform.configuration.binary
15
- @logger = logger || RubyTerraform.configuration.logger
16
- @stdin = stdin || RubyTerraform.configuration.stdin
17
- @stdout = stdout || RubyTerraform.configuration.stdout
18
- @stderr = stderr || RubyTerraform.configuration.stderr
19
- initialize_command
10
+ def initialize(**opts) # rubocop:disable Metrics/AbcSize
11
+ @binary = opts[:binary] || RubyTerraform.configuration.binary
12
+ @logger = opts[:logger] || RubyTerraform.configuration.logger
13
+ @options = opts[:options] || RubyTerraform.configuration.options
14
+ @stdin = opts[:stdin] || RubyTerraform.configuration.stdin
15
+ @stdout = opts[:stdout] || RubyTerraform.configuration.stdout
16
+ @stderr = opts[:stderr] || RubyTerraform.configuration.stderr
20
17
  end
21
18
 
22
19
  def execute(parameters = {})
@@ -35,6 +32,7 @@ module RubyTerraform
35
32
 
36
33
  def build_and_execute_command(parameters)
37
34
  command = build_command(parameters)
35
+
38
36
  logger.debug("Running '#{command}'.")
39
37
  command.execute(
40
38
  stdin: stdin,
@@ -53,8 +51,6 @@ module RubyTerraform
53
51
 
54
52
  private
55
53
 
56
- def initialize_command; end
57
-
58
54
  def build_command(parameters)
59
55
  parameters = resolve_parameters(parameters)
60
56
 
@@ -62,10 +58,9 @@ module RubyTerraform
62
58
  .for_command(@binary)
63
59
  .with_options_after_subcommands
64
60
  .with_option_separator('=')
65
- .with_appliables(Options::Factory.from(options, parameters))
61
+ .with_appliables(@options.resolve(options, parameters))
66
62
  .with_subcommands(subcommands)
67
- .with_arguments(arguments(parameters))
68
- .build
63
+ .with_arguments(arguments(parameters)).build
69
64
  end
70
65
 
71
66
  def resolve_parameters(parameters)
@@ -9,10 +9,8 @@ module RubyTerraform
9
9
  class Output < Base
10
10
  include RubyTerraform::Options::Common
11
11
 
12
- def initialize_command
13
- return if defined?(@stdout) && @stdout.respond_to?(:string)
14
-
15
- @stdout = StringIO.new
12
+ def stdout
13
+ @stdout.respond_to?(:string) ? @stdout : (@stdout = StringIO.new)
16
14
  end
17
15
 
18
16
  def subcommands
@@ -1,8 +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
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,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
@@ -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,118 +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
- -platform
18
- ]
19
- ).freeze
20
-
21
- BOOLEAN_OPTIONS =
22
- Set.new(
23
- %w[
24
- -auto-approve
25
- -backend
26
- -get
27
- -get-plugins
28
- -input
29
- -list
30
- -lock
31
- -refresh
32
- -upgrade
33
- -verify-plugins
34
- -write
35
- ]
36
- ).freeze
37
-
38
- FLAG_OPTIONS =
39
- Set.new(
40
- %w[
41
- -allow-missing
42
- -allow-missing-config
43
- -check
44
- -compact-warnings
45
- -destroy
46
- -detailed-exitcode
47
- -diff
48
- -draw-cycles
49
- -force
50
- -force-copy
51
- -ignore-remote-version
52
- -json
53
- -no-color
54
- -raw
55
- -reconfigure
56
- -recursive
57
- -update
58
- ]
59
- ).freeze
60
-
61
- OVERRIDE_OPTIONS =
62
- {
63
- config: :directory,
64
- out: :plan
65
- }.freeze
66
-
67
- def self.from(names, parameters)
68
- new(names, parameters).from
69
- end
70
-
71
- private_class_method :new
72
-
73
- def initialize(names, parameters)
74
- @names = names.map { |name| Name.new(name) }
75
- @parameters = parameters
8
+ def initialize(definitions)
9
+ @definitions = definitions
76
10
  end
77
11
 
78
- def from
79
- names.each_with_object([]) do |name, options|
80
- options.append(*options_from_name(name))
81
- 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
82
18
  end
83
19
 
84
20
  private
85
21
 
86
- attr_reader :names, :parameters
87
-
88
- def options_from_name(name)
89
- return plural_options(name) if PLURAL_OPTIONS.include?(name)
90
- return boolean_option(name) if BOOLEAN_OPTIONS.include?(name)
91
- return flag_option(name) if FLAG_OPTIONS.include?(name)
92
- return override_option(name) if OVERRIDE_OPTIONS.key?(name.as_key)
93
-
94
- standard_option(name, name.as_key)
95
- end
96
-
97
- def boolean_option(name)
98
- [Types::Boolean.new(name.to_s, parameters[name.as_key])]
99
- end
100
-
101
- def flag_option(name)
102
- [Types::Flag.new(name.to_s, parameters[name.as_key])]
103
- end
104
-
105
- def standard_option(name, hash_key)
106
- [Types::Standard.new(name.to_s, parameters[hash_key])]
107
- end
108
-
109
- def override_option(name)
110
- standard_option(name, OVERRIDE_OPTIONS[name.as_key])
111
- end
112
-
113
- def plural_options(name)
114
- standard_option(name.to_s, name.as_key) +
115
- standard_option(name.to_s, name.as_plural_key)
22
+ def resolve_name(name, parameters)
23
+ @definitions.find { |d| d.matches?(name) }.build(parameters)
116
24
  end
117
25
  end
118
26
  end
@@ -1,21 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'immutable-struct'
4
+
3
5
  module RubyTerraform
4
6
  module Options
5
- class Name
7
+ class Name < ImmutableStruct.new(:name)
6
8
  def initialize(name)
7
- @name = name
8
- end
9
-
10
- def without_prefix
11
- @name[0] == '-' ? @name[1..] : @name
9
+ super(name: name.to_s)
12
10
  end
13
11
 
14
- def to_s
12
+ def name
15
13
  "-#{without_prefix}"
16
14
  end
17
15
 
18
- def as_key
16
+ alias to_s name
17
+
18
+ def as_singular_key
19
19
  snake_case.to_sym
20
20
  end
21
21
 
@@ -23,20 +23,12 @@ module RubyTerraform
23
23
  "#{snake_case}s".to_sym
24
24
  end
25
25
 
26
- def ==(other)
27
- to_s == other
28
- end
29
-
30
- def eql?(other)
31
- to_s == other
32
- end
26
+ private
33
27
 
34
- def hash
35
- to_s.hash
28
+ def without_prefix
29
+ @name.sub(/^-+/, '')
36
30
  end
37
31
 
38
- private
39
-
40
32
  def snake_case
41
33
  without_prefix.gsub('-', '_')
42
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,24 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'immutable-struct'
4
+
3
5
  module RubyTerraform
4
6
  module Options
5
7
  module Types
6
- class Base
7
- def initialize(name, value)
8
- @name = name
9
- 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])
10
11
  end
11
12
 
12
13
  def apply(_builder)
13
- raise 'not implemented'
14
- end
15
-
16
- private
17
-
18
- attr_reader :name, :value
19
-
20
- def coerce_value(value)
21
- @value = value
14
+ raise 'Not implemented.'
22
15
  end
23
16
  end
24
17
  end
@@ -7,10 +7,8 @@ module RubyTerraform
7
7
  module Options
8
8
  module Types
9
9
  class Flag < Base
10
- include Values::Boolean
11
-
12
10
  def apply(builder)
13
- value ? builder.with_flag(name) : builder
11
+ value.resolve ? builder.with_flag(name) : builder
14
12
  end
15
13
  end
16
14
  end
@@ -9,33 +9,7 @@ module RubyTerraform
9
9
  module Types
10
10
  class Standard < Base
11
11
  def apply(builder)
12
- if value.respond_to?(:keys)
13
- apply_hash(builder)
14
- elsif value.respond_to?(:each)
15
- apply_array(builder)
16
- else
17
- builder.with_option(name, value)
18
- end
19
- end
20
-
21
- private
22
-
23
- def apply_hash(builder)
24
- builder.with_repeated_option(
25
- name,
26
- value.map do |hash_key, hash_value|
27
- "'#{hash_key}=#{as_string(hash_value)}'"
28
- end,
29
- separator: ' '
30
- )
31
- end
32
-
33
- def apply_array(builder)
34
- builder.with_repeated_option(name, value)
35
- end
36
-
37
- def as_string(value)
38
- value.is_a?(String) ? value : JSON.generate(value)
12
+ builder.with_option(name, value.render, separator: separator)
39
13
  end
40
14
  end
41
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
@@ -1,23 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'base'
4
+
3
5
  module RubyTerraform
4
6
  module Options
5
7
  module Values
6
- module Boolean
7
- def coerce_value(value)
8
- @value = to_boolean(value)
9
- end
10
-
11
- private
12
-
13
- def to_boolean(value)
14
- return nil if value.nil?
15
- return value if a_boolean?(value)
16
- return true if true_as_string?(value)
8
+ class Boolean < Base
9
+ def resolve
10
+ return nil if @value.nil?
11
+ return @value if a_boolean?(@value)
12
+ return true if true_as_string?(@value)
17
13
 
18
14
  false
19
15
  end
20
16
 
17
+ def render
18
+ resolve.nil? ? nil : resolve.to_s
19
+ end
20
+
21
+ private
22
+
21
23
  def a_boolean?(value)
22
24
  value.is_a?(TrueClass) || value.is_a?(FalseClass)
23
25
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module RubyTerraform
6
+ module Options
7
+ module Values
8
+ class Complex < Base
9
+ def resolve
10
+ @value
11
+ end
12
+
13
+ def render
14
+ @value.is_a?(::String) ? @value : JSON.generate(value)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyTerraform
4
+ module Options
5
+ module Values
6
+ class KeyValue < ImmutableStruct.new(:key, :value)
7
+ def initialize(key, value)
8
+ super(key: key, value: value)
9
+ end
10
+
11
+ def resolve
12
+ { key => value.resolve }
13
+ end
14
+
15
+ def render
16
+ "'#{key}=#{value.render}'"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module RubyTerraform
6
+ module Options
7
+ module Values
8
+ class String < Base
9
+ def resolve
10
+ @value.to_s
11
+ end
12
+
13
+ alias render resolve
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyTerraform
4
- VERSION = '0.65.0.pre.11'
4
+ VERSION = '0.65.0.pre.12'
5
5
  end
@@ -38,7 +38,8 @@ Gem::Specification.new do |spec|
38
38
 
39
39
  spec.required_ruby_version = '>= 2.6'
40
40
 
41
- spec.add_dependency 'lino', '>= 2.3'
41
+ spec.add_dependency 'immutable-struct', '>= 2.4'
42
+ spec.add_dependency 'lino', '>= 2.5'
42
43
 
43
44
  spec.add_development_dependency 'bundler', '~> 2.0'
44
45
  spec.add_development_dependency 'faker', '~> 2.17'
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-terraform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.65.0.pre.11
4
+ version: 0.65.0.pre.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toby Clemson
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-04-06 00:00:00.000000000 Z
11
+ date: 2021-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: immutable-struct
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '2.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '2.4'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: lino
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - ">="
18
32
  - !ruby/object:Gem::Version
19
- version: '2.3'
33
+ version: '2.5'
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - ">="
25
39
  - !ruby/object:Gem::Version
26
- version: '2.3'
40
+ version: '2.5'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -293,13 +307,20 @@ files:
293
307
  - lib/ruby_terraform/errors/execution_error.rb
294
308
  - lib/ruby_terraform/options.rb
295
309
  - lib/ruby_terraform/options/common.rb
310
+ - lib/ruby_terraform/options/definition.rb
311
+ - lib/ruby_terraform/options/definitions.rb
296
312
  - lib/ruby_terraform/options/factory.rb
297
313
  - lib/ruby_terraform/options/name.rb
314
+ - lib/ruby_terraform/options/types.rb
298
315
  - lib/ruby_terraform/options/types/base.rb
299
- - lib/ruby_terraform/options/types/boolean.rb
300
316
  - lib/ruby_terraform/options/types/flag.rb
301
317
  - lib/ruby_terraform/options/types/standard.rb
318
+ - lib/ruby_terraform/options/values.rb
319
+ - lib/ruby_terraform/options/values/base.rb
302
320
  - lib/ruby_terraform/options/values/boolean.rb
321
+ - lib/ruby_terraform/options/values/complex.rb
322
+ - lib/ruby_terraform/options/values/key_value.rb
323
+ - lib/ruby_terraform/options/values/string.rb
303
324
  - lib/ruby_terraform/output.rb
304
325
  - lib/ruby_terraform/version.rb
305
326
  - ruby_terraform.gemspec
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base'
4
- require_relative '../values/boolean'
5
-
6
- module RubyTerraform
7
- module Options
8
- module Types
9
- class Boolean < Base
10
- include Values::Boolean
11
-
12
- def apply(builder)
13
- builder.with_option(name, value)
14
- end
15
- end
16
- end
17
- end
18
- end