cloud-templates 0.2.0 → 0.3.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.
Files changed (225) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +4 -0
  3. data/.rubocop.yml +1 -0
  4. data/Rakefile +1 -1
  5. data/bin/cloud-templates-runner.rb +5 -0
  6. data/cloud-templates.gemspec +9 -4
  7. data/examples/lib/user_directory.rb +0 -10
  8. data/examples/lib/user_directory/artifacts.rb +8 -0
  9. data/examples/lib/user_directory/artifacts/catalogized.rb +8 -7
  10. data/examples/lib/user_directory/artifacts/group.rb +27 -30
  11. data/examples/lib/user_directory/artifacts/ided.rb +8 -7
  12. data/examples/lib/user_directory/artifacts/organization.rb +10 -11
  13. data/examples/lib/user_directory/artifacts/pathed.rb +17 -17
  14. data/examples/lib/user_directory/artifacts/person.rb +20 -15
  15. data/examples/lib/user_directory/artifacts/team.rb +26 -21
  16. data/examples/lib/user_directory/artifacts/unit.rb +15 -17
  17. data/examples/lib/user_directory/artifacts/user.rb +26 -23
  18. data/examples/lib/user_directory/render.rb +8 -0
  19. data/examples/lib/user_directory/render/etc.rb +2 -0
  20. data/examples/lib/user_directory/render/etc/artifact_view.rb +2 -2
  21. data/examples/lib/user_directory/render/etc/composite_view.rb +1 -2
  22. data/examples/lib/user_directory/render/etc/group_view.rb +3 -3
  23. data/examples/lib/user_directory/render/etc/person_view.rb +2 -2
  24. data/examples/lib/user_directory/render/etc/registry.rb +4 -6
  25. data/examples/lib/user_directory/render/etc/user_view.rb +2 -3
  26. data/examples/lib/user_directory/render/ldap.rb +2 -0
  27. data/examples/lib/user_directory/render/ldap/artifact_view.rb +3 -4
  28. data/examples/lib/user_directory/render/ldap/composite_view.rb +3 -4
  29. data/examples/lib/user_directory/render/ldap/group_view.rb +3 -4
  30. data/examples/lib/user_directory/render/ldap/organization_view.rb +3 -4
  31. data/examples/lib/user_directory/render/ldap/person_view.rb +3 -4
  32. data/examples/lib/user_directory/render/ldap/registry.rb +3 -4
  33. data/examples/lib/user_directory/render/ldap/unit_view.rb +3 -4
  34. data/examples/lib/user_directory/render/ldap/user_view.rb +3 -4
  35. data/examples/lib/user_directory/utils.rb +1 -1
  36. data/examples/spec/user_directory_spec.rb +24 -25
  37. data/lib/aws/templates.rb +0 -8
  38. data/lib/aws/templates/artifact.rb +20 -12
  39. data/lib/aws/templates/cli.rb +14 -0
  40. data/lib/aws/templates/cli/formatter.rb +21 -0
  41. data/lib/aws/templates/cli/formatter/json.rb +20 -0
  42. data/lib/aws/templates/cli/interface.rb +92 -0
  43. data/lib/aws/templates/composite.rb +6 -9
  44. data/lib/aws/templates/exception.rb +8 -0
  45. data/lib/aws/templates/exception/nested_parameter_exception.rb +19 -0
  46. data/lib/aws/templates/exception/option_error.rb +14 -0
  47. data/lib/aws/templates/exception/option_scalar_on_the_way.rb +26 -0
  48. data/lib/aws/templates/exception/option_should_be_recursive.rb +20 -0
  49. data/lib/aws/templates/exception/option_value_deleted.rb +22 -0
  50. data/lib/aws/templates/exception/parameter_already_exist.rb +26 -0
  51. data/lib/aws/templates/exception/parameter_exception.rb +26 -0
  52. data/lib/aws/templates/exception/parameter_getter_is_not_defined.rb +23 -0
  53. data/lib/aws/templates/exception/parameter_method_name_conflict.rb +26 -0
  54. data/lib/aws/templates/exception/parameter_specification_is_invalid.rb +30 -0
  55. data/lib/aws/templates/exception/parameter_value_invalid.rb +37 -0
  56. data/lib/aws/templates/exception/parametrized_dsl_error.rb +14 -0
  57. data/lib/aws/templates/exception/view_not_found.rb +26 -0
  58. data/lib/aws/templates/help.rb +43 -0
  59. data/lib/aws/templates/help/aggregate.rb +74 -0
  60. data/lib/aws/templates/help/dsl.rb +30 -0
  61. data/lib/aws/templates/help/provider.rb +15 -0
  62. data/lib/aws/templates/help/rdoc.rb +105 -0
  63. data/lib/aws/templates/help/rdoc/artifact.rb +50 -0
  64. data/lib/aws/templates/help/rdoc/composite.rb +20 -0
  65. data/lib/aws/templates/help/rdoc/contextualized.rb +12 -0
  66. data/lib/aws/templates/help/rdoc/contextualized/filter.rb +19 -0
  67. data/lib/aws/templates/help/rdoc/contextualized/filters.rb +14 -0
  68. data/lib/aws/templates/help/rdoc/contextualized/filters/add.rb +21 -0
  69. data/lib/aws/templates/help/rdoc/contextualized/filters/chain.rb +33 -0
  70. data/lib/aws/templates/help/rdoc/contextualized/filters/copy.rb +23 -0
  71. data/lib/aws/templates/help/rdoc/contextualized/filters/identity.rb +23 -0
  72. data/lib/aws/templates/help/rdoc/contextualized/filters/override.rb +29 -0
  73. data/lib/aws/templates/help/rdoc/contextualized/filters/proxy.rb +28 -0
  74. data/lib/aws/templates/help/rdoc/contextualized/filters/recursive_schema_filter.rb +28 -0
  75. data/lib/aws/templates/help/rdoc/contextualized/filters/remove.rb +21 -0
  76. data/lib/aws/templates/help/rdoc/contextualized/filters/scoped.rb +29 -0
  77. data/lib/aws/templates/help/rdoc/contextualized/provider.rb +28 -0
  78. data/lib/aws/templates/help/rdoc/default.rb +12 -0
  79. data/lib/aws/templates/help/rdoc/default/definition.rb +89 -0
  80. data/lib/aws/templates/help/rdoc/default/provider.rb +25 -0
  81. data/lib/aws/templates/help/rdoc/dsl.rb +20 -0
  82. data/lib/aws/templates/help/rdoc/inheritable.rb +48 -0
  83. data/lib/aws/templates/help/rdoc/parametrized.rb +12 -0
  84. data/lib/aws/templates/help/rdoc/parametrized/constraint.rb +31 -0
  85. data/lib/aws/templates/help/rdoc/parametrized/constraints.rb +14 -0
  86. data/lib/aws/templates/help/rdoc/parametrized/constraints/all_of.rb +39 -0
  87. data/lib/aws/templates/help/rdoc/parametrized/constraints/condition.rb +44 -0
  88. data/lib/aws/templates/help/rdoc/parametrized/constraints/depends_on_value.rb +41 -0
  89. data/lib/aws/templates/help/rdoc/parametrized/constraints/enum.rb +33 -0
  90. data/lib/aws/templates/help/rdoc/parametrized/constraints/matches.rb +27 -0
  91. data/lib/aws/templates/help/rdoc/parametrized/constraints/not_nil.rb +27 -0
  92. data/lib/aws/templates/help/rdoc/parametrized/constraints/requires.rb +33 -0
  93. data/lib/aws/templates/help/rdoc/parametrized/constraints/satisfies_condition.rb +28 -0
  94. data/lib/aws/templates/help/rdoc/parametrized/getter.rb +17 -0
  95. data/lib/aws/templates/help/rdoc/parametrized/getters.rb +14 -0
  96. data/lib/aws/templates/help/rdoc/parametrized/nested.rb +32 -0
  97. data/lib/aws/templates/help/rdoc/parametrized/parameter.rb +55 -0
  98. data/lib/aws/templates/help/rdoc/parametrized/provider.rb +32 -0
  99. data/lib/aws/templates/help/rdoc/parametrized/transformation.rb +17 -0
  100. data/lib/aws/templates/help/rdoc/parametrized/transformations.rb +14 -0
  101. data/lib/aws/templates/help/rdoc/parametrized/transformations/as_boolean.rb +25 -0
  102. data/lib/aws/templates/help/rdoc/parametrized/transformations/as_chain.rb +34 -0
  103. data/lib/aws/templates/help/rdoc/parametrized/transformations/as_hash.rb +40 -0
  104. data/lib/aws/templates/help/rdoc/parametrized/transformations/as_integer.rb +26 -0
  105. data/lib/aws/templates/help/rdoc/parametrized/transformations/as_list.rb +32 -0
  106. data/lib/aws/templates/help/rdoc/parametrized/transformations/as_module.rb +25 -0
  107. data/lib/aws/templates/help/rdoc/parametrized/transformations/as_object.rb +32 -0
  108. data/lib/aws/templates/help/rdoc/parametrized/transformations/as_rendered.rb +28 -0
  109. data/lib/aws/templates/help/rdoc/parametrized/transformations/as_string.rb +25 -0
  110. data/lib/aws/templates/help/rdoc/provider.rb +20 -0
  111. data/lib/aws/templates/help/rdoc/routing.rb +104 -0
  112. data/lib/aws/templates/help/rdoc/texting.rb +42 -0
  113. data/lib/aws/templates/processor.rb +53 -0
  114. data/lib/aws/templates/processor/handler.rb +104 -0
  115. data/lib/aws/templates/processor/registry.rb +74 -0
  116. data/lib/aws/templates/processor/routing.rb +27 -0
  117. data/lib/aws/templates/render.rb +27 -25
  118. data/lib/aws/templates/render/basic_view.rb +47 -0
  119. data/lib/aws/templates/render/utils.rb +14 -0
  120. data/lib/aws/templates/render/utils/base_type_views.rb +12 -19
  121. data/lib/aws/templates/render/utils/inspect.rb +2 -4
  122. data/lib/aws/templates/render/utils/stringify.rb +2 -5
  123. data/lib/aws/templates/render/view.rb +3 -100
  124. data/lib/aws/templates/utils.rb +39 -15
  125. data/lib/aws/templates/utils/artifact_storage.rb +2 -3
  126. data/lib/aws/templates/utils/{named.rb → as_named.rb} +2 -3
  127. data/lib/aws/templates/utils/autoload.rb +224 -0
  128. data/lib/aws/templates/utils/contextualized.rb +8 -17
  129. data/lib/aws/templates/utils/contextualized/filter.rb +62 -0
  130. data/lib/aws/templates/utils/contextualized/filter/add.rb +67 -0
  131. data/lib/aws/templates/utils/contextualized/filter/chain.rb +56 -0
  132. data/lib/aws/templates/utils/contextualized/filter/copy.rb +38 -0
  133. data/lib/aws/templates/utils/contextualized/filter/dsl.rb +50 -0
  134. data/lib/aws/templates/utils/contextualized/filter/identity.rb +45 -0
  135. data/lib/aws/templates/utils/contextualized/filter/override.rb +62 -0
  136. data/lib/aws/templates/utils/contextualized/filter/proxy.rb +29 -0
  137. data/lib/aws/templates/utils/contextualized/filter/recursive_schema_filter.rb +46 -0
  138. data/lib/aws/templates/utils/contextualized/filter/remove.rb +66 -0
  139. data/lib/aws/templates/utils/contextualized/filter/scoped.rb +42 -0
  140. data/lib/aws/templates/utils/contextualized/refinements.rb +51 -0
  141. data/lib/aws/templates/utils/default.rb +258 -50
  142. data/lib/aws/templates/utils/dependency.rb +7 -6
  143. data/lib/aws/templates/utils/dependency/refinements.rb +80 -0
  144. data/lib/aws/templates/utils/dependent.rb +6 -3
  145. data/lib/aws/templates/utils/guarded.rb +30 -0
  146. data/lib/aws/templates/utils/inheritable.rb +21 -16
  147. data/lib/aws/templates/utils/inspectable.rb +4 -4
  148. data/lib/aws/templates/utils/late_bound.rb +2 -2
  149. data/lib/aws/templates/utils/memoized.rb +2 -0
  150. data/lib/aws/templates/utils/options.rb +49 -35
  151. data/lib/aws/templates/utils/parametrized.rb +32 -25
  152. data/lib/aws/templates/utils/parametrized/constraint.rb +95 -0
  153. data/lib/aws/templates/utils/parametrized/constraint/all_of.rb +51 -0
  154. data/lib/aws/templates/utils/parametrized/constraint/condition.rb +93 -0
  155. data/lib/aws/templates/utils/parametrized/constraint/depends_on_value.rb +60 -0
  156. data/lib/aws/templates/utils/parametrized/constraint/dsl.rb +86 -0
  157. data/lib/aws/templates/utils/parametrized/constraint/enum.rb +45 -0
  158. data/lib/aws/templates/utils/parametrized/constraint/matches.rb +44 -0
  159. data/lib/aws/templates/utils/parametrized/constraint/not_nil.rb +38 -0
  160. data/lib/aws/templates/utils/parametrized/constraint/requires.rb +54 -0
  161. data/lib/aws/templates/utils/parametrized/constraint/satisfies_condition.rb +55 -0
  162. data/lib/aws/templates/utils/parametrized/getter.rb +67 -0
  163. data/lib/aws/templates/utils/parametrized/getter/as_instance_variable.rb +41 -0
  164. data/lib/aws/templates/utils/parametrized/getter/as_is.rb +37 -0
  165. data/lib/aws/templates/utils/parametrized/getter/dsl.rb +62 -0
  166. data/lib/aws/templates/utils/parametrized/getter/one_of.rb +48 -0
  167. data/lib/aws/templates/utils/parametrized/getter/path.rb +53 -0
  168. data/lib/aws/templates/utils/parametrized/getter/value.rb +50 -0
  169. data/lib/aws/templates/utils/parametrized/nested.rb +9 -16
  170. data/lib/aws/templates/utils/parametrized/transformation.rb +74 -0
  171. data/lib/aws/templates/utils/parametrized/transformation/as_boolean.rb +42 -0
  172. data/lib/aws/templates/utils/parametrized/transformation/as_chain.rb +57 -0
  173. data/lib/aws/templates/utils/parametrized/transformation/as_hash.rb +89 -0
  174. data/lib/aws/templates/utils/parametrized/transformation/as_integer.rb +39 -0
  175. data/lib/aws/templates/utils/parametrized/transformation/as_list.rb +97 -0
  176. data/lib/aws/templates/utils/parametrized/transformation/as_module.rb +42 -0
  177. data/lib/aws/templates/utils/parametrized/transformation/as_object.rb +76 -0
  178. data/lib/aws/templates/utils/parametrized/transformation/as_rendered.rb +100 -0
  179. data/lib/aws/templates/utils/parametrized/transformation/as_string.rb +39 -0
  180. data/lib/aws/templates/utils/parametrized/transformation/dsl.rb +94 -0
  181. data/lib/aws/templates/utils/recursive.rb +22 -0
  182. data/spec/aws/templates/artifact_spec.rb +10 -10
  183. data/spec/aws/templates/cli_spec.rb +83 -0
  184. data/spec/aws/templates/composite_spec.rb +6 -4
  185. data/spec/aws/templates/help/rdoc/artifact_spec.rb +94 -0
  186. data/spec/aws/templates/help/rdoc/composite_spec.rb +53 -0
  187. data/spec/aws/templates/help/rdoc/parametrized/constraints/all_of_spec.rb +17 -0
  188. data/spec/aws/templates/help/rdoc/parametrized/constraints/depends_on_value_spec.rb +21 -0
  189. data/spec/aws/templates/help/rdoc/parametrized/constraints/enum_spec.rb +17 -0
  190. data/spec/aws/templates/help/rdoc/parametrized/constraints/matches_spec.rb +17 -0
  191. data/spec/aws/templates/help/rdoc/parametrized/constraints/satisfies_condition_spec.rb +17 -0
  192. data/spec/aws/templates/help/rdoc/parametrized/transformations/as_boolean_spec.rb +17 -0
  193. data/spec/aws/templates/help/rdoc/parametrized/transformations/as_chain_spec.rb +17 -0
  194. data/spec/aws/templates/help/rdoc/parametrized/transformations/as_hash_spec.rb +72 -0
  195. data/spec/aws/templates/help/rdoc/parametrized/transformations/as_integer_spec.rb +17 -0
  196. data/spec/aws/templates/help/rdoc/parametrized/transformations/as_list_spec.rb +39 -0
  197. data/spec/aws/templates/help/rdoc/parametrized/transformations/as_module_spec.rb +17 -0
  198. data/spec/aws/templates/help/rdoc/parametrized/transformations/as_object_spec.rb +38 -0
  199. data/spec/aws/templates/help/rdoc/parametrized/transformations/as_rendered_spec.rb +17 -0
  200. data/spec/aws/templates/render/utils/base_type_views_spec.rb +9 -11
  201. data/spec/aws/templates/render_spec.rb +1 -1
  202. data/spec/aws/templates/utils/as_named_spec.rb +0 -2
  203. data/spec/aws/templates/utils/autoload_spec.rb +14 -0
  204. data/spec/aws/templates/utils/contextualized_spec.rb +5 -5
  205. data/spec/aws/templates/utils/late_bound_spec.rb +2 -2
  206. data/spec/aws/templates/utils/parametrized/constraint_spec.rb +8 -10
  207. data/spec/aws/templates/utils/parametrized/getters_spec.rb +6 -7
  208. data/spec/aws/templates/utils/parametrized/transformation_spec.rb +3 -6
  209. data/spec/aws/templates/utils/parametrized_spec.rb +9 -10
  210. data/spec/aws/templates/utils_spec.rb +18 -0
  211. data/spec/test_empty/stuff.rb +4 -0
  212. data/spec/test_empty/stuff/here/test.rb +9 -0
  213. metadata +235 -19
  214. data/lib/aws/templates/exceptions.rb +0 -221
  215. data/lib/aws/templates/render/registry.rb +0 -60
  216. data/lib/aws/templates/utils/contextualized/filters.rb +0 -437
  217. data/lib/aws/templates/utils/contextualized/hash.rb +0 -13
  218. data/lib/aws/templates/utils/contextualized/nil.rb +0 -13
  219. data/lib/aws/templates/utils/contextualized/proc.rb +0 -13
  220. data/lib/aws/templates/utils/dependency/enumerable.rb +0 -13
  221. data/lib/aws/templates/utils/dependency/object.rb +0 -46
  222. data/lib/aws/templates/utils/parametrized/constraints.rb +0 -423
  223. data/lib/aws/templates/utils/parametrized/getters.rb +0 -293
  224. data/lib/aws/templates/utils/parametrized/guarded.rb +0 -32
  225. data/lib/aws/templates/utils/parametrized/transformations.rb +0 -652
