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

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.
@@ -1,38 +1,29 @@
1
- require 'json'
2
1
  require_relative 'base'
3
2
 
4
3
  module RubyTerraform
5
4
  module Commands
6
5
  class Validate < Base
7
- def configure_command(builder, opts)
8
- directory = opts[:directory]
9
- vars = opts[:vars] || {}
10
- var_file = opts[:var_file]
11
- var_files = opts[:var_files] || []
12
- state = opts[:state]
13
- check_variables = opts[:check_variables]
14
- no_color = opts[:no_color]
15
- json_format = opts[:json]
6
+ def switches
7
+ %w[
8
+ -check-variables
9
+ -json
10
+ -no-color
11
+ -state
12
+ -var
13
+ -var-file
14
+ ]
15
+ end
16
+
17
+ def subcommands(_values)
18
+ %w[validate]
19
+ end
20
+
21
+ def arguments(values)
22
+ [values[:directory]]
23
+ end
16
24
 
17
- builder
18
- .with_subcommand('validate') do |sub|
19
- vars.each do |key, value|
20
- var_value = value.is_a?(String) ? value : JSON.generate(value)
21
- sub = sub.with_option(
22
- '-var', "'#{key}=#{var_value}'", separator: ' ')
23
- end
24
- sub = sub.with_option('-var-file', var_file) if var_file
25
- var_files.each do |file|
26
- sub = sub.with_option('-var-file', file)
27
- end
28
- sub = sub.with_option('-state', state) if state
29
- sub = sub.with_option('-check-variables', check_variables) unless
30
- check_variables.nil?
31
- sub = sub.with_flag('-no-color') if no_color
32
- sub = sub.with_flag('-json') if json_format
33
- sub
34
- end
35
- .with_argument(directory)
25
+ def option_default_values(_opts)
26
+ { vars: {}, var_files: [] }
36
27
  end
37
28
  end
38
29
  end
@@ -3,20 +3,21 @@ require_relative 'base'
3
3
  module RubyTerraform
4
4
  module Commands
5
5
  class Workspace < Base
6
- def configure_command(builder, opts)
7
- directory = opts[:directory] || nil
8
- operation = opts[:operation] || 'list'
9
- workspace = opts[:workspace] || nil
10
-
11
- builder = builder
12
- .with_subcommand('workspace')
13
- .with_subcommand(operation)
6
+ def subcommands(values)
7
+ commands = ['workspace', values[:operation]]
8
+ if values[:workspace] && values[:operation] != 'list'
9
+ commands << values[:workspace]
10
+ else
11
+ commands
12
+ end
13
+ end
14
14
 
15
- builder = builder.with_subcommand(workspace) if
16
- workspace && operation != 'list'
17
- builder = builder.with_argument(directory)
15
+ def arguments(values)
16
+ [values[:directory]]
17
+ end
18
18
 
19
- builder
19
+ def option_default_values(_opts)
20
+ { directory: nil, operation: 'list', workspace: nil }
20
21
  end
21
22
  end
22
23
  end
