ruby-terraform 1.6.0 → 1.7.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8d26f2bfcedb4ca875a6e7f391e4c8a8f2a74fa33a5ea729f8bda5a4aac9c49b
4
- data.tar.gz: b0319de96f32b0dbb0156aca776fec026e9dddcd252035cf2d9d152d06713bf7
3
+ metadata.gz: 680283afcf36ed8fa426c1223836e60e576efcad33524e459ba287e22cf803a2
4
+ data.tar.gz: 15513e05d5002247601634b071794d6b2f04cbc91d1f147d7100d92210c1df9d
5
5
  SHA512:
6
- metadata.gz: 93a1d33c9bd3aef786bb40c4fb6020994e9d27d2f18f52bbe5dbf539cfb3066262ba7a27b931cb2ce364d46ac67ed22ab220c21dcbf7a8a83bbaf55d6a3fb374
7
- data.tar.gz: bd48a69303c19a6ec5793fd335bec518bec69faaa27b79f0006c36942018b0a88272880be0c8d4e72d1915babac3f74063bef9ba236f4c083d271d1b5a6a13b2
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)
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'
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
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
@@ -351,9 +362,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
351
362
  version: '2.7'
352
363
  required_rubygems_version: !ruby/object:Gem::Requirement
353
364
  requirements:
354
- - - ">="
365
+ - - ">"
355
366
  - !ruby/object:Gem::Version
356
- version: '0'
367
+ version: 1.3.1
357
368
  requirements: []
358
369
  rubygems_version: 3.1.6
359
370
  signing_key: