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,8 +1,4 @@
1
- require 'aws/templates/render'
2
- require 'aws/templates/render/view'
3
1
  require 'aws/templates/utils'
4
- require 'aws/templates/utils/dependency'
5
- require 'aws/templates/utils/options'
6
2
 
7
3
  module Aws
8
4
  module Templates
@@ -15,10 +11,11 @@ module Aws
15
11
  # specific types.
16
12
  module BaseTypeViews
17
13
  include Render
14
+ using Templates::Utils::Dependency::Refinements
18
15
 
19
16
  ##
20
17
  # Pass-through render
21
- class AsIs < BasicView
18
+ class AsIs < Render::BasicView
22
19
  def to_rendered
23
20
  instance.object
24
21
  end
@@ -26,7 +23,7 @@ module Aws
26
23
 
27
24
  ##
28
25
  # Convert to string
29
- class ToString < BasicView
26
+ class ToString < Render::BasicView
30
27
  def to_rendered
31
28
  instance.to_s
32
29
  end
@@ -36,11 +33,11 @@ module Aws
36
33
  # Convert to array
37
34
  #
38
35
  # Converts value to array and iteratively renders every element in it.
39
- class ToArray < BasicView
36
+ class ToArray < Render::BasicView
40
37
  def to_rendered
41
38
  instance
42
39
  .to_a
43
- .map { |element| render.view_for(element, parameters).to_rendered }
40
+ .map { |element| processed_for(element) }
44
41
  end
45
42
  end
46
43
 
@@ -48,9 +45,9 @@ module Aws
48
45
  # Convert to hash
49
46
  #
50
47
  # Converts value to hash and iteratively renders each key and value in it.
51
- class ToHash < BasicView
48
+ class ToHash < Render::BasicView
52
49
  def to_rendered
53
- _from(instance).map { |k, v| [_to_rendered(k), _to_rendered(v)] }.to_h
50
+ _from(instance).map { |k, v| [processed_for(k), processed_for(v)] }.to_h
54
51
  end
55
52
 
56
53
  private
@@ -62,15 +59,11 @@ module Aws
62
59
  instance.to_hash
63
60
  end
64
61
  end
65
-
66
- def _to_rendered(obj)
67
- render.view_for(obj, parameters).to_rendered
68
- end
69
62
  end
70
63
 
71
64
  ##
72
65
  # Convert to float
73
- class ToFloat < BasicView
66
+ class ToFloat < Render::BasicView
74
67
  def to_rendered
75
68
  instance.to_f
76
69
  end
@@ -78,7 +71,7 @@ module Aws
78
71
 
79
72
  ##
80
73
  # Convert to integer
81
- class ToInteger < BasicView
74
+ class ToInteger < Render::BasicView
82
75
  def to_rendered
83
76
  instance.to_i
84
77
  end
@@ -86,7 +79,7 @@ module Aws
86
79
 
87
80
  ##
88
81
  # Convert to boolean
89
- class ToBoolean < BasicView
82
+ class ToBoolean < Render::BasicView
90
83
  def to_rendered
91
84
  !instance.to_s.casecmp('false').zero?
92
85
  end
@@ -100,10 +93,10 @@ module Aws
100
93
  ::FalseClass => AsIs,
101
94
  ::NilClass => AsIs,
102
95
  ::Symbol => AsIs,
103
- Templates::Utils::Dependency => AsIs,
96
+ Aws::Templates::Utils::Dependency => AsIs,
104
97
  ::Array => ToArray,
105
98
  ::Hash => ToHash,
106
- Templates::Utils::Options => ToHash
99
+ Aws::Templates::Utils::Options => ToHash
107
100
  }.freeze
108
101
 
109
102
  ##
@@ -1,6 +1,4 @@
1
- require 'aws/templates/render'
2
- require 'aws/templates/utils/parametrized'
3
- require 'aws/templates/utils/dependency'
1
+ require 'aws/templates/utils'
4
2
 
5
3
  module Aws
6
4
  module Templates
@@ -29,7 +27,7 @@ module Aws
29
27
  #
30
28
  # Defines "depth" property which is used to control recursion depth during object
31
29
  # introspection.
32
- class InspectView < BasicView
30
+ class InspectView < Render::BasicView
33
31
  def depth