@@ -1,293 +0,0 @@
1
- require 'aws/templates/exceptions'
2
- require 'aws/templates/utils/parametrized'
3
- require 'singleton'
4
-
5
- module Aws
6
- module Templates
7
- module Utils
8
- module Parametrized #:nodoc:
9
- ##
10
- # Getter functor class
11
- #
12
- # A getter is a Proc without parameters and it is expected to return
13
- # a value. Since the proc is to be executed in instance context
14
- # the value can be calculated based on other methods or extracted from
15
- # options attrribute
16
- #
17
- # The class implements functor pattern through to_proc method and
18
- # closure. Essentially, all getters can be used everywhere where
19
- # a block is expected.
20
- #
21
- # It provides protected method get which should be overriden in
22
- # all concrete getter classes.
23
- class Getter
24
- ##
25
- # Get parameter from instance variables as is
26
- #
27
- # Gets value from instance variable by parameter's name without
28
- # any other operations performed.
29
- #
30
- # === Example
31
- #
32
- # class Piece
33
- # include Aws::Templates::Utils::Parametrized
34
- #
35
- # parameter :param1, getter: as_instance_variable
36
- #
37
- # def initialize(x)
38
- # @param1 = x
39
- # end
40
- # end
41
- #
42
- # i = Piece.new(3)
43
- # i.param1 # => 3
44
- class AsInstanceVariable < Getter
45
- include Singleton
46
-
47
- protected
48
-
49
- def get(parameter, instance)
50
- instance.instance_variable_get("@#{parameter.name}")
51
- end
52
- end
53
-
54
- ##
55
- # Get options value "as is"
56
- #
57
- # Gets value from options attribute by parameter's name without
58
- # any other operations performed.
59
- #
60
- # === Example
61
- #
62
- # class Piece
63
- # include Aws::Templates::Utils::Parametrized
64
- #
65
- # parameter :param1, :getter => as_is
66
- # end
67
- #
68
- # i = Piece.new(:param1 => 3)
69
- # i.param1 # => 3
70
- class AsIs < Getter
71
- include Singleton
72
-
73
- protected
74
-
75
- def get(parameter, instance)
76
- instance.options[parameter.name]
77
- end
78
- end
79
-
80
- ##
81
- # Lookup value in options by path
82
- #
83
- # Looks up value from options attribute by specified path. The path
84
- # can be either statically specified or a block can be provided.
85
- # The block shouldn't have parameters and should return an array
86
- # containing path. The block will be executed in the instance context.
87
- #
88
- # === Example
89
- #
90
- # class Piece
91
- # include Aws::Templates::Utils::Parametrized
92
- #
93
- # parameter :param1, :getter => path(:a, :b)
94
- # end
95
- #
96
- # i = Piece.new(:a => { :b => 3 })
97
- # i.param1 # => 3
98
- class Path < Getter
99
- attr_reader :path
100
-
101
- def initialize(path)
102
- unless path.respond_to?(:to_proc) || path.respond_to?(:to_a)
103
- raise ArgumentError.new(
104
- "Path can be either array or Proc: #{path.inspect}"
105
- )
106
- end
107
-
108
- @path = path
109
- end
110
-
111
- protected
112
-
113
- def get(_, instance)
114
- if path.respond_to?(:to_proc)
115
- instance.options[*instance.instance_eval(&path)]
116
- elsif path.respond_to?(:to_a)
117
- instance.options[*path]
118
- end
119
- end
120
- end
121
-
122
- ##
123
- # Calculate value
124
- #
125
- # If a block is specified, it will be executed in the instance
126
- # context and return will be used as parameter value. If a value
127
- # specified then it will be used as parameter value instead.
128
- #
129
- # === Example
130
- #
131
- # class Piece
132
- # include Aws::Templates::Utils::Parametrized
133
- #
134
- # parameter :param1, :getter => value(1)
135
- # parameter :param2, :getter => value { options[:z] + 1 }
136
- # end
137
- #
138
- # i = Piece.new(:z => 3)
139
- # i.param2 # => 4
140
- # i.param1 # => 1
141
- class Value < Getter
142
- attr_reader :calculation
143
-
144
- def initialize(calculation)
145
- @calculation = calculation
146
- end
147
-
148
- protected
149
-
150
- def get(_, instance)
151
- if calculation.respond_to?(:to_hash)
152
- calculation
153
- elsif calculation.respond_to?(:to_proc)
154
- instance.instance_eval(&calculation)
155
- else
156
- calculation
157
- end
158
- end
159
- end
160
-
161
- ##
162
- # Pick one of non-nil values returned by nested getters
163
- #
164
- # In general it plays the same role as || operator in Ruby. It
165
- # just picks first non-nil value returned by a list of getters
166
- #
167
- # === Example
168
- #
169
- # class Piece
170
- # include Aws::Templates::Utils::Parametrized
171
- #
172
- # parameter :param1, :getter => one_of(
173
- # path(:a, :b),
174
- # path(:b, :c)
175
- # )
176
- # end
177
- #
178
- # i = Piece.new( :a => { :b => 3 } )
179
- # i.param1 # => 3
180
- # i = Piece.new( :b => { :c => 4 } )
181
- # i.param1 # => 4
182
- class OneOf < Getter
183
- attr_reader :getters
184
-
185
- def initialize(getters)
186
- @getters = getters
187
- end
188
-
189
- protected
190
-
191
- def get(parameter, instance)
192
- getters.inject(nil) do |value, g|
193
- value = instance.instance_exec(parameter, &g)
194
- break value unless value.nil?
195
- end
196
- end
197
- end
198
-
199
- ##
200
- # Creates closure with getter invocation
201
- #
202
- # It's an interface method required for Getter to expose
203
- # functor properties. It encloses invocation of Getter get_wrapper
204
- # method into a closure. The closure itself is executed in the context
205
- # of Parametrized instance which provides proper set "self" variable.
206
- #
207
- # The closure itself accepts 1 parameters
208
- # * +parameter+ - the Parameter object which the getter is executed for
209
- # ...where instance is assumed from self
210
- def to_proc
211
- getter = self
212
-
213
- lambda do |parameter|
214
- getter.get_wrapper(parameter, self)
215
- end
216
- end
217
-
218
- ##
219
- # Wraps getter-dependent method
220
- #
221
- # It wraps constraint-dependent "get" method into a rescue block
222
- # to standardize exception type and information provided by failed
223
- # value calculation
224
- # * +parameter+ - the Parameter object which the getter is executed for
225
- # * +instance+ - the instance value is taken from
226
- def get_wrapper(parameter, instance)
227
- get(parameter, instance)
228
- rescue StandardError
229
- raise NestedParameterException.new(parameter)
230
- end
231
-
232
- protected
233
-
234
- ##
235
- # Getter method
236
- #
237
- # * +parameter+ - the Parameter object which the getter is executed for
238
- # * +instance+ - the instance value is taken from
239
- def get(parameter, instance); end
240
- end
241
-
242
- ##
243
- # Syntax sugar for getters definition
244
- #
245
- # It injects the methods as class-scope methods into mixing classes.
246
- # The methods are factories to create particular type of getter
247
- class_scope do
248
- ##
249
- # Get parameter from instance variables as is
250
- #
251
- # alias for AsInstanceVariable class
252
- def as_instance_variable
253
- Getter::AsInstanceVariable.instance
254
- end
255
-
256
- ##
257
- # Get parameter from Options as is
258
- #
259
- # alias for AsIs class
260
- def as_is
261
- Getter::AsIs.instance
262
- end
263
-
264
- ##
265
- # Calculate value of parameter
266
- #
267
- # alias for Value class
268
- def value(v = nil, &blk)
269
- Getter::Value.new(v.nil? ? blk : v)
270
- end
271
-
272
- ##
273
- # Look up value of the parameter with path
274
- #
275
- # alias for Path class
276
- def path(*v, &blk)
277
- Getter::Path.new(
278
- v.empty? ? blk : v
279
- )
280
- end
281
-
282
- ##
283
- # Choose one non-nil value from nested getters
284
- #
285
- # alias for OneOf class
286
- def one_of(*getters)
287
- Getter::OneOf.new(getters)
288
- end
289
- end
290
- end
291
- end
292
- end
293
- end
@@ -1,32 +0,0 @@
1
- require 'set'
2
-
3
- module Aws
4
- module Templates
5
- module Utils
6
- module Parametrized
7
- ##
8
- # Remember Alan Turing's halting problem and don't believe in miracles. The method will
9
- # only work with parameters because they are supposed to be pure unmodifying functions.
10
- # Hence we can terminate if a parameter method was invoked twice in the stack with the same
11
- # context.
12
- module Guarded
13
- Call = Struct.new(:instance, :parameter)
14
-
15
- def guarded_get(instance, parameter_object)
16
- current_call = Call.new(instance, parameter_object)
17
- return unless trace.add?(current_call)
18
- ret = parameter_object.get(self)
19
- trace.delete(current_call)
20
- ret
21
- end
22
-
23
- private
24
-
25
- def trace
26
- Thread.current[Guarded.name] ||= Set.new
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,652 +0,0 @@
1
- require 'aws/templates/exceptions'
2
- require 'aws/templates/utils/parametrized'
3
- require 'aws/templates/utils/parametrized/nested'
4
- require 'singleton'
5
-
6
- module Aws
7
- module Templates
8
- module Utils
9
- module Parametrized #:nodoc:
10
- ##
11
- # Transformation functor class
12
- #
13
- # A transformation is a Proc accepting input value and providing output
14
- # value which is expected to be a transformation of the input.
15
- # The proc is executed in instance context so instance methods can
16
- # be used for calculation.
17
- #
18
- # The class implements functor pattern through to_proc method and
19
- # closure. Essentially, all transformations can be used everywhere where
20
- # a block is expected.
21
- #
22
- # It provides protected method transform which should be overriden in
23
- # all concrete transformation classes.
24
- class Transformation
25
- ##
26
- # Apply several transformation sequentially
27
- #
28
- # Useful when a few transformations need to be applied to a single value to get
29
- # the final result
30
- #
31
- # === Example
32
- #
33
- # class Piece
34
- # include Aws::Templates::Utils::Parametrized
35
- #
36
- # parameter :param,
37
- # transform: as_chain(
38
- # as_hash,
39
- # as_object(Aws::Templates::Utils::AsNamed)
40
- # )
41
- # end
42
- #
43
- # i = Piece.new(param: [:name, 'Rex'])
44
- # i.param.name # => 'Rex'
45
- class AsChain < Transformation
46
- attr_reader :components
47
-
48
- def initialize(components)
49
- @components = _check_components(components)
50
- end
51
-
52
- protected
53
-
54
- def transform(parameter, value, instance)
55
- return if value.nil?
56
- components.inject(value) { |acc, elem| instance.instance_exec(parameter, acc, &elem) }
57
- end
58
-
59
- private
60
-
61
- def _check_components(components)
62
- result = components.to_a
63
-
64
- invalid_components = result.reject { |component| component.respond_to?(:to_proc) }
65
- raise "Invalid components: #{invalid_components}" unless invalid_components.empty?
66
-
67
- result
68
- end
69
- end
70
-
71
- ##
72
- # Transform input value into the object
73
- #
74
- # Input value can be either hash or object. The transformation performs
75
- # nested object evaluation recusrsively as the input were Parametrized
76
- # instance. As a parameter for the transformation you can
77
- # specify either Module which mixes in Parametrized or to use
78
- # a block which is to be evaluated as a part of Parametrized definition
79
- # or both.
80
- #
81
- # With as_object transformation you can have as many nested levels
82
- # as it's needed.
83
- #
84
- # === Example
85
- #
86
- # class Piece
87
- # include Aws::Templates::Utils::Parametrized
88
- #
89
- # parameter :param1,
90
- # :transform => as_object(Aws::Templates::Utils::AsNamed)
91
- # parameter :param2, :transform => as_object {
92
- # parameter :id, :description => 'Just ID',
93
- # :constraint => not_nil
94
- # }
95
- # parameter :param3,
96
- # :transform => as_object(Aws::Templates::Utils::AsNamed) {
97
- # parameter :path, :description => 'Just path',
98
- # :constraint => not_nil
99
- # }
100
- # end
101
- #
102
- # i = Piece.new
103
- # i.param1 # => nil
104
- # i = Piece.new(:param1 => {:name => 'Zed'})
105
- # i.param1.name # => 'Zed'
106
- # i = Piece.new(:param2 => {:id => 123})
107
- # i.param2.id # => 123
108
- # i = Piece.new(:param3 => {:path => 'a/b', :name => 'Rex'})
109
- # i.param3.path # => 'a/b'
110
- # i.param3.name # => 123
111
- class AsObject < Transformation
112
- attr_reader :klass
113
-
114
- def initialize(scope, klass = nil, &definition)
115
- @klass = if klass.nil?
116
- Nested.create_class(scope)
117
- elsif klass.is_a?(Class)
118
- klass
119
- elsif klass.is_a?(Module)
120
- Nested.create_class(scope).with(klass)
121
- else
122
- raise "#{klass} is neither a class nor a module"
123
- end
124
-
125
- @klass.class_eval(&definition) unless definition.nil?
126
- end
127
-
128
- protected
129
-
130
- def transform(_, value, instance)
131
- return if value.nil?
132
- klass.new(instance, value)
133
- end
134
- end
135
-
136
- ##
137
- # Transform input value into a list
138
- #
139
- # Input value can be either an array or something which implements
140
- # to_a method standard semantics. Each list entry is evaluated
141
- # with specified constraints and transformations.
142
- #
143
- # With as_list transformation you can have as many nested levels
144
- # as it's needed in terms of nested lists or nested objects.
145
- #
146
- # === Example
147
- #
148
- # class Piece
149
- # include Aws::Templates::Utils::Parametrized
150
- #
151
- # parameter :param1, :transform => as_list(
152
- # # alias for all elements. Plays a role during introspection
153
- # :name => :element,
154
- # # description of what the element represents
155
- # :description => 'List element',
156
- # # constraint for list element
157
- # :constraint => not_nil
158
- # )
159
- # parameter :param2, :transform => as_list(
160
- # :name => :element,
161
- # :description => 'List element',
162
- # :transform => as_list( # nested list
163
- # :name => :sub_element,
164
- # :description => 'Sub-list element',
165
- # :constraint => not_nil
166
- # )
167
- # )
168
- # parameter :param3, :transform => as_list(
169
- # :name => :particle,
170
- # :description => 'Small particle',
171
- # :transform => as_object( # nested object
172
- # Aws::Templates::Utils::AsNamed
173
- # )
174
- # )
175
- # end
176
- #
177
- # i = Piece.new(:param1 => [1,2,3])
178
- # i.param1 # => [1,2,3]
179
- # i = Piece.new(:param1 => [1,nil,3])
180
- # i.param1 # throws exception
181
- # i = Piece.new(:param2 => [[1],[2],[3]])
182
- # i.param2 # => [[1],[2],[3]]
183
- # i = Piece.new(:param2 => [1,[2],[3]])
184
- # i.param2 # throws exception
185
- # i = Piece.new(:param2 => [[1],[nil],[3]])
186
- # i.param2 # throws exception
187
- # i = Piece.new(:param3 => [{:name => 'Zed'}])
188
- # i.param3.first.name # => 'Zed'
189
- class AsList < Transformation
190
- attr_reader :sub_parameter
191
-
192
- def initialize(klass = nil, options = nil)
193
- return if options.nil?
194
-
195
- @sub_parameter = Parameter.new(
196
- options[:name],
197
- klass,
198
- description: options[:description],
199
- transform: options[:transform],
200
- constraint: options[:constraint]
201
- )
202
- end
203
-
204
- protected
205
-
206
- def transform(parameter, value, instance)
207
- return if value.nil?
208
-
209
- unless value.respond_to?(:to_a)
210
- raise "#{parameter.name} is assigned to " \
211
- "#{value.inspect} which is not a list"
212
- end
213
-
214
- if sub_parameter
215
- value.to_a.map { |el| sub_parameter.process_value(instance, el) }
216
- else
217
- value.to_a
218
- end
219
- end
220
- end
221
-
222
- ##
223
- # Transform value with the specified render
224
- #
225
- # Input value can be anything which could be rendered by the
226
- # specified render type. Returned value is rendered input.
227
- #
228
- # The transformation is useful when you have a document of some
229
- # format embedded into a document of another format. An example
230
- # could be Bash scripts embedded into AWS CFN template.
231
- #
232
- # === Example
233
- #
234
- # class Brush
235
- # attr_reader :color
236
- # attr_reader :thickness
237
- # attr_reader :type
238
- #
239
- # def initialize(c, thick, t)
240
- # @c = c
241
- # @thick = thick
242
- # @t = t
243
- # end
244
- # end
245
- #
246
- # class Circle
247
- # attr_reader :radius
248
- # attr_reader :brush
249
- #
250
- # def initialize(r, b)
251
- # @radius = r
252
- # @brush = b
253
- # end
254
- # end
255
- #
256
- # class Piece
257
- # include Aws::Templates::Utils::Parametrized
258
- #
259
- # parameter :picture, :transform => as_rendered(
260
- # # Render Type
261
- # Graphics::Renders::JPEG,
262
- # # parameter section for the render
263
- # format: :base64
264
- # )
265
- # end
266
- #
267
- # i = Piece.new(picture: Circle.new(10, Brush.new(:red, 2, :dots)))
268
- # i.picture # => <rendered representation>
269
- class AsRendered < Transformation
270
- attr_reader :type
271
- attr_reader :parameters
272
-
273
- def initialize(render_type, params)
274
- @type = _check_render_type(render_type)
275
- @parameters = params
276
- end
277
-
278
- protected
279
-
280
- def transform(_, value, instance)
281
- return if value.nil?
282
- type.view_for(value, _compute_render_parameters(instance)).to_rendered
283
- end
284
-
285
- private
286
-
287
- def _check_render_type(render_type)
288
- unless render_type.respond_to?(:view_for)
289
- raise(
290
- "Wrong render type object #{params}. " \
291
- 'The instance should have #view_for method.'
292
- )
293
- end
294
-
295
- render_type
296
- end
297
-
298
- def _compute_render_parameters(instance)
299
- return if parameters.nil?
300
-
301
- if parameters.respond_to?(:to_hash)
302
- parameters
303
- elsif parameters.respond_to?(:to_proc)
304
- instance.instance_exec(&parameters)
305
- else
306
- parameters
307
- end
308
- end
309
- end
310
-
311
- ##
312
- # Convert input into integer
313
- #
314
- # Input value can be anything implementing :to_i method.
315
- #
316
- # === Example
317
- #
318
- # class Piece
319
- # include Aws::Templates::Utils::Parametrized
320
- #
321
- # parameter :param, :transform => as_integer
322
- # end
323
- #
324
- # i = Piece.new
325
- # i.param # => nil
326
- # i = Piece.new(:param => '23')
327
- # i.param # => 23
328
- class AsInteger < Transformation
329
- include Singleton
330
-
331
- protected
332
-
333
- def transform(_, value, _)
334
- return if value.nil?
335
- Integer(value)
336
- end
337
- end
338
-
339
- ##
340
- # Convert input into string
341
- #
342
- # Input value can be anything implementing :to_s method.
343
- #
344
- # === Example
345
- #
346
- # class Piece
347
- # include Aws::Templates::Utils::Parametrized
348
- #
349
- # parameter :param, :transform => as_string
350
- # end
351
- #
352
- # i = Piece.new
353
- # i.param # => nil
354
- # i = Piece.new(:param => 23)
355
- # i.param # => '23'
356
- class AsString < Transformation
357
- include Singleton
358
-
359
- protected
360
-
361
- def transform(_, value, _)
362
- return if value.nil?
363
- String(value)
364
- end
365
- end
366
-
367
- ##
368
- # Convert input into boolean
369
- #
370
- # Input value can be anything implementing :to_s method. Value considered false if it is:
371
- # * +'false' as a string+
372
- # * +FalseClass+
373
- # Otherwise, value is true. If value is nil, it won't be replaced by "false"
374
- #
375
- # === Example
376
- #
377
- # class Piece
378
- # include Aws::Templates::Utils::Parametrized
379
- #
380
- # parameter :param, :transform => as_boolean
381
- # end
382
- #
383
- # i = Piece.new
384
- # i.param # => false
385
- # i = Piece.new(:param => 0)
386
- # i.param # => true
387
- class AsBoolean < Transformation
388
- include Singleton
389
-
390
- protected
391
-
392
- def transform(_, value, _)
393
- return if value.nil?
394
- !value.to_s.casecmp('false').zero?
395
- end
396
- end
397
-
398
- ##
399
- # Convert input into hash
400
- #
401
- # Input value can be anything implementing :to_hash method.
402
- #
403
- # === Example
404
- #
405
- # class Piece
406
- # include Aws::Templates::Utils::Parametrized
407
- #
408
- # parameter :param, :transform => as_hash
409
- # parameter :param2,
410
- # transform: as_hash {
411
- # value name: :number,
412
- # description: 'Number',
413
- # constraint: not_nil,
414
- # transform: as_integer
415
- # }
416
- # end
417
- #
418
- # i = Piece.new
419
- # i.param # => nil
420
- # i = Piece.new(:param => [[1,2]])
421
- # i.param # => {1=>2}
422
- # i = Piece.new(:param2 => [[1,'3']])
423
- # i.param # => {1=>3}
424
- class AsHash < Transformation
425
- include Parametrized.class_scope
426
-
427
- def key(opts)
428
- @key_parameter = _create_parameter(opts)
429
- end
430
-
431
- def value(opts)
432
- @value_parameter = _create_parameter(opts)
433
- end
434
-
435
- def initialize(klass = nil, &blk)
436
- @klass = klass
437
- instance_eval(&blk) if blk
438
- end
439
-
440
- protected
441
-
442
- def transform(_, value, instance)
443
- return if value.nil?
444
-
445
- Hash[
446
- Hash[value].map do |k, v|
447
- [
448
- _process_value(@key_parameter, instance, k),
449
- _process_value(@value_parameter, instance, v)
450
- ]
451
- end
452
- ]
453
- end
454
-
455
- def _process_value(parameter, instance, value)
456
- return value if parameter.nil?
457
- parameter.process_value(instance, value)
458
- end
459
-
460
- private
461
-
462
- def _create_parameter(opts)
463
- Parameter.new(
464
- opts[:name],
465
- @klass,
466
- description: opts[:description],
467
- transform: opts[:transform],
468
- constraint: opts[:constraint]
469
- )
470
- end
471
- end
472
-
473
- ##
474
- # Convert to a Ruby class
475
- #
476
- # The transformation allows to use elements of metaprogramming in the framework. It
477
- # tries to transform passed value to a Ruby class.
478
- #
479
- # === Example
480
- #
481
- # class Piece
482
- # include Aws::Templates::Utils::Parametrized
483
- #
484
- # parameter :param, :transform => as_module
485
- # end
486
- #
487
- # i = Piece.new
488
- # i.param # => nil
489
- # i = Piece.new(:param => 'Object')
490
- # i.param # => Object
491
- class AsModule < Transformation
492
- include Singleton
493
-
494
- protected
495
-
496
- def transform(_, value, _)
497
- return if value.nil?
498
- return value if value.is_a?(Module)
499
- return _lookup(value.to_s) if value.respond_to?(:to_s)
500
- raise "#{value} can't be transformed to a class"
501
- end
502
-
503
- private
504
-
505
- PATH_REGEXP = Regexp.compile('::|[.]|/')
506
-
507
- def _lookup(class_name)
508
- target = class_name.split(PATH_REGEXP)
509
- .inject(::Kernel) { |acc, elem| acc.const_get(elem) }
510
-
511
- raise "#{class_name} == #{target} which is not a class" unless target.is_a?(Module)
512
-
513
- target
514
- end
515
- end
516
-
517
- ##
518
- # Creates closure with transformation invocation
519
- #
520
- # It's an interface method required for Transformation to expose
521
- # functor properties. It encloses invocation of Transformation
522
- # transform_wrapper method into a closure. The closure itself is
523
- # executed in the context of Parametrized instance which provides
524
- # proper set "self" variable.
525
- #
526
- # The closure itself accepts 2 parameters:
527
- # * +parameter+ - the Parameter object which the transformation
528
- # will be performed for
529
- # * +value+ - parameter value to be transformed
530
- # ...where instance is assumed from self
531
- def to_proc
532
- transform = self
533
-
534
- lambda do |parameter, value|
535
- transform.transform_wrapper(parameter, value, self)
536
- end
537
- end
538
-
539
- ##
540
- # Wraps transformation-dependent method
541
- #
542
- # It wraps constraint-dependent "transform" method into a rescue block
543
- # to standardize exception type and information provided by failed
544
- # transformation calculation
545
- # * +parameter+ - the Parameter object which the transformation will
546
- # be performed for
547
- # * +value+ - parameter value to be transformed
548
- # * +instance+ - the instance value is transform
549
- def transform_wrapper(parameter, value, instance)
550
- transform(parameter, value, instance)
551
- rescue StandardError
552
- raise NestedParameterException.new(parameter)
553
- end
554
-
555
- protected
556
-
557
- ##
558
- # Transform method
559
- #
560
- # * +parameter+ - the Parameter object which the transformation is
561
- # performed for
562
- # * +value+ - parameter value to be transformed
563
- # * +instance+ - the instance value is transform
564
- def transform(parameter, value, instance); end
565
- end
566
-
567
- ##
568
- # Syntax sugar for transformations definition
569
- #
570
- # It injects the methods as class-scope methods into mixing classes.
571
- # The methods are factories to create particular type of transformation
572
- class_scope do
573
- ##
574
- # Chain a few transformations into a single one
575
- #
576
- # alias for AsChain class
577
- def as_chain(*components)
578
- Transformation::AsChain.new(components)
579
- end
580
-
581
- ##
582
- # Transform the value into an object
583
- #
584
- # alias for AsObject class
585
- def as_object(klass = nil, &definition)
586
- Transformation::AsObject.new(self, klass, &definition)
587
- end
588
-
589
- ##
590
- # Transform the value into a list
591
- #
592
- # alias for AsList class
593
- def as_list(parameters = nil)
594
- Transformation::AsList.new(self, parameters)
595
- end
596
-
597
- ##
598
- # Transform value with the specified render
599
- #
600
- # alias for AsRendered class
601
- def as_rendered(render_type, params = nil, &params_block)
602
- Transformation::AsRendered.new(render_type, params || params_block)
603
- end
604
-
605
- ##
606
- # Convert input into integer
607
- #
608
- # alias for AsInteger class
609
- def as_integer
610
- Transformation::AsInteger.instance
611
- end
612
-
613
- ##
614
- # Convert input into string
615
- #
616
- # alias for AsString class
617
- def as_string
618
- Transformation::AsString.instance
619
- end
620
-
621
- ##
622
- # Convert input into boolean
623
- #
624
- # alias for AsBoolean class
625
- def as_boolean
626
- Transformation::AsBoolean.instance
627
- end
628
-
629
- ##
630
- # Convert input into hash
631
- #
632
- # alias for AsHash class
633
- def as_hash(&blk)
634
- Transformation::AsHash.new(self, &blk)
635
- end
636
-
637
- ##
638
- # Convert input into a class
639
- #
640
- # alias for AsModule class
641
- def as_module
642
- Transformation::AsModule.instance
643
- end
644
- end
645
-
646
- class Nested #:nodoc:
647
- include Parametrized
648
- end
649
- end
650
- end
651
- end
652
- end