ruby-terraform 1.6.0.pre.6 → 1.7.0.pre.2

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: dfb61cf4368224119dfec3e6c663cc468d2248f9d5b1dd9cf0fe075d8853147e
4
- data.tar.gz: 244624afc4452f2e20a821d7b077927341b96b31766e2c5a5be2bf99fe92a992
3
+ metadata.gz: f456092f582718db648a5bdfab600d022ffd02b464da155088de1f1ca5247aa2
4
+ data.tar.gz: e79d368374b9f892ac2fec66d5262f6b9d0999542772e8542912b18791ac1656
5
5
  SHA512:
6
- metadata.gz: cf0cbc4bd0ad5ab9fb8a3e6fccea2040b56bb3038432eef56068a97a445cc2b000232d9608699757731c3bb82ebad127b14c3c0bc6c572d4db0314538149e5a8
7
- data.tar.gz: ecff0f62d8b1c97730b6ef6de2f51b48bb437e39463f9d16a742cc4ea4a62631af945ca27cd6142124f0dfee4f6791386aa0c05ad011ae8fa37172c2a95e1f5e
6
+ metadata.gz: 7e00c371ab4abea3f4d9448fc8a9fdd0dcdb7abcdd069aeb77f74ef1f16944dd2bc1f597cdb9ff5c6b2ede990f35c064adcb56dac50bcb9ac9cd74c0a1411703
7
+ data.tar.gz: 01f44d86b1c2ef64a2ea9511a14ece5903d34e554b6908cfe9c41dd724e2a3d7f934fca8f1168b9c94544dcf2b07fb20c3d94f1071dbc408ea8825819eb2398a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-terraform (1.6.0.pre.6)
4
+ ruby-terraform (1.7.0.pre.2)
5
5
  immutable-struct (~> 2.4)
6
6
  lino (~> 3.0)
7
7
 
@@ -129,8 +129,8 @@ GEM
129
129
  parser (>= 3.1.1.0)
130
130
  rubocop-rake (0.6.0)
131
131
  rubocop (~> 1.0)
132
- rubocop-rspec (2.11.1)
133
- rubocop (~> 1.19)
132
+ rubocop-rspec (2.12.1)
133
+ rubocop (~> 1.31)
134
134
  ruby-progressbar (1.11.0)
135
135
  ruby2_keywords (0.0.5)
136
136
  ruby_gpg2 (0.8.0)
@@ -177,4 +177,4 @@ DEPENDENCIES
177
177
  yard
178
178
 
179
179
  BUNDLED WITH
