ruby-terraform 1.6.0.pre.5 → 1.7.0.pre.1

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: b3d7192a520d734b246ea0384e49ac60341ed2169ddad8dd63bd0f8c281b5715
4
- data.tar.gz: 5ca820f3ee95ce07d2d8d5f1e13edf284e53eabd7137732d20234eee4b3f30d7
3
+ metadata.gz: 680283afcf36ed8fa426c1223836e60e576efcad33524e459ba287e22cf803a2
4
+ data.tar.gz: 15513e05d5002247601634b071794d6b2f04cbc91d1f147d7100d92210c1df9d
5
5
  SHA512:
6
- metadata.gz: 565db2201a431fa3b53e75162c965717fb6b76f935404f75f521ae374c44bc651e7c5c428a2ac6b87993df5a2668922a7b17d55069194e00ec52aba2bb520cf6
7
- data.tar.gz: efc862a5c9a2385a7f28f53d71baa6a6b4aa7bc50ae7bbfe7e5de289af95ccb9d8966d4636176c5ecfbcefcd46c75feb0eb4e9b2056a2979abbcf0a0459ba806
6
+ metadata.gz: 19cddfe7e77d1601eccab259866df3c16cb15b3d98ca2e5b4852b253e5e5303b27141a8c8ce204aba7a13ad2fef452e1eb61cca9a85f4bd53c7a1c9e2724def4
7
+ data.tar.gz: d8bd7161d5343e1696d3386e58b84aec9d51e4bb2b93f88c1e51df998b7adf44f00e03b3fba47b0484701280ab4b963ab239a12055a1d2e59ef73b509b2b34c2
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-terraform (1.6.0.pre.5)
4
+ ruby-terraform (1.7.0.pre.1)
5
5
  immutable-struct (~> 2.4)
6
6
  lino (~> 3.0)
7
7
 
@@ -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,147 @@
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: {}, sensitive: {})
12
+ boxed_unknown =
13
+ box_unknown(unknown, sensitive: sensitive)
14
+ boxed_object =
15
+ box_known(object, sensitive: sensitive, initial: boxed_unknown)
16
+
17
+ boxed_object
18
+ end
19
+ # rubocop:enable Style/RedundantAssignment
20
+
21
+ def paths(object, current = [], accumulator = [])
22
+ normalised = normalise(object)
23
+ if normalised.is_a?(Enumerable)
24
+ normalised.inject(accumulator) do |a, e|
25
+ paths(e[0], current + [e[1]], a)
26
+ end
27
+ else
28
+ accumulator + [current]
29
+ end
30
+ end
31
+
32
+ def known_values(paths, object: {}, sensitive: {})
33
+ paths.map do |path|
34
+ resolved = try_dig(object, path)
35
+ resolved_sensitive = try_dig(sensitive, path) == true
36
+
37
+ Values.known(resolved, sensitive: resolved_sensitive)
38
+ end
39
+ end
40
+
41
+ def unknown_values(paths, unknown: {}, sensitive: {})
42
+ paths.map do |path|
43
+ resolved = try_dig(unknown, path)
44
+ resolved_sensitive = try_dig(sensitive, path) == true
45
+
46
+ resolved ? Values.unknown(sensitive: resolved_sensitive) : nil
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def box_unknown(unknown, sensitive: {}, initial: Values.empty_map)
53
+ unknown_paths = paths(unknown)
54
+ unknown_values = unknown_values(
55
+ unknown_paths,
56
+ unknown: unknown, sensitive: sensitive
57
+ )
58
+
59
+ object(
60
+ unknown_paths, unknown_values,
61
+ sensitive: sensitive, initial: initial
62
+ )
63
+ end
64
+
65
+ def box_known(object, sensitive: {}, initial: Values.empty_map)
66
+ object_paths = paths(object)
67
+ object_values = known_values(
68
+ object_paths,
69
+ object: object, sensitive: sensitive
70
+ )
71
+
72
+ object(
73
+ object_paths, object_values,
74
+ sensitive: sensitive, initial: initial
75
+ )
76
+ end
77
+
78
+ def object(paths, values, sensitive: {}, initial: Values.empty_map)
79
+ paths
80
+ .zip(values)
81
+ .each_with_object(initial) do |path_value, object|
82
+ path, value = path_value
83
+ update_in(object, path, value, sensitive: sensitive)
84
+ end
85
+ end
86
+
87
+ def update_in(object, path, value, sensitive: {})
88
+ path.inject([[], path.drop(1)]) do |context, step|
89
+ seen, remaining = context
90
+ pointer = [seen, step, remaining]
91
+
92
+ update_object_for_step(object, pointer, value, sensitive: sensitive)
93
+ update_context_for_step(pointer)
94
+ end
95
+ object
96
+ end
97
+
98
+ def update_object_for_step(object, pointer, value, sensitive: {})
99
+ seen, step, remaining = pointer
100
+
101
+ parent = try_dig(object, seen, default: object)
102
+ upcoming = remaining.first
103
+
104
+ resolved_sensitive = try_dig(sensitive, seen + [step]) == true
105
+ resolved = if remaining.empty?
106
+ value
107
+ else
108
+ empty_by_type(upcoming, sensitive: resolved_sensitive)
109
+ end
110
+
111
+ parent[step] ||= resolved
112
+ end
113
+
114
+ def update_context_for_step(pointer)
115
+ seen, step, remaining = pointer
116
+ [seen + [step], remaining.drop(1)]
117
+ end
118
+
119
+ def try_dig(object, path, default: nil)
120
+ return default if path.empty?
121
+
122
+ result = object.dig(*path)
123
+ result.nil? ? default : result
124
+ rescue NoMethodError, TypeError
125
+ default
126
+ end
127
+
128
+ def empty_by_type(value, sensitive: false)
129
+ if value.is_a?(Numeric)
130
+ Values.empty_list(sensitive: sensitive)
131
+ else
132
+ Values.empty_map(sensitive: sensitive)
133
+ end
134
+ end
135
+
136
+ def normalise(object)
137
+ case object
138
+ when Array then object.each_with_index.to_a
139
+ when Hash then object.to_a.map { |e| [e[1], e[0]] }
140
+ else object
141
+ end
142
+ end
143
+ end
144
+ end
145
+ # rubocop:enable Metrics/ModuleLength
146
+ end
147
+ 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.5'
4
+ VERSION = '1.7.0.pre.1'
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.5
4
+ version: 1.7.0.pre.1
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-02 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