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 +4 -4
- data/Gemfile.lock +8 -6
- data/lib/ruby_terraform.rb +7 -2
- data/lib/ruby_terraform/commands/base.rb +10 -15
- data/lib/ruby_terraform/commands/output.rb +2 -4
- data/lib/ruby_terraform/options.rb +25 -3
- data/lib/ruby_terraform/options/definition.rb +170 -0
- data/lib/ruby_terraform/options/definitions.rb +103 -0
- data/lib/ruby_terraform/options/factory.rb +10 -102
- data/lib/ruby_terraform/options/name.rb +11 -19
- data/lib/ruby_terraform/options/types.rb +27 -0
- data/lib/ruby_terraform/options/types/base.rb +6 -13
- data/lib/ruby_terraform/options/types/flag.rb +1 -3
- data/lib/ruby_terraform/options/types/standard.rb +1 -27
- data/lib/ruby_terraform/options/values.rb +38 -0
- data/lib/ruby_terraform/options/values/base.rb +15 -0
- data/lib/ruby_terraform/options/values/boolean.rb +13 -11
- data/lib/ruby_terraform/options/values/complex.rb +19 -0
- data/lib/ruby_terraform/options/values/key_value.rb +21 -0
- data/lib/ruby_terraform/options/values/string.rb +17 -0
- data/lib/ruby_terraform/version.rb +1 -1
- data/ruby_terraform.gemspec +2 -1
- metadata +26 -5
- data/lib/ruby_terraform/options/types/boolean.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1aa09973516552eca1e86476c1a12da268f105a8a78d87ac4366c59e8051e5d4
|
4
|
+
data.tar.gz: ccfc2afc555c53f30fb61f429e33d9451102aba3d3a39b68e69ebb546406bc10
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
5
|
-
|
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
|
-
|
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.
|
74
|
+
parser (3.0.1.0)
|
73
75
|
ast (~> 2.4.1)
|
74
|
-
pry (0.14.
|
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.
|
179
|
+
2.2.16
|
data/lib/ruby_terraform.rb
CHANGED
@@ -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
|
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
|
13
|
-
|
14
|
-
@
|
15
|
-
@
|
16
|
-
@
|
17
|
-
@
|
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(
|
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
|
13
|
-
|
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
|
5
|
-
require_relative 'options/
|
6
|
-
require_relative 'options/
|
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
|
-
|
12
|
-
|
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
|
79
|
-
names
|
80
|
-
|
81
|
-
|
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
|
-
|
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
|
-
|
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
|
12
|
+
def name
|
15
13
|
"-#{without_prefix}"
|
16
14
|
end
|
17
15
|
|
18
|
-
|
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
|
-
|
27
|
-
to_s == other
|
28
|
-
end
|
29
|
-
|
30
|
-
def eql?(other)
|
31
|
-
to_s == other
|
32
|
-
end
|
26
|
+
private
|
33
27
|
|
34
|
-
def
|
35
|
-
|
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
|
-
|
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 '
|
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
|
@@ -9,33 +9,7 @@ module RubyTerraform
|
|
9
9
|
module Types
|
10
10
|
class Standard < Base
|
11
11
|
def apply(builder)
|
12
|
-
|
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
|
@@ -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
|
-
|
7
|
-
def
|
8
|
-
|
9
|
-
|
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
|
data/ruby_terraform.gemspec
CHANGED
@@ -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 '
|
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.
|
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-
|
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.
|
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.
|
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
|