180
- 2.3.16
180
+ 2.3.17
@@ -0,0 +1,104 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../value_equality'
4
+ require_relative './objects'
5
+
6
+ module RubyTerraform
7
+ module Models
8
+ class Change
9
+ include ValueEquality
10
+
11
+ def initialize(content)
12
+ @content = content
13
+ end
14
+
15
+ def actions
16
+ @content[:actions].map do |action|
17
+ {
18
+ 'no-op' => :no_op,
19
+ 'create' => :create,
20
+ 'read' => :read,
21
+ 'update' => :update,
22
+ 'delete' => :delete
23
+ }[action]
24
+ end
25
+ end
26
+
27
+ def before
28
+ @content[:before]
29
+ end
30
+
31
+ def before_sensitive
32
+ @content[:before_sensitive]
33
+ end
34
+
35
+ def before_object
36
+ Objects.box(before, sensitive: before_sensitive)
37
+ end
38
+
39
+ def after
40
+ @content[:after]
41
+ end
42
+
43
+ def after_unknown
44
+ @content[:after_unknown]
45
+ end
46
+
47
+ def after_sensitive
48
+ @content[:after_sensitive]
49
+ end
50
+
51
+ def after_object
52
+ Objects.box(
53
+ after,
54
+ unknown: after_unknown,
55
+ sensitive: after_sensitive
56
+ )
57
+ end
58
+
59
+ def no_op?
60
+ actions == [:no_op]
61
+ end
62
+
63
+ def create?
64
+ actions == [:create]
65
+ end
66
+
67
+ def read?
68
+ actions == [:read]
69
+ end
70
+
71
+ def update?
72
+ actions == [:update]
73
+ end
74
+
75
+ def replace_delete_before_create?
76
+ actions == %i[delete create]
77
+ end
78
+
79
+ def replace_create_before_delete?
80
+ actions == %i[create delete]
81
+ end
82
+
83
+ def replace?
84
+ replace_delete_before_create? || replace_create_before_delete?
85
+ end
86
+
87
+ def delete?
88
+ actions == [:delete]
89
+ end
90
+
91
+ def inspect
92
+ @content.inspect
93
+ end
94
+
95
+ def to_h
96
+ @content
97
+ end
98
+
99
+ def state
100
+ [@content]
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../value_equality'
4
+
5
+ module RubyTerraform
6
+ module Models
7
+ class KnownValue
8
+ include ValueEquality
9
+
10
+ def initialize(value, sensitive: false)
11
+ @value = value
12
+ @sensitive = sensitive
13
+ end
14
+
15
+ attr_reader :value
16
+
17
+ def known?
18
+ true
19
+ end
20
+
21
+ def sensitive?
22
+ @sensitive
23
+ end
24
+
25
+ def state
26
+ [@value, @sensitive]
27
+ end
28
+
29
+ def inspect
30
+ sensitive = sensitive? ? 'sensitive' : 'non-sensitive'
31
+ "#{@value.inspect} (known, #{sensitive})"
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../value_equality'
4
+
5
+ module RubyTerraform
6
+ module Models
7
+ class List
8
+ extend Forwardable
9
+
10
+ include Enumerable
11
+ include ValueEquality
12
+
13
+ def_delegators(
14
+ :@value,
15
+ :to_a, :to_h, :to_ary,
16
+ :[], :[]=, :at, :fetch, :first, :last,
17
+ :concat, :union, :difference, :intersection, :intersect?,
18
+ :<<, :push, :append, :pop, :shift, :unshift, :insert,
19
+ :each, :each_index, :reverse_each, :length, :size, :empty?,
20
+ :find_index, :index, :rindex, :join,
21
+ :reverse, :reverse!, :rotate, :rotate!, :sort, :sort!, :sort_by!,
22
+ :collect, :collect!, :map, :map!, :select, :select!, :filter, :filter!,
23
+ :keep_if, :values_at, :delete, :delete_at, :delete_if,
24
+ :reject, :reject!, :zip, :transpose, :replace, :clear, :fill, :include?,
25
+ :<=>, :slice, :slice!, :assoc, :rassoc, :+, :*, :-, :&, :|, :max, :min,
26
+ :minmax, :uniq, :uniq!, :compact, :compact!, :flatten, :flatten!,
27
+ :count, :cycle,
28
+ :permutation, :combination,
29
+ :repeated_permutation, :repeated_combination,
30
+ :product, :take, :take_while, :drop, :drop_while,
31
+ :bsearch, :bsearch_index, :any?, :all?, :none?, :one?, :dig, :sum,
32
+ :deconstruct, :append, :prepend, :shuffle!, :shuffle, :sample, :pack
33
+ )
34
+
35
+ def initialize(value, sensitive: false)
36
+ @value = value
37
+ @sensitive = sensitive
38
+ end
39
+
40
+ attr_reader :value
41
+
42
+ def sensitive?
43
+ @sensitive
44
+ end
45
+
46
+ def state
47
+ [@value, @sensitive]
48
+ end
49
+
50
+ def inspect
51
+ sensitive = sensitive? ? 'sensitive' : 'non-sensitive'
52
+ "#{value.inspect} (#{sensitive})"
53
+ end
54
+ alias to_s inspect
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../value_equality'
4
+
5
+ module RubyTerraform
6
+ module Models
7
+ class Map
8
+ extend Forwardable
9
+
10
+ include Enumerable
11
+ include ValueEquality
12
+
13
+ def_delegators(
14
+ :@value,
15
+ :rehash, :to_hash, :to_h, :to_a, :to_proc,
16
+ :[], :fetch, :[]=, :store, :default, :default=,
17
+ :default_proc, :default_proc=, :key, :size, :length, :empty?,
18
+ :each_value, :each_key, :each_pair, :each,
19
+ :transform_keys, :transform_keys!,
20
+ :transform_values, :transform_values!,
21
+ :keys, :values, :values_at, :fetch_values,
22
+ :shift, :delete, :delete_if, :keep_if,
23
+ :select, :select!, :filter, :filter!, :reject, :reject!,
24
+ :slice, :except, :clear, :invert, :update, :replace,
25
+ :merge!, :merge, :assoc, :rassoc, :flatten, :compact, :compact!,
26
+ :include?, :member?, :has_key?, :has_value?, :key?, :value?,
27
+ :compare_by_identity, :compare_by_identity?, :any?, :dig,
28
+ :<=, :<, :>=, :>, :deconstruct_keys
29
+ )
30
+
31
+ def initialize(value, sensitive: false)
32
+ @value = value
33
+ @sensitive = sensitive
34
+ end
35
+
36
+ attr_reader :value
37
+
38
+ def sensitive?
39
+ @sensitive
40
+ end
41
+
42
+ def state
43
+ [@value, @sensitive]
44
+ end
45
+
46
+ def inspect
47
+ sensitive = sensitive? ? 'sensitive' : 'non-sensitive'
48
+ "#{value.inspect} (#{sensitive})"
49
+ end
50
+
51
+ alias to_s inspect
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,186 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './values'
4
+
5
+ module RubyTerraform
6
+ module Models
7
+ # rubocop:disable Metrics/ModuleLength
8
+ module Objects
9
+ class << self
10
+ # rubocop:disable Style/RedundantAssignment
11
+ def box(object, unknown: nil, sensitive: nil)
12
+ initial = boxed_empty_by_value(object)
13
+ unknown ||= native_empty_by_value(object)
14
+ sensitive ||= native_empty_by_value(object)
15
+
16
+ return Values.unknown(sensitive: sensitive) if unknown == true
17
+
18
+ boxed_unknown =
19
+ box_unknown(unknown, sensitive: sensitive, initial: initial)
20
+ boxed_object =
21
+ box_known(object, sensitive: sensitive, initial: boxed_unknown)
22
+
23
+ boxed_object
24
+ end
25
+
26
+ # rubocop:enable Style/RedundantAssignment
27
+
28
+ def paths(object, current = [], accumulator = [])
29
+ normalised = normalise(object)
30
+ if normalised.is_a?(Enumerable)
31
+ normalised.inject(accumulator) do |a, e|
32
+ paths(e[0], current + [e[1]], a)
33
+ end
34
+ else
35
+ accumulator + [current]
36
+ end
37
+ end
38
+
39
+ def known_values(paths, object: {}, sensitive: {})
40
+ paths.map do |path|
41
+ resolved = try_dig(object, path)
42
+ resolved_sensitive = try_dig(sensitive, path) == true
43
+
44
+ Values.known(resolved, sensitive: resolved_sensitive)
45
+ end
46
+ end
47
+
48
+ def unknown_values(paths, unknown: {}, sensitive: {})
49
+ paths.map do |path|
50
+ resolved = try_dig(unknown, path)
51
+ resolved_sensitive = try_dig(sensitive, path) == true
52
+
53
+ resolved ? Values.unknown(sensitive: resolved_sensitive) : nil
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ # rubocop:disable Metrics/MethodLength
60
+ def box_unknown(unknown, sensitive: {}, initial: Values.empty_map)
61
+ unknown_paths = paths(unknown)
62
+ if root_path(unknown_paths)
63
+ return Values.unknown(sensitive: sensitive)
64
+ end
65
+
66
+ unknown_values = unknown_values(
67
+ unknown_paths, unknown: unknown, sensitive: sensitive
68
+ )
69
+
70
+ object(
71
+ unknown_paths, unknown_values,
72
+ sensitive: sensitive, initial: initial
73
+ )
74
+ end
75
+ # rubocop:enable Metrics/MethodLength
76
+
77
+ # rubocop:disable Metrics/MethodLength
78
+ def box_known(object, sensitive: {}, initial: Values.empty_map)
79
+ object_paths = paths(object)
80
+ if root_path(object_paths)
81
+ return Values.known(object, sensitive: sensitive)
82
+ end
83
+
84
+ object_values = known_values(
85
+ object_paths, object: object, sensitive: sensitive
86
+ )
87
+
88
+ object(
89
+ object_paths, object_values,
90
+ sensitive: sensitive, initial: initial
91
+ )
92
+ end
93
+ # rubocop:enable Metrics/MethodLength
94
+
95
+ def object(paths, values, sensitive: {}, initial: Values.empty_map)
96
+ paths
97
+ .zip(values)
98
+ .each_with_object(initial) do |path_value, object|
99
+ path, value = path_value
100
+ update_in(object, path, value, sensitive: sensitive)
101
+ end
102
+ end
103
+
104
+ def update_in(object, path, value, sensitive: {})
105
+ path.inject([[], path.drop(1)]) do |context, step|
106
+ seen, remaining = context
107
+ pointer = [seen, step, remaining]
108
+
109
+ update_object_for_step(object, pointer, value, sensitive: sensitive)
110
+ update_context_for_step(pointer)
111
+ end
112
+ object
113
+ end
114
+
115
+ # rubocop:disable Metrics/MethodLength
116
+ def update_object_for_step(object, pointer, value, sensitive: {})
117
+ seen, step, remaining = pointer
118
+
119
+ parent = try_dig(object, seen, default: object)
120
+ upcoming = remaining.first
121
+
122
+ resolved_sensitive = try_dig(sensitive, seen + [step]) == true
123
+ resolved =
124
+ if remaining.empty?
125
+ value
126
+ else
127
+ boxed_empty_by_key(upcoming, sensitive: resolved_sensitive)
128
+ end
129
+
130
+ parent[step] ||= resolved
131
+ end
132
+ # rubocop:enable Metrics/MethodLength
133
+
134
+ def update_context_for_step(pointer)
135
+ seen, step, remaining = pointer
136
+ [seen + [step], remaining.drop(1)]
137
+ end
138
+
139
+ def try_dig(object, path, default: nil)
140
+ return default if path.empty?
141
+
142
+ result = object.dig(*path)
143
+ result.nil? ? default : result
144
+ rescue NoMethodError, TypeError
145
+ default
146
+ end
147
+
148
+ def boxed_empty_by_key(key, sensitive: false)
149
+ if key.is_a?(Numeric)
150
+ Values.empty_list(sensitive: sensitive)
151
+ else
152
+ Values.empty_map(sensitive: sensitive)
153
+ end
154
+ end
155
+
156
+ def boxed_empty_by_value(value, sensitive: false)
157
+ case value
158
+ when Array then Values.empty_list(sensitive: sensitive)
159
+ when Hash then Values.empty_map(sensitive: sensitive)
160
+ end
161
+ end
162
+
163
+ def native_empty_by_value(value)
164
+ case value
165
+ when Array then []
166
+ when Hash then {}
167
+ else false
168
+ end
169
+ end
170
+
171
+ def normalise(object)
172
+ case object
173
+ when Array then object.each_with_index.to_a
174
+ when Hash then object.to_a.map { |e| [e[1], e[0]] }
175
+ else object
176
+ end
177
+ end
178
+
179
+ def root_path(paths)
180
+ paths.count == 1 && paths[0].empty?
181
+ end
182
+ end
183
+ end
184
+ # rubocop:enable Metrics/ModuleLength
185
+ end
186
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'resource_change'
4
+
5
+ module RubyTerraform
6
+ module Models
7
+ class Plan
8
+ def initialize(content)
9
+ @content = content
10
+ end
11
+
12
+ def format_version
13
+ @content[:format_version]
14
+ end
15
+
16
+ def terraform_version
17
+ @content[:terraform_version]
18
+ end
19
+
20
+ def variables
21
+ @content[:variables]
22
+ end
23
+
24
+ def variable_values
25
+ variables.transform_values { |value| value[:value] }
26
+ end
27
+
28
+ def resource_changes
29
+ @content[:resource_changes].map do |resource_change|
30
+ ResourceChange.new(resource_change)
31
+ end
32
+ end
33
+
34
+ def resource_changes_matching(definition)
35
+ resource_changes.filter do |resource_change|
36
+ definition.all? do |method, value|
37
+ resource_change.send(method) == value
38
+ end
39
+ end
40
+ end
41
+
42
+ def inspect
43
+ @content.inspect
44
+ end
45
+
46
+ def to_h
47
+ @content
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../value_equality'
4
+ require_relative 'change'
5
+
6
+ module RubyTerraform
7
+ module Models
8
+ class ResourceChange
9
+ include ValueEquality
10
+ def initialize(content)
11
+ @content = content
12
+ end
13
+
14
+ def address
15
+ @content[:address]
16
+ end
17
+
18
+ def module_address
19
+ @content[:module_address]
20
+ end
21
+
22
+ def mode
23
+ @content[:mode]
24
+ end
25
+
26
+ def type
27
+ @content[:type]
28
+ end
29
+
30
+ def name
31
+ @content[:name]
32
+ end
33
+
34
+ def index
35
+ @content[:index]
36
+ end
37
+
38
+ def provider_name
39
+ @content[:provider_name]
40
+ end
41
+
42
+ def change
43
+ Change.new(@content[:change])
44
+ end
45
+
46
+ def no_op?
47
+ change.no_op?
48
+ end
49
+
50
+ def create?
51
+ change.create?
52
+ end
53
+
54
+ def read?
55
+ change.read?
56
+ end
57
+
58
+ def update?
59
+ change.update?
60
+ end
61
+
62
+ def replace_delete_before_create?
63
+ change.replace_delete_before_create?
64
+ end
65
+
66
+ def replace_create_before_delete?
67
+ change.replace_create_before_delete?
68
+ end
69
+
70
+ def replace?
71
+ change.replace?
72
+ end
73
+
74
+ def delete?
75
+ change.delete?
76
+ end
77
+
78
+ def inspect
79
+ @content.inspect
80
+ end
81
+
82
+ def to_h
83
+ @content
84
+ end
85
+
86
+ def state
87
+ [@content]
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../value_equality'
4
+
5
+ module RubyTerraform
6
+ module Models
7
+ class UnknownValue
8
+ include ValueEquality
9
+
10
+ def initialize(sensitive: false)
11
+ @sensitive = sensitive
12
+ end
13
+
14
+ def known?
15
+ false
16
+ end
17
+
18
+ def sensitive?
19
+ @sensitive
20
+ end
21
+
22
+ def state
23
+ [@sensitive]
24
+ end
25
+
26
+ def inspect
27
+ sensitive = sensitive? ? 'sensitive' : 'non-sensitive'
28
+ "? (unknown, #{sensitive})"
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './list'
4
+ require_relative './map'
5
+ require_relative './known_value'
6
+ require_relative './unknown_value'
7
+
8
+ module RubyTerraform
9
+ module Models
10
+ module Values
11
+ class << self
12
+ def known(value, sensitive: false)
13
+ KnownValue.new(value, sensitive: sensitive)
14
+ end
15
+
16
+ def unknown(sensitive: false)
17
+ UnknownValue.new(sensitive: sensitive)
18
+ end
19
+
20
+ def list(value, sensitive: false)
21
+ List.new(value, sensitive: sensitive)
22
+ end
23
+
24
+ def empty_list(sensitive: false)
25
+ list([], sensitive: sensitive)
26
+ end
27
+
28
+ def map(value, sensitive: false)
29
+ Map.new(value, sensitive: sensitive)
30
+ end
31
+
32
+ def empty_map(sensitive: false)
33
+ map({}, sensitive: sensitive)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'models/plan'
4
+ require_relative 'models/objects'
5
+ require_relative 'models/values'
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RubyTerraform
4
+ module ValueEquality
5
+ def ==(other)
6
+ other.class == self.class && other.state == state
7
+ end
8
+
9
+ alias eql? ==
10
+
11
+ def hash
12
+ [self.class, state].hash
13
+ end
14
+ end
15
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyTerraform
4
- VERSION = '1.6.0.pre.6'
4
+ VERSION = '1.7.0.pre.2'
5
5
  end