34
32
  (parameters.nil? ? Inspect.recursion_depth : Integer(parameters)) - 1
35
33
  end
@@ -1,7 +1,4 @@
1
- require 'aws/templates/render'
2
- require 'aws/templates/artifact'
3
- require 'aws/templates/utils/parametrized/nested'
4
- require 'aws/templates/utils/dependency'
1
+ require 'aws/templates/utils'
5
2
 
6
3
  module Aws
7
4
  module Templates
@@ -17,7 +14,7 @@ module Aws
17
14
 
18
15
  define_view(::Object) do
19
16
  def to_rendered
20
- instance.to_s
17
+ instance.class.name
21
18
  end
22
19
  end
23
20
 
@@ -1,112 +1,15 @@
1
+ require 'aws/templates/utils'
2
+
1
3
  module Aws
2
4
  module Templates
3
5
  module Render
4
- ##
5
- # Basic render view
6
- #
7
- # Views are classes encapsulating functionality of transforming
8
- # artifacts into domain-specific output. For instance, the same
9
- # LDAP record can be transformed into JSON description or LDIF definition.
10
- # Views can be attached to ancestors of an artifact and it expected
11
- # that the library will look-up the closest ancestor having view attached
12
- # if the render is invoked on a child.
13
- #
14
- # Each view is attached to a registry object which stores correspondence
15
- # between artifact classes and their views, and optionally to an artifact.
16
- # A view is registered in a registry only when it is attached to an artifact.
17
- # Views depend on artifacts but artifacts are not aware of views.
18
- # As the extreme case, a sole view can be attached to Artifact
19
- # if you have universal way to render your domain objects.
20
- #
21
- # Views are regular Ruby classes and all assumptions made about
22
- # polymorphism, inheritance and incapsulation are true for them.
23
- #
24
- # View class itself is an abstract class which can't be instantiated
25
- # directly.
26
- class BasicView
27
- ##
28
- # Render accessor
29
- #
30
- # Returns either render of this view class or render of any ancestor.
31
- def self.render
32
- @render || superclass.render
33
- end
34
-
35
- ##
36
- # Register the view class in a render
37
- #
38
- # Registers the view class in the render
39
- # * +r+ - render registrar
40
- def self.register_in(r)
41
- @render = r
42
- self
43
- end
44
-
45
- ##
46
- # Link the view class to the artifact class
47
- #
48
- # Registers the link in the render object of the view class.
49
- def self.artifact(artifact_class)
50
- render.register(artifact_class, self)
51
- self
52
- end
53
-
54
- ##
55
- # Artifact instance view object is attached to
56
- attr_reader :instance
57
-
58
- ##
59
- # Assigned view parameters
60
- attr_reader :parameters
61
-
62
- ##
63
- # Execute in the instance context
64
- #
65
- # Executed passed block in the context of the instance being rendered. It helps against
66
- # putting too much instance method accesses in long blocks. Returns the value returned by
67
- # the block.
68
- def in_instance(*args, &blk)
69
- instance.instance_exec(*args, &blk)
70
- end
71
-
72
- ##
73
- # Create view instance and link it to the artifact instance
74
- def initialize(obj, params = nil)
75
- @instance = obj
76
- @parameters = params
77
- end
78
-
79
- ##
80
- # Alias for class method render
81
- def render
82
- self.class.render
83
- end
84
-
85
- ##
86
- # Render the object
87
- #
88
- # Renders passed object with the view default render
89
- def rendered_for(obj, parameters_override = nil)
90
- render.view_for(obj, parameters_override.nil? ? parameters : parameters_override)
91
- .to_rendered
92
- end
93
-
94
- ##
95
- # Render the instance of the artifact
96
- #
97
- # The method should be overriden and return rendered form of the attached instance
98
- def to_rendered
99
- raise NotImplementedError.new('The method should be overriden')
100
- end
101
- end
102
-
103
6
  ##
104
7
  # Render view
105
8
  #
106
9
  # The class introduces additional stage called "prepare" where you can put prepared view
107
10
  # which will be additionally recursively rendered. Useful for complex views containing values
108
11
  # needed additional rendering so you don't need to invoke rendered_for.
109
- class View < BasicView
12
+ class View < Render::BasicView
110
13
  ##
