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

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