@@ -4,6 +4,7 @@ require 'ruby_terraform/version'
4
4
  require 'ruby_terraform/errors'
5
5
  require 'ruby_terraform/options'
6
6
  require 'ruby_terraform/commands'
7
+ require 'ruby_terraform/models'
7
8
  require 'logger'
8
9
 
9
10
  module RubyTerraform
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: 1.6.0.pre.6
4
+ version: 1.7.0.pre.2
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-06-29 00:00:00.000000000 Z
11
+ date: 2022-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: immutable-struct
@@ -317,6 +317,16 @@ files:
317
317
  - lib/ruby_terraform/commands/workspace_show.rb
318
318
  - lib/ruby_terraform/errors.rb
319
319
  - lib/ruby_terraform/errors/execution_error.rb
320
+ - lib/ruby_terraform/models.rb
321
+ - lib/ruby_terraform/models/change.rb
322
+ - lib/ruby_terraform/models/known_value.rb
323
+ - lib/ruby_terraform/models/list.rb
324
+ - lib/ruby_terraform/models/map.rb
325
+ - lib/ruby_terraform/models/objects.rb
326
+ - lib/ruby_terraform/models/plan.rb
327
+ - lib/ruby_terraform/models/resource_change.rb
328
+ - lib/ruby_terraform/models/unknown_value.rb
329
+ - lib/ruby_terraform/models/values.rb
320
330
  - lib/ruby_terraform/options.rb
321
331
  - lib/ruby_terraform/options/definition.rb
322
332
  - lib/ruby_terraform/options/definitions.rb
@@ -333,6 +343,7 @@ files:
333
343
  - lib/ruby_terraform/options/values/key_value.rb
334
344
  - lib/ruby_terraform/options/values/string.rb
335
345
  - lib/ruby_terraform/output.rb
346
+ - lib/ruby_terraform/value_equality.rb
336
347
  - lib/ruby_terraform/version.rb
337
348
  - ruby_terraform.gemspec
338
349
  homepage: https://github.com/infrablocks/ruby_terraform