111
14
  # Render the instance of the artifact
112
15
  #
@@ -1,18 +1,25 @@
1
- require 'aws/templates/exceptions'
1
+ require 'aws/templates/utils/autoload'
2
+ require 'facets/string/modulize'
2
3
 
3
4
  ##
4
- # Hash implements resursive concept
5
- class Hash
6
- def to_recursive
7
- self
5
+ # Utility methods for Module class
6
+ class Module
7
+ ##
8
+ # Get all ancestors which have "base" module as one of its' own ancestors
9
+ def ancestors_with(base)
10
+ ancestors.reverse_each.select { |mod| mod < base }
8
11
  end
9
12
  end
10
13
 
11
14
  module Aws
12
15
  module Templates
13
16
  ##
14
- # Variable utility functions used through the code
17
+ # Variable utility functions used through the code.
18
+ #
19
+ # Defines auxiliary functions set and serves as the namespace for the framework modules.
15
20
  module Utils
21
+ include Templates::Exception
22
+
16
23
  RECURSIVE_METHODS = %i[keys [] include?].freeze
17
24
 
18
25
  ##
@@ -95,19 +102,24 @@ module Aws
95
102
  ##
96
103
  # Recursively merge two "recursive" objects
97
104
  # PS: Yes I know that there is "merge" method for *hashes*.
98
- def self.merge(a, b)
99
- return hashify(b) unless Utils.recursive?(a) && Utils.recursive?(b)
100
- _merge_back(_merge_forward(a, b), b)
105
+ def self.merge(a, b, &blk)
106
+ unless Utils.recursive?(a) && Utils.recursive?(b)
107
+ return hashify(blk.nil? ? b : blk.call(a, b))
108
+ end
109
+
110
+ _merge_back(_merge_forward(a, b, blk), b)
101
111
  end
102
112
 
103
- def self._merge_forward(a, b)
113
+ def self._merge_forward(a, b, blk)
104
114
  a.keys.each_with_object({}) do |k, hsh|
105
- hsh[k] = b[k].nil? ? hashify(a[k]) : merge(a[k], b[k])
115
+ hsh[k] = b[k].nil? ? hashify(a[k]) : merge(a[k], b[k], &blk)
106
116
  end
107
117
  end
108
118
 
109
119
  def self._merge_back(result, b)
110
- b.keys.reject { |k| result.include?(k) }.each_with_object(result) { |k, res| res[k] = b[k] }
120
+ b.keys
121
+ .reject { |k| result.include?(k) }
122
+ .each_with_object(result) { |k, res| res[k] = hashify(b[k]) }
111
123
  end
112
124
 
113
125
  def self.hashify(v)
@@ -157,11 +169,11 @@ module Aws
157
169
  # we stop lookup and return nil if nil is encountered
158
170
  return if value.nil?
159
171
  # value was deleted in this layer
160
- raise OptionValueDeleted.new(path) if value == DELETED_MARKER
172
+ raise Exception::OptionValueDeleted.new(path) if value == DELETED_MARKER
161
173
  # we reached our target! returning it
162
174
  return value if path.nil? || path.empty?
163
175
  # we still have some part of path to traverse but scalar was found
164
- raise OptionScalarOnTheWay.new(value, path) if Utils.scalar?(value)
176
+ raise Exception::OptionScalarOnTheWay.new(value, path) if Utils.scalar?(value)
165
177
 
166
178
  _lookup_recursively(value, path.dup)
167
179
  end
@@ -194,7 +206,7 @@ module Aws
194
206
  last_key = path.pop
195
207
 
196
208
  last_branch = path.inject(container) do |obj, current_key|
197
- raise OptionScalarOnTheWay.new(obj, path) unless Utils.recursive?(obj)
209
+ raise Exception::OptionScalarOnTheWay.new(obj, path) unless Utils.recursive?(obj)
198
210
  if obj.include?(current_key)
199
211
  obj[current_key]
200
212
  else
@@ -222,6 +234,18 @@ module Aws
222
234
  end
223
235
  end
224
236
  end
