rspec-terraform 0.1.0.pre.27 → 0.1.0.pre.30

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: fbe0f55f0b5903a638e780131a1a32b5e0859b0b92c36f431938ffb929568efc
4
- data.tar.gz: d052537b7512b50b1b94509b50cbb07b493f2efe18ec34a1326bf0555b7631ed
3
+ metadata.gz: b023d70b2108c48cd8043ce090e91a5232d32df7cef1b14c0045bd29a5742196
4
+ data.tar.gz: c335a6a00992aa894ede64d821be06033727ae056182f475244d77e720b23b35
5
5
  SHA512:
6
- metadata.gz: 9cbe733d1fd152518c6d9df00f5c9137ed51f3e7d7e4121b13c5f4b090fce912a965f2de6417b687b77bc1b68c5c9058b3402e4d6b4434f07383d3511364562d
7
- data.tar.gz: 0ef10564041a355a71e1cf61bfe4eeaf9b1db740074c24916d3d995b5935a24286571cf2098bef841356beb98359acb5ea883ea40cf0b5524435022f2fd573c9
6
+ metadata.gz: 922d9f5a1ca42a48a49cca3880d3bd3e36530bd0311d90e431a113c4eec359af133a7a5f1c24be311dd85d026584aeebf05f103ac88e6adf2ae021b2639a8648
7
+ data.tar.gz: e344912487fe48386df455ae61ef00d9e22075211f6317f7b45ccbb4905938811187394daac4ec04800f9b9934dc3bbb06c8755f523a9a44e4c620e825a1d28d
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rspec-terraform (0.1.0.pre.27)
4
+ rspec-terraform (0.1.0.pre.30)
5
+ confidante (>= 0.27)
5
6
  rspec (>= 3.0)
6
7
  ruby-terraform (= 1.7.0.pre.15)
7
8
 
@@ -19,8 +20,15 @@ GEM
19
20
  coderay (1.1.3)
20
21
  colored2 (3.1.2)
21
22
  concurrent-ruby (1.1.10)
23
+ confidante (0.27.0)
24
+ activesupport (>= 4)
25
+ hiera (~> 3.3, >= 3.3.1)
26
+ shikashi (~> 0.6)
22
27
  diff-lcs (1.5.0)
23
28
  docile (1.4.0)
29
+ evalhook (0.6.0)
30
+ partialruby (~> 0.3)
31
+ sexp_processor (~> 4.0)
24
32
  excon (0.92.4)
25
33
  faker (2.22.0)
26
34
  i18n (>= 1.8.11, < 2)
@@ -31,6 +39,7 @@ GEM
31
39
  ffi (1.15.5)
32
40
  formatador (1.1.0)
33
41
  gem-release (2.2.2)
42
+ getsource (0.2.2)
34
43
  guard (2.18.0)
35
44
  formatador (>= 0.2.4)
36
45
  listen (>= 2.7, < 4.0)
@@ -50,6 +59,7 @@ GEM
50
59
  rubocop (< 2.0)
51
60
  hamster (3.0.0)
52
61
  concurrent-ruby (~> 1.0)
62
+ hiera (3.10.0)
53
63
  i18n (1.12.0)
54
64
  concurrent-ruby (~> 1.0)
55
65
  immutable-struct (2.4.1)
@@ -74,6 +84,9 @@ GEM
74
84
  parallel (1.22.1)
75
85
  parser (3.1.2.1)
76
86
  ast (~> 2.4.1)
87
+ partialruby (0.3.0)
88
+ ruby2ruby (~> 2)
89
+ ruby_parser (~> 3)
77
90
  pry (0.14.1)
78
91
  coderay (~> 1.1)
79
92
  method_source (~> 1.0)
@@ -139,12 +152,21 @@ GEM
139
152
  immutable-struct (~> 2.4)
140
153
  lino (~> 3.0)
141
154
  ruby2_keywords (0.0.5)
155
+ ruby2ruby (2.4.4)
156
+ ruby_parser (~> 3.1)
157
+ sexp_processor (~> 4.6)
142
158
  ruby_gpg2 (0.8.0)
143
159
  lino (>= 1.5)
160
+ ruby_parser (3.19.1)
161
+ sexp_processor (~> 4.16)
144
162
  sawyer (0.9.2)
145
163
  addressable (>= 2.3.5)
146
164
  faraday (>= 0.17.3, < 3)
165
+ sexp_processor (4.16.1)
147
166
  shellany (0.0.1)
167
+ shikashi (0.6.0)
168
+ evalhook (>= 0.6.0)
169
+ getsource (>= 0.1.0)
148
170
  simplecov (0.21.2)
149
171
  docile (~> 1.1)
150
172
  simplecov-html (~> 0.11)
@@ -183,4 +205,4 @@ DEPENDENCIES
183
205
  terminal-notifier-guard
184
206
 
185
207
  BUNDLED WITH
186
- 2.3.20
208
+ 2.3.21
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ruby_terraform'
4
+
5
+ module RSpec
6
+ module Terraform
7
+ module Configuration
8
+ module Providers
9
+ class Base
10
+ def reset; end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'confidante'
4
+ require 'ruby_terraform'
5
+
6
+ require_relative './base'
7
+ require_relative '../merger'
8
+
9
+ module RSpec
10
+ module Terraform
11
+ module Configuration
12
+ module Providers
13
+ class Confidante < Base
14
+ attr_reader(
15
+ :parameters,
16
+ :scope_selector,
17
+ :overrides_selector,
18
+ :configuration,
19
+ :merger
20
+ )
21
+
22
+ def initialize(opts = {})
23
+ super()
24
+ @parameters = opts[:parameters] || []
25
+ @scope_selector = opts[:scope_selector] || ->(o) { o }
26
+ @overrides_selector = opts[:overrides_selector] || ->(o) { o }
27
+ @configuration = ::Confidante.configuration
28
+ @merger = opts[:merger] || Merger.new
29
+ end
30
+
31
+ def resolve(overrides = {})
32
+ resolved_configuration =
33
+ configuration
34
+ .for_scope(scope_selector.call(overrides))
35
+ .for_overrides(overrides_selector.call(overrides))
36
+ result = parameters.inject({}) do |acc, parameter|
37
+ value = resolved_configuration.send(parameter)
38
+ value.nil? ? acc : acc.merge(parameter => value)
39
+ end
40
+ merger.merge(result, overrides)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -2,11 +2,13 @@
2
2
 
3
3
  require 'ruby_terraform'
4
4
 
5
+ require_relative './base'
6
+
5
7
  module RSpec
6
8
  module Terraform
7
9
  module Configuration
8
10
  module Providers
9
- class Identity
11
+ class Identity < Base
10
12
  def resolve(overrides = {})
11
13
  overrides
12
14
  end
@@ -1,16 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'ruby_terraform'
4
+
5
+ require_relative './base'
4
6
  require_relative '../merger'
5
7
 
6
8
  module RSpec
7
9
  module Terraform
8
10
  module Configuration
9
11
  module Providers
10
- class InMemory
12
+ class InMemory < Base
11
13
  attr_reader(:configuration)
12
14
 
13
15
  def initialize(configuration = {})
16
+ super()
14
17
  @configuration = configuration
15
18
  @merger = Merger.new
16
19
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ruby_terraform'
4
+ require 'securerandom'
5
+
6
+ require_relative './base'
7
+
8
+ module RSpec
9
+ module Terraform
10
+ module Configuration
11
+ module Providers
12
+ class Seed < Base
13
+ attr_reader(:generator, :merger)
14
+
15
+ def initialize(opts = {})
16
+ super()
17
+ @generator =
18
+ opts[:generator] || -> { SecureRandom.alphanumeric(10) }
19
+ @merger = opts[:merger] || Merger.new
20
+ end
21
+
22
+ def resolve(overrides = {})
23
+ merger.merge({ seed: seed }, overrides)
24
+ end
25
+
26
+ def reset
27
+ @seed = nil
28
+ end
29
+
30
+ private
31
+
32
+ def seed
33
+ @seed ||= generator.call
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -2,6 +2,8 @@
2
2
 
3
3
  require_relative 'providers/identity'
4
4
  require_relative 'providers/in_memory'
5
+ require_relative 'providers/confidante'
6
+ require_relative 'providers/seed'
5
7
 
6
8
  module RSpec
7
9
  module Terraform
@@ -12,8 +12,12 @@ module RSpec
12
12
  Providers::Identity.new
13
13
  end
14
14
 
15
- def in_memory_provider(overrides)
16
- Providers::InMemory.new(overrides)
15
+ def in_memory_provider(opts)
16
+ Providers::InMemory.new(opts)
17
+ end
18
+
19
+ def confidante_provider(opts)
20
+ Providers::Confidante.new(opts)
17
21
  end
18
22
  end
19
23
  end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ruby_terraform'
4
+
5
+ module RSpec
6
+ module Terraform
7
+ module Helpers
8
+ class Output
9
+ attr_reader(
10
+ :overrides, :configuration_provider, :binary, :execution_mode
11
+ )
12
+
13
+ def initialize(overrides = {}, configuration_provider = nil)
14
+ @overrides = overrides
15
+ @configuration_provider =
16
+ configuration_provider || Configuration.identity_provider
17
+ @binary = RSpec.configuration.terraform_binary
18
+ @execution_mode = RSpec.configuration.terraform_execution_mode
19
+ end
20
+
21
+ def execute
22
+ parameters = with_configuration_provider_parameters(overrides)
23
+ parameters = with_mandatory_parameters(parameters)
24
+
25
+ ensure_required_parameters(parameters)
26
+
27
+ clean(parameters)
28
+ init(parameters)
29
+ output_value = output(parameters)
30
+
31
+ JSON.parse(output_value, symbolize_names: true)
32
+ end
33
+
34
+ private
35
+
36
+ def with_configuration_provider_parameters(parameters)
37
+ configuration_provider.resolve(parameters)
38
+ end
39
+
40
+ def with_mandatory_parameters(parameters)
41
+ parameters.merge(
42
+ json: true
43
+ )
44
+ end
45
+
46
+ def required_parameters(execution_mode)
47
+ {
48
+ in_place: %i[name configuration_directory],
49
+ isolated: %i[name source_directory configuration_directory]
50
+ }[execution_mode] || []
51
+ end
52
+
53
+ def ensure_required_parameters(parameters)
54
+ missing_parameters =
55
+ required_parameters(execution_mode)
56
+ .filter { |parameter| parameters[parameter].nil? }
57
+
58
+ return if missing_parameters.empty?
59
+
60
+ raise_missing_parameters(missing_parameters)
61
+ end
62
+
63
+ def raise_missing_parameters(parameters)
64
+ parameters = parameters.collect { |parameter| "`:#{parameter}`" }
65
+ if parameters.count == 1
66
+ raise StandardError,
67
+ "Required parameter: #{parameters[0]} missing."
68
+ else
69
+ parameters = "#{parameters[..-2].join(', ')} and #{parameters[-1]}"
70
+ raise StandardError,
71
+ "Required parameters: #{parameters} missing."
72
+ end
73
+ end
74
+
75
+ def clean(parameters)
76
+ return unless execution_mode == :isolated
77
+
78
+ FileUtils.rm_rf(parameters[:configuration_directory])
79
+ FileUtils.mkdir_p(parameters[:configuration_directory])
80
+ end
81
+
82
+ def init(parameters)
83
+ init_command.execute(init_parameters(parameters))
84
+ end
85
+
86
+ def output(parameters)
87
+ stdout = StringIO.new
88
+ output_command(stdout: stdout)
89
+ .execute(output_parameters(parameters))
90
+ stdout.string
91
+ end
92
+
93
+ def init_command
94
+ RubyTerraform::Commands::Init.new(binary: binary)
95
+ end
96
+
97
+ def output_command(opts = {})
98
+ RubyTerraform::Commands::Output.new(opts.merge(binary: binary))
99
+ end
100
+
101
+ def init_parameters(parameters)
102
+ init_parameters = parameters.merge(
103
+ chdir: parameters[:configuration_directory],
104
+ input: false
105
+ )
106
+ if execution_mode == :isolated
107
+ init_parameters =
108
+ init_parameters.merge(from_module: parameters[:source_directory])
109
+ end
110
+
111
+ init_parameters
112
+ end
113
+
114
+ def output_parameters(parameters)
115
+ output_parameters =
116
+ parameters.merge(
117
+ chdir: parameters[:configuration_directory]
118
+ )
119
+
120
+ if parameters[:state_file]
121
+ output_parameters =
122
+ output_parameters.merge(state: parameters[:state_file])
123
+ end
124
+
125
+ output_parameters
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../configuration/var_captor'
4
+
5
+ module RSpec
6
+ module Terraform
7
+ module Helpers
8
+ class Var
9
+ attr_reader(:overrides, :configuration_provider)
10
+
11
+ def initialize(overrides = {}, configuration_provider = nil)
12
+ @overrides = overrides
13
+ @configuration_provider =
14
+ configuration_provider || Configuration.identity_provider
15
+ end
16
+
17
+ def execute(&block)
18
+ parameters = with_configuration_provider_parameters(overrides)
19
+ parameters = with_resolved_vars(parameters, &block)
20
+
21
+ parameters[:vars][parameters[:name].to_sym]
22
+ end
23
+
24
+ private
25
+
26
+ def with_configuration_provider_parameters(parameters)
27
+ configuration_provider.resolve(parameters)
28
+ end
29
+
30
+ def with_resolved_vars(parameters, &block)
31
+ return parameters unless block_given?
32
+
33
+ var_captor = Configuration::VarCaptor.new(parameters[:vars] || {})
34
+ block.call(var_captor)
35
+ parameters.merge(vars: var_captor.to_h)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -3,6 +3,8 @@
3
3
  require_relative './helpers/apply'
4
4
  require_relative './helpers/destroy'
5
5
  require_relative './helpers/plan'
6
+ require_relative './helpers/output'
7
+ require_relative './helpers/var'
6
8
 
7
9
  module RSpec
8
10
  module Terraform
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RSpec
4
4
  module Terraform
5
- VERSION = '0.1.0.pre.27'
5
+ VERSION = '0.1.0.pre.30'
6
6
  end
7
7
  end
@@ -37,6 +37,7 @@ Gem::Specification.new do |spec|
37
37
 
38
38
  spec.required_ruby_version = '>= 2.7'
39
39
 
40
+ spec.add_dependency 'confidante', '>= 0.27'
40
41
  spec.add_dependency 'rspec', '>= 3.0'
41
42
  spec.add_dependency 'ruby-terraform', '1.7.0.pre.15'
42
43
 
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-terraform
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre.27
4
+ version: 0.1.0.pre.30
5
5
  platform: ruby
6
6
  authors:
7
7
  - InfraBlocks Maintainers
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-24 00:00:00.000000000 Z
11
+ date: 2022-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: confidante
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0.27'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0.27'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rspec
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -282,13 +296,18 @@ files:
282
296
  - lib/rspec/terraform/configuration.rb
283
297
  - lib/rspec/terraform/configuration/merger.rb
284
298
  - lib/rspec/terraform/configuration/providers.rb
299
+ - lib/rspec/terraform/configuration/providers/base.rb
300
+ - lib/rspec/terraform/configuration/providers/confidante.rb
285
301
  - lib/rspec/terraform/configuration/providers/identity.rb
286
302
  - lib/rspec/terraform/configuration/providers/in_memory.rb
303
+ - lib/rspec/terraform/configuration/providers/seed.rb
287
304
  - lib/rspec/terraform/configuration/var_captor.rb
288
305
  - lib/rspec/terraform/helpers.rb
289
306
  - lib/rspec/terraform/helpers/apply.rb
290
307
  - lib/rspec/terraform/helpers/destroy.rb
308
+ - lib/rspec/terraform/helpers/output.rb
291
309
  - lib/rspec/terraform/helpers/plan.rb
310
+ - lib/rspec/terraform/helpers/var.rb
292
311
  - lib/rspec/terraform/matchers.rb
293
312
  - lib/rspec/terraform/matchers/include_output_change.rb
294
313
  - lib/rspec/terraform/matchers/include_resource_change.rb