@@ -0,0 +1,5 @@
1
+ require_relative 'options/name'
2
+ require_relative 'options/types/flag'
3
+ require_relative 'options/types/boolean'
4
+ require_relative 'options/types/standard'
5
+ require_relative 'options/factory'
@@ -0,0 +1,116 @@
1
+ require_relative 'name'
2
+ require_relative 'types/boolean'
3
+ require_relative 'types/flag'
4
+ require_relative 'types/standard'
5
+
6
+ module RubyTerraform
7
+ module Options
8
+ class Factory
9
+ PLURAL_OPTIONS =
10
+ Set.new(
11
+ %w[
12
+ -var
13
+ -target
14
+ -var-file
15
+ ]
16
+ ).freeze
17
+
18
+ BOOLEAN_OPTIONS =
19
+ Set.new(
20
+ %w[
21
+ -auto-approve
22
+ -backend
23
+ -get
24
+ -get-plugins
25
+ -input
26
+ -list
27
+ -lock
28
+ -refresh
29
+ -upgrade
30
+ -verify-plugins
31
+ -write
32
+ ]
33
+ ).freeze
34
+
35
+ FLAG_OPTIONS =
36
+ Set.new(
37
+ %w[
38
+ -allow-missing
39
+ -allow-missing-config
40
+ -check
41
+ -compact-warnings
42
+ -destroy
43
+ -detailed-exitcode
44
+ -diff
45
+ -draw-cycles
46
+ -force
47
+ -force-copy
48
+ -ignore-remote-version
49
+ -json
50
+ -no-color
51
+ -raw
52
+ -reconfigure
53
+ -recursive
54
+ -update
55
+ ]
56
+ ).freeze
57
+
58
+ OVERRIDE_OPTIONS =
59
+ {
60
+ config: :directory,
61
+ out: :plan
62
+ }.freeze
63
+
64
+ def self.from(values, switches)
65
+ new(values, switches).from
66
+ end
67
+
68
+ private_class_method :new
69
+
70
+ def initialize(values, names)
71
+ @names = names.map { |switch| Name.new(switch) }
72
+ @values = values
73
+ end
74
+
75
+ def from
76
+ names.each_with_object([]) do |name, options|
77
+ options.append(*options_from_name(name))
78
+ end
79
+ end
80
+
81
+ private
82
+
83
+ attr_reader :names, :values
84
+
85
+ def options_from_name(name)
86
+ return plural_options(name) if PLURAL_OPTIONS.include?(name)
87
+ return boolean_option(name) if BOOLEAN_OPTIONS.include?(name)
88
+ return flag_option(name) if FLAG_OPTIONS.include?(name)
89
+ return override_option(name) if OVERRIDE_OPTIONS.key?(name.as_key)
90
+
91
+ standard_option(name, name.as_key)
92
+ end
93
+
94
+ def boolean_option(name)
95
+ [Types::Boolean.new(name.to_s, values[name.as_key])]
96
+ end
97
+
98
+ def flag_option(name)
99
+ [Types::Flag.new(name.to_s, values[name.as_key])]
100
+ end
101
+
102
+ def standard_option(name, hash_key)
103
+ [Types::Standard.new(name.to_s, values[hash_key])]
104
+ end
105
+
106
+ def override_option(name)
107
+ standard_option(name, OVERRIDE_OPTIONS[name.as_key])
108
+ end
109
+
110
+ def plural_options(name)
111
+ standard_option(name.to_s, name.as_key) +
112
+ standard_option(name.to_s, name.as_plural_key)
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,43 @@
1
+ module RubyTerraform
2
+ module Options
3
+ class Name
4
+ def initialize(name)
5
+ @name = name
6
+ end
7
+
8
+ def without_prefix
9
+ @name[0] == '-' ? @name[1..] : @name
10
+ end
11
+
12
+ def to_s
13
+ "-#{without_prefix}"
14
+ end
15
+
16
+ def as_key
17
+ snake_case.to_sym
18
+ end
19
+
20
+ def as_plural_key
21
+ "#{snake_case}s".to_sym
22
+ end
23
+
24
+ def ==(other)
25
+ to_s == other
26
+ end
27
+
28
+ def eql?(other)
29
+ to_s == other
30
+ end
31
+
32
+ def hash
33
+ to_s.hash
34
+ end
35
+
36
+ private
37
+
38
+ def snake_case
39
+ without_prefix.gsub('-', '_')
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,24 @@
1
+ module RubyTerraform
2
+ module Options
3
+ module Types
4
+ class Base
5
+ def initialize(name, value)
6
+ @name = name
7
+ coerce_value(value)
8
+ end
9
+
10
+ def apply(_builder)
11
+ raise 'not implemented'
12
+ end
13
+
14
+ private
15
+
16
+ attr_reader :name, :value
17
+
18
+ def coerce_value(value)
19
+ @value = value
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'base'
2
+ require_relative '../values/boolean'
3
+
4
+ module RubyTerraform
5
+ module Options
6
+ module Types
7
+ class Boolean < Base
8
+ include Values::Boolean
9
+
10
+ def apply(builder)
11
+ builder.with_option(name, value)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'base'
2
+ require_relative '../values/boolean'
3
+
4
+ module RubyTerraform
5
+ module Options
6
+ module Types
7
+ class Flag < Base
8
+ include Values::Boolean
9
+
10
+ def apply(builder)
11
+ value ? builder.with_flag(name) : builder
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,41 @@
1
+ require 'json'
2
+
3
+ require_relative 'base'
4
+
5
+ module RubyTerraform
6
+ module Options
7
+ module Types
8
+ class Standard < Base
9
+ def apply(builder)
10
+ if value.respond_to?(:keys)
11
+ apply_hash(builder)
12
+ elsif value.respond_to?(:each)
13
+ apply_array(builder)
14
+ else
15
+ builder.with_option(name, value)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def apply_hash(builder)
22
+ builder.with_repeated_option(
23
+ name,
24
+ value.map do |hash_key, hash_value|
25
+ "'#{hash_key}=#{as_string(hash_value)}'"
26
+ end,
27
+ separator: ' '
28
+ )
29
+ end
30
+
31
+ def apply_array(builder)
32
+ builder.with_repeated_option(name, value)
33
+ end
34
+
35
+ def as_string(value)
36
+ value.is_a?(String) ? value : JSON.generate(value)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,29 @@
1
+ module RubyTerraform
2
+ module Options
3
+ module Values
4
+ module Boolean
5
+ def coerce_value(value)
6
+ @value = to_boolean(value)
7
+ end
8
+
9
+ private
10
+
11
+ def to_boolean(value)
12
+ return nil if value.nil?
13
+ return value if a_boolean?(value)
14
+ return true if true_as_string?(value)
15
+
16
+ false
17
+ end
18
+
19
+ def a_boolean?(value)
20
+ value.is_a?(TrueClass) || value.is_a?(FalseClass)
21
+ end
22
+
23
+ def true_as_string?(value)
24
+ value.respond_to?(:downcase) && value.downcase == 'true'
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,20 +1,24 @@
1
1
  module RubyTerraform
