cloud-templates 0.1.0
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 +7 -0
- data/.rubocop.yml +29 -0
- data/.simplecov +6 -0
- data/Gemfile +2 -0
- data/LICENSE +201 -0
- data/NOTICE +13 -0
- data/README.md +124 -0
- data/Rakefile +27 -0
- data/cloud-templates.gemspec +27 -0
- data/examples/lib/user_directory/artifacts/catalogized.rb +11 -0
- data/examples/lib/user_directory/artifacts/group.rb +37 -0
- data/examples/lib/user_directory/artifacts/ided.rb +11 -0
- data/examples/lib/user_directory/artifacts/organization.rb +17 -0
- data/examples/lib/user_directory/artifacts/pathed.rb +22 -0
- data/examples/lib/user_directory/artifacts/person.rb +20 -0
- data/examples/lib/user_directory/artifacts/team.rb +31 -0
- data/examples/lib/user_directory/artifacts/unit.rb +24 -0
- data/examples/lib/user_directory/artifacts/user.rb +29 -0
- data/examples/lib/user_directory/render/etc/artifact_view.rb +15 -0
- data/examples/lib/user_directory/render/etc/composite_view.rb +26 -0
- data/examples/lib/user_directory/render/etc/group_view.rb +23 -0
- data/examples/lib/user_directory/render/etc/person_view.rb +19 -0
- data/examples/lib/user_directory/render/etc/registry.rb +33 -0
- data/examples/lib/user_directory/render/etc/user_view.rb +35 -0
- data/examples/lib/user_directory/render/etc.rb +3 -0
- data/examples/lib/user_directory/render/ldap/artifact_view.rb +27 -0
- data/examples/lib/user_directory/render/ldap/composite_view.rb +32 -0
- data/examples/lib/user_directory/render/ldap/group_view.rb +28 -0
- data/examples/lib/user_directory/render/ldap/organization_view.rb +26 -0
- data/examples/lib/user_directory/render/ldap/person_view.rb +39 -0
- data/examples/lib/user_directory/render/ldap/registry.rb +16 -0
- data/examples/lib/user_directory/render/ldap/unit_view.rb +26 -0
- data/examples/lib/user_directory/render/ldap/user_view.rb +39 -0
- data/examples/lib/user_directory/render/ldap.rb +3 -0
- data/examples/lib/user_directory/utils.rb +18 -0
- data/examples/lib/user_directory.rb +23 -0
- data/examples/lib_path.rb +2 -0
- data/examples/spec/spec_helper.rb +1 -0
- data/examples/spec/user_directory_spec.rb +568 -0
- data/lib/aws/templates/artifact.rb +140 -0
- data/lib/aws/templates/composite.rb +178 -0
- data/lib/aws/templates/exceptions.rb +221 -0
- data/lib/aws/templates/render/registry.rb +60 -0
- data/lib/aws/templates/render/utils/base_type_views.rb +131 -0
- data/lib/aws/templates/render/view.rb +127 -0
- data/lib/aws/templates/render.rb +72 -0
- data/lib/aws/templates/utils/artifact_storage.rb +141 -0
- data/lib/aws/templates/utils/contextualized/filters.rb +437 -0
- data/lib/aws/templates/utils/contextualized/hash.rb +13 -0
- data/lib/aws/templates/utils/contextualized/nil.rb +13 -0
- data/lib/aws/templates/utils/contextualized/proc.rb +13 -0
- data/lib/aws/templates/utils/contextualized.rb +113 -0
- data/lib/aws/templates/utils/default.rb +185 -0
- data/lib/aws/templates/utils/dependency/enumerable.rb +13 -0
- data/lib/aws/templates/utils/dependency/object.rb +46 -0
- data/lib/aws/templates/utils/dependency.rb +121 -0
- data/lib/aws/templates/utils/dependent.rb +28 -0
- data/lib/aws/templates/utils/inheritable.rb +52 -0
- data/lib/aws/templates/utils/late_bound.rb +89 -0
- data/lib/aws/templates/utils/memoized.rb +27 -0
- data/lib/aws/templates/utils/named.rb +19 -0
- data/lib/aws/templates/utils/options.rb +279 -0
- data/lib/aws/templates/utils/parametrized/constraints.rb +423 -0
- data/lib/aws/templates/utils/parametrized/getters.rb +293 -0
- data/lib/aws/templates/utils/parametrized/guarded.rb +32 -0
- data/lib/aws/templates/utils/parametrized/mapper.rb +73 -0
- data/lib/aws/templates/utils/parametrized/nested.rb +72 -0
- data/lib/aws/templates/utils/parametrized/transformations.rb +660 -0
- data/lib/aws/templates/utils/parametrized.rb +240 -0
- data/lib/aws/templates/utils.rb +219 -0
- data/lib/aws/templates.rb +16 -0
- data/spec/aws/templates/artifact_spec.rb +161 -0
- data/spec/aws/templates/composite_spec.rb +361 -0
- data/spec/aws/templates/render/utils/base_type_views_spec.rb +104 -0
- data/spec/aws/templates/render_spec.rb +62 -0
- data/spec/aws/templates/utils/as_named_spec.rb +31 -0
- data/spec/aws/templates/utils/contextualized/filters_spec.rb +108 -0
- data/spec/aws/templates/utils/contextualized_spec.rb +115 -0
- data/spec/aws/templates/utils/late_bound_spec.rb +52 -0
- data/spec/aws/templates/utils/options_spec.rb +67 -0
- data/spec/aws/templates/utils/parametrized/constraint_spec.rb +175 -0
- data/spec/aws/templates/utils/parametrized/getters_spec.rb +139 -0
- data/spec/aws/templates/utils/parametrized/transformation_spec.rb +314 -0
- data/spec/aws/templates/utils/parametrized_spec.rb +241 -0
- data/spec/spec_helper.rb +6 -0
- metadata +244 -0
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'aws/templates/utils/contextualized'
|
3
|
+
require 'aws/templates/utils/options'
|
4
|
+
|
5
|
+
describe Aws::Templates::Utils::Contextualized do
|
6
|
+
let(:including_class) do
|
7
|
+
Class.new do
|
8
|
+
include Aws::Templates::Utils::Contextualized
|
9
|
+
|
10
|
+
contextualize ->(opts, _) { opts.dup }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:including_module) do
|
15
|
+
Module.new do
|
16
|
+
include Aws::Templates::Utils::Contextualized
|
17
|
+
|
18
|
+
contextualize lambda { |_, memo|
|
19
|
+
memo.delete(:z)
|
20
|
+
memo
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe 'module include' do
|
26
|
+
it 'has filter DSL method' do
|
27
|
+
expect(including_module).to respond_to(:contextualize)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'class include' do
|
32
|
+
it 'has parameter DSL method' do
|
33
|
+
expect(including_class).to respond_to(:contextualize)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'Class is inherited and the module is included' do
|
38
|
+
let(:parametrized_class) do
|
39
|
+
klass = Class.new(including_class)
|
40
|
+
klass.send(:include, including_module)
|
41
|
+
klass
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:instance) { parametrized_class.new }
|
45
|
+
|
46
|
+
let(:options) { Aws::Templates::Utils::Options.new(a: 5, z: 10) }
|
47
|
+
|
48
|
+
it 'returns properly filtered options' do
|
49
|
+
expect(options.filter(&instance.context).to_hash).to be == { a: 5 }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'Class is inherited and extended with filters' do
|
54
|
+
let(:parametrized_class) do
|
55
|
+
Class.new(including_class) do
|
56
|
+
contextualize lambda { |_, memo|
|
57
|
+
memo.delete(:r)
|
58
|
+
memo
|
59
|
+
}
|
60
|
+
|
61
|
+
contextualize lambda { |_, memo|
|
62
|
+
memo[:x] = memo[:a] + 1
|
63
|
+
memo
|
64
|
+
}
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
let(:options) { Aws::Templates::Utils::Options.new(a: 3, r: 5, z: 7) }
|
69
|
+
|
70
|
+
describe 'DSL' do
|
71
|
+
it 'has filter DSL method' do
|
72
|
+
expect(parametrized_class).to respond_to(:contextualize)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context 'Instance of the class created' do
|
77
|
+
let(:instance) { parametrized_class.new }
|
78
|
+
|
79
|
+
it 'filters it according to specified parameters' do
|
80
|
+
expect(options.filter(&instance.context).to_hash).to be == { a: 3, z: 7, x: 4 }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context 'Class is inherited and a filter added' do
|
85
|
+
let(:extending_class) do
|
86
|
+
Class.new(parametrized_class) do
|
87
|
+
contextualize lambda { |_, memo|
|
88
|
+
memo[:w] = memo[:z] + memo[:x]
|
89
|
+
memo
|
90
|
+
}
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
let(:instance) { extending_class.new }
|
95
|
+
|
96
|
+
it 'filters it according to specified parameters' do
|
97
|
+
expect(options.filter(&instance.context).to_hash).to be == { a: 3, z: 7, x: 4, w: 11 }
|
98
|
+
end
|
99
|
+
|
100
|
+
context 'Class inherited and a filtered mixin added' do
|
101
|
+
let(:mixing_class) do
|
102
|
+
k = Class.new(extending_class)
|
103
|
+
k.send(:include, including_module)
|
104
|
+
k
|
105
|
+
end
|
106
|
+
|
107
|
+
let(:instance) { mixing_class.new }
|
108
|
+
|
109
|
+
it 'filters it according to specified parameters' do
|
110
|
+
expect(options.filter(&instance.context).to_hash).to be == { a: 3, x: 4, w: 11 }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'aws/templates/utils/late_bound'
|
3
|
+
|
4
|
+
describe Aws::Templates::Utils::LateBound do
|
5
|
+
let(:including_class) do
|
6
|
+
Class.new do
|
7
|
+
include Aws::Templates::Utils::LateBound
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:instance) { including_class.new }
|
12
|
+
|
13
|
+
describe 'DSL' do
|
14
|
+
it 'has parameter DSL class-level method' do
|
15
|
+
expect(including_class).to respond_to(:reference)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'has parameter DSL instance-level method' do
|
19
|
+
expect(including_class.new).to respond_to(:reference)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'behavior' do
|
24
|
+
context 'class' do
|
25
|
+
let(:reference) { including_class.reference(%i[a b c], explosive: true) }
|
26
|
+
|
27
|
+
let(:evaluated) { instance.instance_exec(&reference) }
|
28
|
+
|
29
|
+
it 'creates proc for reference' do
|
30
|
+
expect(reference).to be_a Proc
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'is evaluated into normal reference' do
|
34
|
+
expect(evaluated).to be_a Aws::Templates::Utils::LateBound::Reference
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'contains assigned attributes' do
|
38
|
+
expect([evaluated.path, evaluated.arguments, evaluated.instance])
|
39
|
+
.to be == [%i[a b c], [{ explosive: true }], instance]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'instance' do
|
44
|
+
let(:reference) { instance.reference(%i[a b c], explosive: true) }
|
45
|
+
|
46
|
+
it 'is evaluated into normal reference' do
|
47
|
+
expect([reference.path, reference.arguments, reference.instance])
|
48
|
+
.to be == [%i[a b c], [{ explosive: true }], instance]
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'aws/templates/utils/options'
|
3
|
+
|
4
|
+
describe Aws::Templates::Utils::Options do
|
5
|
+
let(:options) do
|
6
|
+
described_class.new(
|
7
|
+
a: 1,
|
8
|
+
b: { c: 2 },
|
9
|
+
d: { c: { z: 3 } },
|
10
|
+
:* => { c: { :* => 5 } }
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'merge' do
|
15
|
+
let(:merged_options) do
|
16
|
+
options.merge(a: 12, b: { w: 30 }, d: { c: { z: 34 } })
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:result) do
|
20
|
+
{
|
21
|
+
a: 12,
|
22
|
+
b: { c: 2, w: 30 },
|
23
|
+
d: { c: { z: 34 } },
|
24
|
+
:* => { c: { :* => 5 } }
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'has correct class' do
|
29
|
+
expect(merged_options).to be_a_kind_of(described_class)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'merges according to the algorithm' do
|
33
|
+
expect(merged_options.to_hash).to be == result
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'lookup' do
|
38
|
+
it 'returns value when simple path is specified' do
|
39
|
+
expect(options[:b, :c]).to be == 2
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'return nil when value is not found' do
|
43
|
+
expect(options[:b, :d, :z]).to be_nil
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'wildcard lookup works' do
|
47
|
+
expect(options[:q, :c, :e]).to be == 5
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 'assignment' do
|
52
|
+
it 'existing path assignment works' do
|
53
|
+
options[:b, :c] = 3
|
54
|
+
expect(options[:b, :c]).to be == 3
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'new path assignment works' do
|
58
|
+
options[:b, :z, :y, :d] = 10
|
59
|
+
expect(options[:b, :z, :y, :d]).to be == 10
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'throws an exception when value is not hash' do
|
63
|
+
options[:b, :c, :y, :d] = 13
|
64
|
+
expect(options[:b, :c, :y, :d]).to be == 13
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'aws/templates/utils/parametrized'
|
3
|
+
require 'aws/templates/utils/parametrized/constraints'
|
4
|
+
require 'aws/templates/utils/parametrized/getters'
|
5
|
+
|
6
|
+
module Constraints
|
7
|
+
include Aws::Templates::Utils::Parametrized
|
8
|
+
end
|
9
|
+
|
10
|
+
describe Aws::Templates::Utils::Parametrized::Constraint do
|
11
|
+
let(:constraint) {}
|
12
|
+
|
13
|
+
let(:parametrized_class) do
|
14
|
+
Class.new do
|
15
|
+
include Aws::Templates::Utils::Parametrized
|
16
|
+
|
17
|
+
attr_reader :options
|
18
|
+
|
19
|
+
def self.getter
|
20
|
+
as_is
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(options)
|
24
|
+
@options = options
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:test_class) do
|
30
|
+
k = Class.new(parametrized_class)
|
31
|
+
k.parameter(:something, constraint: constraint)
|
32
|
+
k
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'not_nil' do
|
36
|
+
let(:constraint) { Constraints.not_nil }
|
37
|
+
|
38
|
+
it 'passes when non-nil value is specified' do
|
39
|
+
expect(test_class.new(something: 1).something).to be == 1
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'throws error when parameter is not specified' do
|
43
|
+
expect { test_class.new(something_else: 1).something }
|
44
|
+
.to raise_error Aws::Templates::ParameterValueInvalid
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe 'enum works as expected' do
|
49
|
+
let(:constraint) { Constraints.enum(1, 2, 3) }
|
50
|
+
|
51
|
+
it 'passes when a value from the list is specifed' do
|
52
|
+
expect(test_class.new(something: 2).something).to be == 2
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'passes when value is not specified' do
|
56
|
+
expect(test_class.new(something_else: 2).something).to be_nil
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'throws an error when a value is specified which is not a member of the enumeration' do
|
60
|
+
expect { test_class.new(something: 5).something }
|
61
|
+
.to raise_error Aws::Templates::ParameterValueInvalid
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe 'all_of' do
|
66
|
+
let(:constraint) { Constraints.all_of(Constraints.not_nil, Constraints.enum(1, 2, 3)) }
|
67
|
+
|
68
|
+
it 'passes if all constraints are met' do
|
69
|
+
expect(test_class.new(something: 2).something).to be == 2
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'throws an error if one of the constraints are failed (not_nil)' do
|
73
|
+
expect { test_class.new(something_else: 2).something }
|
74
|
+
.to raise_error Aws::Templates::ParameterValueInvalid
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'throws an error if one of the constraints are failed (enum)' do
|
78
|
+
expect { test_class.new(something: 5).something }
|
79
|
+
.to raise_error Aws::Templates::ParameterValueInvalid
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'requires' do
|
84
|
+
let(:test_class) do
|
85
|
+
Class.new(parametrized_class) do
|
86
|
+
parameter :something, constraint: requires(:requirement)
|
87
|
+
parameter :requirement, description: 'Nothing'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'passes when requirement is satisfied' do
|
92
|
+
expect(test_class.new(something: 2, requirement: 1).something).to be == 2
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'passes if value is nil so no requirements are enforced' do
|
96
|
+
expect(test_class.new({}).something).to be_nil
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'throws an error when requirement is not satisfied' do
|
100
|
+
expect { test_class.new(something: 5).something }
|
101
|
+
.to raise_error Aws::Templates::ParameterValueInvalid
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe 'depends_on_value' do
|
106
|
+
let(:test_class) do
|
107
|
+
Class.new(parametrized_class) do
|
108
|
+
parameter :something,
|
109
|
+
constraint: depends_on_value(
|
110
|
+
requirement: requires(:requirement),
|
111
|
+
condition: requires(:condition)
|
112
|
+
)
|
113
|
+
parameter :requirement, description: 'Nothing'
|
114
|
+
parameter :condition, description: 'Nothing'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'passes when nil' do
|
119
|
+
expect(test_class.new({}).something).to be_nil
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'passes when value is not one of the conditions' do
|
123
|
+
expect(test_class.new(something: 2).something).to be == 2
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'passes when conditional constraint is met' do
|
127
|
+
expect(test_class.new(something: :condition, condition: 2).something)
|
128
|
+
.to be == :condition
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'throws an error when conditional constraint is not met' do
|
132
|
+
expect { test_class.new(something: :condition, requirement: 2).something }
|
133
|
+
.to raise_error Aws::Templates::ParameterValueInvalid
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'passes when other conditional constraint is met' do
|
137
|
+
expect(test_class.new(something: :requirement, requirement: 2).something)
|
138
|
+
.to be == :requirement
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
describe 'satisfies' do
|
143
|
+
let(:constraint) { Constraints.satisfies('some interesting case') { |v| v > 3 } }
|
144
|
+
|
145
|
+
it 'passes when nil' do
|
146
|
+
expect(test_class.new({}).something).to be_nil
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'passes when condition is satisfied' do
|
150
|
+
expect(test_class.new(something: 4).something).to be == 4
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'throws an error when condition is not satisfied' do
|
154
|
+
expect { test_class.new(something: 1).something }
|
155
|
+
.to raise_error Aws::Templates::ParameterValueInvalid
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
describe 'matches' do
|
160
|
+
let(:constraint) { Constraints.matches('[Tt]$') }
|
161
|
+
|
162
|
+
it 'passes when nil' do
|
163
|
+
expect(test_class.new({}).something).to be_nil
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'passes when condition is satisfied' do
|
167
|
+
expect(test_class.new(something: 'rest').something).to be == 'rest'
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'throws an error when condition is not satisfied' do
|
171
|
+
expect { test_class.new(something: 'rooster').something }
|
172
|
+
.to raise_error Aws::Templates::ParameterValueInvalid
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'aws/templates/utils/parametrized'
|
3
|
+
require 'aws/templates/utils/parametrized/getters'
|
4
|
+
|
5
|
+
module Getters
|
6
|
+
include Aws::Templates::Utils::Parametrized
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Aws::Templates::Utils::Parametrized::Getter do
|
10
|
+
let(:parametrized_class) do
|
11
|
+
Class.new do
|
12
|
+
include Aws::Templates::Utils::Parametrized
|
13
|
+
|
14
|
+
attr_reader :options
|
15
|
+
|
16
|
+
def initialize(options)
|
17
|
+
@options = options
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:options_hash) {}
|
23
|
+
|
24
|
+
let(:getter) {}
|
25
|
+
|
26
|
+
let(:test_class) do
|
27
|
+
k = Class.new(parametrized_class)
|
28
|
+
k.parameter(:something, getter: getter)
|
29
|
+
k
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:instance) { test_class.new(options_hash) }
|
33
|
+
|
34
|
+
describe 'as_instance_variable' do
|
35
|
+
let(:parametrized_class) do
|
36
|
+
Class.new do
|
37
|
+
include Aws::Templates::Utils::Parametrized
|
38
|
+
|
39
|
+
def initialize(something)
|
40
|
+
@something = something
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
let(:options_hash) { 'a' }
|
46
|
+
|
47
|
+
let(:getter) { Getters.as_instance_variable }
|
48
|
+
|
49
|
+
it 'returns the value from hash by parameter name' do
|
50
|
+
expect(instance.something).to be == 'a'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'as_is' do
|
55
|
+
let(:options_hash) { { something: 'a' } }
|
56
|
+
|
57
|
+
let(:getter) { Getters.as_is }
|
58
|
+
|
59
|
+
it 'returns the value from hash by parameter name' do
|
60
|
+
expect(instance.something).to be == 'a'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe 'path' do
|
65
|
+
let(:options_hash) do
|
66
|
+
hash = { object: { something: 'a' } }
|
67
|
+
|
68
|
+
class << hash
|
69
|
+
def [](*path)
|
70
|
+
if path.size == 1
|
71
|
+
super(path[0])
|
72
|
+
else
|
73
|
+
path.inject(self) { |acc, elem| acc[elem] }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
hash
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'static path is specified' do
|
82
|
+
let(:getter) { Getters.path(:object, :something) }
|
83
|
+
|
84
|
+
it 'returns value correctly' do
|
85
|
+
expect(instance.something).to be == 'a'
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'dynamic path is specified' do
|
90
|
+
let(:getter) { Getters.path { %i[object something] } }
|
91
|
+
|
92
|
+
it 'returns value correctly' do
|
93
|
+
expect(instance.something).to be == 'a'
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
describe 'value' do
|
99
|
+
let(:options_hash) { { something: 3 } }
|
100
|
+
|
101
|
+
context 'static value is specified' do
|
102
|
+
let(:getter) { Getters.value(1) }
|
103
|
+
|
104
|
+
it 'returns value correctly' do
|
105
|
+
expect(instance.something).to be == 1
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
context 'dynamic calculation is specified' do
|
110
|
+
let(:getter) { Getters.value { options[:something] + 2 } }
|
111
|
+
|
112
|
+
it 'returns value correctly' do
|
113
|
+
expect(instance.something).to be == 5
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe 'one_of' do
|
119
|
+
let(:getter) do
|
120
|
+
Getters.one_of(->(p) { options[p.name] }, ->(_) { options[:default] })
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'first option value is specified' do
|
124
|
+
let(:options_hash) { { something: 'a' } }
|
125
|
+
|
126
|
+
it 'returns the value' do
|
127
|
+
expect(instance.something).to be == 'a'
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'another options value is specified' do
|
132
|
+
let(:options_hash) { { default: 'a' } }
|
133
|
+
|
134
|
+
it 'returns the value' do
|
135
|
+
expect(instance.something).to be == 'a'
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|