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

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