2
2
  class Output
3
- def self.for(opts)
4
- name = opts[:name]
5
- backend_config = opts[:backend_config]
3
+ class << self
4
+ def for(opts)
5
+ Dir.chdir(create_config_directory(opts)) do
6
+ RubyTerraform.init(backend_config: opts[:backend_config])
7
+ RubyTerraform.output(name: opts[:name])
8
+ end
9
+ end
6
10
 
7
- source_directory = opts[:source_directory]
8
- work_directory = opts[:work_directory]
11
+ private
9
12
 
10
- configuration_directory = File.join(work_directory, source_directory)
13
+ def create_config_directory(opts)
14
+ source_directory = opts[:source_directory]
15
+ work_directory = opts[:work_directory]
11
16
 
12
- FileUtils.mkdir_p File.dirname(configuration_directory)
13
- FileUtils.cp_r source_directory, configuration_directory
17
+ configuration_directory = File.join(work_directory, source_directory)
18
+ FileUtils.mkdir_p File.dirname(configuration_directory)
19
+ FileUtils.cp_r source_directory, configuration_directory
14
20
 
15
- Dir.chdir(configuration_directory) do
16
- RubyTerraform.init(backend_config: backend_config)
17
- RubyTerraform.output(name: name)
21
+ configuration_directory
18
22
  end
19
23
  end
20
24
  end
@@ -1,3 +1,3 @@
1
1
  module RubyTerraform
2
- VERSION = '0.65.0.pre.2'.freeze
2
+ VERSION = '0.65.0.pre.7'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-terraform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.65.0.pre.2
4
+ version: 0.65.0.pre.7
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-02 00:00:00.000000000 Z
11
+ date: 2021-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lino
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.5'
19
+ version: '2.3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.5'
26
+ version: '2.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -70,30 +70,30 @@ dependencies:
70
70
  name: guard
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '2.16'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '2.16'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: guard-rspec
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '4.7'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '4.7'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: rake
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -182,44 +182,44 @@ dependencies:
182
182
  name: rubocop
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - ">="
185
+ - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: '0'
187
+ version: '1.12'
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
- - - ">="
192
+ - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: '0'
194
+ version: '1.12'
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: rubocop-rspec
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
- - - ">="
199
+ - - "~>"
200
200
  - !ruby/object:Gem::Version
201
- version: '0'
201
+ version: '2.2'
202
202
  type: :development
203
203
  prerelease: false
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
- - - ">="
206
+ - - "~>"
207
207
  - !ruby/object:Gem::Version
208
- version: '0'
208
+ version: '2.2'
209
209
  - !ruby/object:Gem::Dependency
210
210
  name: simplecov
211
211
  requirement: !ruby/object:Gem::Requirement
212
212
  requirements:
213
- - - ">="
213
+ - - "~>"
214
214
  - !ruby/object:Gem::Version
215
- version: '0'
215
+ version: '0.21'
216
216
  type: :development
217
217
  prerelease: false
218
218
  version_requirements: !ruby/object:Gem::Requirement
219
219
  requirements:
220
- - - ">="
220
+ - - "~>"
221
221
  - !ruby/object:Gem::Version
222
- version: '0'
222
+ version: '0.21'
223
223
  description: Wraps the Terraform CLI so that Terraform can be invoked from a Ruby
224
224
  script or Rakefile.
225
225
  email:
@@ -256,6 +256,14 @@ files:
256
256
  - lib/ruby_terraform/commands/workspace.rb
257
257
  - lib/ruby_terraform/errors.rb
258
258
  - lib/ruby_terraform/errors/execution_error.rb
259
+ - lib/ruby_terraform/options.rb
260
+ - lib/ruby_terraform/options/factory.rb
261
+ - lib/ruby_terraform/options/name.rb
262
+ - lib/ruby_terraform/options/types/base.rb
263
+ - lib/ruby_terraform/options/types/boolean.rb
264
+ - lib/ruby_terraform/options/types/flag.rb
265
+ - lib/ruby_terraform/options/types/standard.rb
266
+ - lib/ruby_terraform/options/values/boolean.rb
259
267
  - lib/ruby_terraform/output.rb
260
268
  - lib/ruby_terraform/version.rb
261
269
  homepage: https://github.com/infrablocks/ruby_terraform