237
+
238
+ PATH_REGEXP = Regexp.compile('::|[.]|/')
239
+
240
+ def self.lookup_module(str)
241
+ target = str.split(PATH_REGEXP)
242
+ .inject(::Object.lazy) { |acc, elem| acc.const_get(elem.modulize) }
243
+ .reduce
244
+
245
+ raise "#{str} == #{target} which is not a module" unless target.is_a?(Module)
246
+
247
+ target
248
+ end
225
249
  end
226
250
  end
227
251
  end
@@ -1,5 +1,4 @@
1
- require 'aws/templates/artifact'
2
- require 'set'
1
+ require 'aws/templates/utils'
3
2
 
4
3
  module Aws
5
4
  module Templates
@@ -100,7 +99,7 @@ module Aws
100
99
 
101
100
  def initialize
102
101
  @map = {}
103
- @set = Set.new
102
+ @set = ::Set.new
104
103
  end
105
104
 
106
105
  private
@@ -1,5 +1,4 @@
1
- require 'aws/templates/utils/parametrized'
2
- require 'aws/templates/utils/parametrized/constraints'
1
+ require 'aws/templates/utils'
3
2
 
4
3
  module Aws
5
4
  module Templates
@@ -10,7 +9,7 @@ module Aws
10
9
  # Provides a simple utility to define artifacts/objects which have
11
10
  # "name" parameter which should be present as :name in the input hash
12
11
  module AsNamed
13
- include Parametrized
12
+ include Aws::Templates::Utils::Parametrized
14
13
 
15
14
  parameter :name, description: 'Name of the object', constraint: not_nil
16
15
  end
@@ -0,0 +1,224 @@
1
+ require 'facets/string/pathize'
2
+ require 'facets/module/pathize'
3
+ require 'set'
4
+ require 'concurrent/map'
5
+
6
+ module Aws
7
+ module Templates
8
+ module Utils
9
+ ##
10
+ # Lazy load implementation
11
+ #
12
+ # It allows to skip 'require' definitions and load all classes and modules by convention.
13
+ module Autoload
14
+ REQUIRE_LOCKER = Concurrent::Map.new
15
+ MODULE_LOCKER = Concurrent::Map.new
16
+
17
+ Trace = TracePoint.new(:class) { |tp| Autoload.autoload!(tp.self) }
18
+
19
+ def self._try_to_require(path, mutex)
20
+ require path
21
+ rescue ScriptError, NoMemoryError, StandardError => e
22
+ REQUIRE_LOCKER.get_and_set(path, e)
23
+ raise e
24
+ ensure
25
+ mutex.unlock
26
+ end
27
+
28
+ def self._check_if_required(path, obj)
29
+ raise(obj) if obj.is_a?(::Exception)
30
+ return if obj.owned?
31
+
32
+ obj.lock.unlock
33
+ locker_obj = REQUIRE_LOCKER[path]
34
+ raise locker_obj if locker_obj.is_a?(Exception)
35
+ end
36
+
37
+ def self.atomic_require(path)
38
+ mutex = Mutex.new.lock
39
+
40
+ obj = REQUIRE_LOCKER.put_if_absent(path, mutex)
41
+
42
+ if obj.nil?
43
+ _try_to_require(path, mutex)
44
+ else
45
+ _check_if_required(path, obj)
46
+ end
47
+
48
+ true
49
+ end
50
+
51
+ def self.autoload!(mod)
52
+ return if mod.name.nil?
53
+
54
+ MODULE_LOCKER.compute_if_absent(mod) do
55
+ path = mod.pathize
56
+
57
+ begin
58
+ atomic_require path
59
+ rescue LoadError => e
60
+ sanitize_load_exception(e, path)
61
+ end
62
+
63
+ true
64
+ end
65
+ end
66
+
67
+ def self.const_path_for(mod, const_name)
68
+ raise ScriptError.new("Autoload is not supported for #{mod}") if mod.name.nil?
69
+
70
+ path = const_name.to_s.pathize
71
+
72
+ path = "#{mod.pathize}/#{path}" unless mod.root_namespace?
73
+
74
+ path
75
+ end
76
+
77
+ def self.sanitize_load_exception(e, path)
78
+ raise e unless e.path == path
79
+ end
80
+
81
+ def self.const_is_loaded?(mod, const_name)
82
+ const_path = Autoload.const_path_for(mod, const_name)
83
+
84
+ begin
85
+ atomic_require const_path
86
+ true
87
+ rescue LoadError => e
88
+ Autoload.sanitize_load_exception(e, const_path)
89
+ false
90
+ end
91
+ end
92
+
93
+ def const_missing(const_name)
94
+ super(const_name) unless Autoload.const_is_loaded?(self, const_name)
95
+
96
+ unless const_defined?(const_name)
97
+ raise NameError.new(
98
+ "::#{self}::#{const_name} is loaded but the constant is missing"
99
+ )
100
+ end
101
+
102
+ const_get(const_name)
103
+ end
104
+
105
+ def lazy
106
+ Lazy.new(self)
107
+ end
108
+
109
+ def reduce(_ = false)
110
+ self
111
+ end
112
+
113
+ def root_namespace?
114
+ (self == ::Kernel) || (self == ::Object)
115
+ end
116
+ end
117
+
118
+ ##
119
+ # Lazy module wrapper
120
+ #
121
+ # Allows to traverse non-existent modules up to the point when constant can be
122
+ # auto-discovered.
123
+ class Lazy < Module
124
+ def self.fail_on_method(method_name)
125
+ define_method(method_name) { |*params, &blk| raise_error(method_name, params, blk) }
126
+ end
127
+
128
+ def raise_error(method_name, params, blk)
129
+ raise NoMethodError.new(
130
+ "Lazy namespace #{self} doesn't support #{method_name}\n" \
131
+ " Parameters: #{params}\n" \
132
+ " Block: #{blk}"
133
+ )
134
+ end
135
+
136
+ fail_on_method :alias_method
137
+ fail_on_method :append_features
138
+ fail_on_method :attr
139
+ fail_on_method :attr_accessor
140
+ fail_on_method :attr_reader
141
+ fail_on_method :attr_writer
142
+ fail_on_method :autoload
143
+ fail_on_method :autoload?
144
+ fail_on_method :define_method
145
+ fail_on_method :extend_object
146
+ fail_on_method :extended
147
+ fail_on_method :include
148
+ fail_on_method :included
149
+ fail_on_method :method_added
150
+ fail_on_method :method_removed
151
+ fail_on_method :method_undefined
152
+ fail_on_method :prepend
153
+ fail_on_method :prepend_features
154
+ fail_on_method :prepended
155
+ fail_on_method :refine
156
+ fail_on_method :remove_method
157
+ fail_on_method :undef_method
158
+ fail_on_method :using
159
+
160
+ def method_missing(method_name, *params, &blk)
161
+ raise_error(method_name, params, blk)
162
+ super
163
+ end
164
+
165
+ def respond_to_missing?(*)
166
+ super
167
+ end
168
+
169
+ def const_missing(const_name)
170
+ Lazy.new(self, const_name)
171
+ end
172
+
173
+ def reduce(is_loaded = false)
174
+ return @parent.reduce if @short_name.nil?
175
+
176
+ @parent.reduce(is_loaded || Autoload.const_is_loaded?(@parent, @short_name))
177
+ .const_get(@short_name)
178
+ end
179
+
180
+ def to_s
181
+ name
182
+ end
183
+
184
+ def inspect
185
+ "#{name}(Lazy)"
186
+ end
187
+
188
+ def lazy
189
+ self
190
+ end
191
+
192
+ def name
193
+ return @parent.name if @short_name.nil?
194
+
195
+ if @parent.root_namespace?
196
+ @short_name.to_s
197
+ else
198
+ "#{@parent.name}::#{@short_name}"
199
+ end
200
+ end
201
+
202
+ def root_namespace?
203
+ @parent.root_namespace? && @short_name.nil?
204
+ end
205
+
206
+ def initialize(parent, short_name = nil)
207
+ raise ScriptError.new("#{parent} is not a module") unless parent.is_a?(Module)
208
+ @parent = parent
209
+ @short_name = short_name
210
+ end
211
+ end
212
+ end
213
+ end
214
+ end
215
+
216
+ ##
217
+ # Lazy load
218
+ #
219
+ # It allows to skip 'require' definitions and load all classes and modules by convention.
220
+ class Module
221
+ prepend Aws::Templates::Utils::Autoload
222
+ end
223
+
224
+ Aws::Templates::Utils::Autoload::Trace.enable