lono 6.1.11 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (240) hide show
  1. checksums.yaml +4 -4
  2. data/.cody/acceptance.sh +19 -3
  3. data/.gitignore +2 -2
  4. data/CHANGELOG.md +16 -1
  5. data/README.md +18 -20
  6. data/Rakefile +1 -0
  7. data/lib/lono.rb +7 -5
  8. data/lib/lono/abstract_base.rb +25 -0
  9. data/lib/lono/api/client.rb +30 -0
  10. data/lib/lono/api/proxy.rb +58 -0
  11. data/lib/lono/api/repos.rb +8 -0
  12. data/lib/lono/api/verify.rb +13 -0
  13. data/lib/lono/app_file/base.rb +4 -11
  14. data/lib/lono/app_file/build.rb +1 -1
  15. data/lib/lono/app_file/upload.rb +1 -4
  16. data/lib/lono/autoloader.rb +3 -1
  17. data/lib/lono/aws_services.rb +9 -9
  18. data/lib/lono/aws_services/helper.rb +14 -0
  19. data/lib/lono/aws_services/{util.rb → stack.rb} +1 -9
  20. data/lib/lono/aws_services/stack_set.rb +41 -0
  21. data/lib/lono/blueprint.rb +2 -2
  22. data/lib/lono/blueprint/configset/loader.rb +7 -0
  23. data/lib/lono/blueprint/helper.rb +8 -2
  24. data/lib/lono/blueprint/meta.rb +4 -12
  25. data/lib/lono/blueprint/new.rb +3 -3
  26. data/lib/lono/blueprint/root.rb +6 -26
  27. data/lib/lono/bundle.rb +54 -0
  28. data/lib/lono/cfn.rb +31 -75
  29. data/lib/lono/cfn/base.rb +39 -136
  30. data/lib/lono/cfn/cancel.rb +14 -9
  31. data/lib/lono/cfn/create.rb +15 -19
  32. data/lib/lono/cfn/delete.rb +9 -9
  33. data/lib/lono/cfn/deploy.rb +4 -4
  34. data/lib/lono/cfn/download.rb +27 -9
  35. data/lib/lono/cfn/opts.rb +80 -0
  36. data/lib/lono/cfn/preview/changeset.rb +23 -23
  37. data/lib/lono/cfn/preview/codediff.rb +5 -6
  38. data/lib/lono/cfn/preview/param.rb +10 -10
  39. data/lib/lono/cfn/rollback.rb +5 -5
  40. data/lib/lono/cfn/status.rb +0 -10
  41. data/lib/lono/cfn/update.rb +22 -27
  42. data/lib/lono/clean.rb +3 -3
  43. data/lib/lono/cli.rb +69 -34
  44. data/lib/lono/code.rb +22 -0
  45. data/lib/lono/command.rb +7 -0
  46. data/lib/lono/config_location.rb +6 -13
  47. data/lib/lono/configset.rb +9 -0
  48. data/lib/lono/configset/combiner.rb +128 -0
  49. data/lib/lono/configset/evaluate_file.rb +8 -0
  50. data/lib/lono/configset/list.rb +67 -0
  51. data/lib/lono/configset/loader.rb +98 -0
  52. data/lib/lono/configset/loader/dsl.rb +9 -0
  53. data/lib/lono/configset/materializer/final.rb +10 -0
  54. data/lib/lono/configset/materializer/gems_builder.rb +81 -0
  55. data/lib/lono/configset/materializer/jade.rb +15 -0
  56. data/lib/lono/configset/materializer/source.rb +54 -0
  57. data/lib/lono/configset/meta.rb +19 -0
  58. data/lib/lono/configset/meta/dsl.rb +12 -0
  59. data/lib/lono/configset/new.rb +84 -0
  60. data/lib/lono/configset/preparer.rb +44 -0
  61. data/lib/lono/configset/register/base.rb +121 -0
  62. data/lib/lono/configset/register/blueprint.rb +16 -0
  63. data/lib/lono/configset/register/dsl.rb +15 -0
  64. data/lib/lono/configset/register/project.rb +12 -0
  65. data/lib/lono/configset/registry.rb +34 -0
  66. data/lib/lono/configset/resolver.rb +42 -0
  67. data/lib/lono/conventions.rb +18 -7
  68. data/lib/lono/core.rb +16 -20
  69. data/lib/lono/default/settings.yml +2 -3
  70. data/lib/lono/ext/bundler.rb +7 -0
  71. data/lib/lono/file_uploader.rb +8 -5
  72. data/lib/lono/finder/base.rb +140 -0
  73. data/lib/lono/finder/blueprint.rb +11 -0
  74. data/lib/lono/finder/blueprint/configset.rb +17 -0
  75. data/lib/lono/finder/configset.rb +11 -0
  76. data/lib/lono/generate.rb +93 -0
  77. data/lib/lono/help/blueprint/new.md +0 -1
  78. data/lib/lono/help/cfn/delete.md +1 -1
  79. data/lib/lono/help/cfn/deploy.md +5 -76
  80. data/lib/lono/help/cfn/status.md +0 -4
  81. data/lib/lono/help/cfn/update.md +1 -1
  82. data/lib/lono/help/code/convert.md +51 -0
  83. data/lib/lono/help/code/import.md +30 -0
  84. data/lib/lono/help/configsets.md +24 -0
  85. data/lib/lono/help/generate.md +4 -4
  86. data/lib/lono/help/new.md +1 -2
  87. data/lib/lono/help/sets/delete.md +8 -0
  88. data/lib/lono/help/sets/deploy.md +76 -0
  89. data/lib/lono/help/sets/instances/delete.md +21 -0
  90. data/lib/lono/help/sets/instances/list.md +14 -0
  91. data/lib/lono/help/sets/instances/status.md +15 -0
  92. data/lib/lono/help/sets/instances/sync.md +88 -0
  93. data/lib/lono/help/sets/status.md +23 -0
  94. data/lib/lono/help/upgrade.md +1 -0
  95. data/lib/lono/importer.rb +22 -0
  96. data/lib/lono/importer/base.rb +59 -0
  97. data/lib/lono/importer/converter.rb +19 -0
  98. data/lib/lono/importer/download.rb +46 -0
  99. data/lib/lono/importer/dsl.rb +36 -0
  100. data/lib/lono/importer/erb.rb +31 -0
  101. data/lib/lono/importer/params.rb +56 -0
  102. data/lib/lono/importer/service/coder.rb +81 -0
  103. data/lib/lono/inspector/base.rb +12 -22
  104. data/lib/lono/inspector/graph.rb +1 -1
  105. data/lib/lono/inspector/summary.rb +41 -17
  106. data/lib/lono/jade.rb +103 -0
  107. data/lib/lono/jade/circular.rb +26 -0
  108. data/lib/lono/jadespec.rb +41 -0
  109. data/lib/lono/new.rb +2 -2
  110. data/lib/lono/opts.rb +43 -0
  111. data/lib/lono/output/template.rb +48 -0
  112. data/lib/lono/param.rb +3 -5
  113. data/lib/lono/param/generator.rb +13 -33
  114. data/lib/lono/pro.rb +15 -0
  115. data/lib/lono/pro/base.rb +16 -0
  116. data/lib/lono/pro/repo.rb +27 -0
  117. data/lib/lono/project_checker.rb +4 -29
  118. data/lib/lono/registration.rb +15 -0
  119. data/lib/lono/registration/base.rb +37 -0
  120. data/lib/lono/registration/check.rb +15 -0
  121. data/lib/lono/registration/temp.rb +60 -0
  122. data/lib/lono/registration/user.rb +54 -0
  123. data/lib/lono/script/base.rb +1 -10
  124. data/lib/lono/script/upload.rb +2 -12
  125. data/lib/lono/seed.rb +2 -11
  126. data/lib/lono/seed/base.rb +55 -110
  127. data/lib/lono/sets.rb +38 -0
  128. data/lib/lono/sets/base.rb +45 -0
  129. data/lib/lono/sets/create.rb +30 -0
  130. data/lib/lono/sets/delete.rb +47 -0
  131. data/lib/lono/sets/deploy.rb +11 -0
  132. data/lib/lono/sets/instances.rb +33 -0
  133. data/lib/lono/sets/instances/base.rb +30 -0
  134. data/lib/lono/sets/instances/delete.rb +69 -0
  135. data/lib/lono/sets/instances/list.rb +13 -0
  136. data/lib/lono/sets/instances/opts.rb +29 -0
  137. data/lib/lono/sets/instances/status.rb +12 -0
  138. data/lib/lono/sets/instances/sync.rb +182 -0
  139. data/lib/lono/sets/list.rb +35 -0
  140. data/lib/lono/sets/opts.rb +18 -0
  141. data/lib/lono/sets/preview/codediff.rb +35 -0
  142. data/lib/lono/sets/preview/param.rb +32 -0
  143. data/lib/lono/sets/status.rb +116 -0
  144. data/lib/lono/sets/status/instance.rb +20 -0
  145. data/lib/lono/sets/status/instance/base.rb +120 -0
  146. data/lib/lono/sets/status/instance/completed.rb +35 -0
  147. data/lib/lono/sets/status/instance/deleted.rb +32 -0
  148. data/lib/lono/sets/status/instance/show.rb +7 -0
  149. data/lib/lono/sets/status/instances.rb +111 -0
  150. data/lib/lono/sets/summarize.rb +20 -0
  151. data/lib/lono/sets/time_spent.rb +11 -0
  152. data/lib/lono/sets/update.rb +81 -0
  153. data/lib/lono/template.rb +5 -7
  154. data/lib/lono/template/configset_injector.rb +50 -0
  155. data/lib/lono/template/context.rb +4 -4
  156. data/lib/lono/template/context/loader.rb +4 -16
  157. data/lib/lono/template/evaluate.rb +2 -1
  158. data/lib/lono/template/generator.rb +17 -15
  159. data/lib/lono/template/helper.rb +7 -7
  160. data/lib/lono/template/post_processor.rb +2 -12
  161. data/lib/lono/template/strategy/base.rb +4 -0
  162. data/lib/lono/template/{dsl.rb → strategy/dsl.rb} +4 -6
  163. data/lib/lono/template/{dsl → strategy/dsl}/builder.rb +11 -15
  164. data/lib/lono/template/{dsl → strategy/dsl}/builder/fn.rb +1 -1
  165. data/lib/lono/template/strategy/dsl/builder/helpers.rb +11 -0
  166. data/lib/lono/template/strategy/dsl/builder/helpers/core_helper.rb +14 -0
  167. data/lib/lono/template/strategy/dsl/builder/helpers/file_helper.rb +48 -0
  168. data/lib/lono/template/strategy/dsl/builder/helpers/lookup_helper.rb +27 -0
  169. data/lib/lono/template/strategy/dsl/builder/helpers/s3_helper.rb +13 -0
  170. data/lib/lono/template/strategy/dsl/builder/helpers/tags_helper.rb +39 -0
  171. data/lib/lono/template/{dsl/builder → strategy/dsl/builder/section}/base.rb +6 -17
  172. data/lib/lono/template/{dsl/builder → strategy/dsl/builder/section}/condition.rb +1 -1
  173. data/lib/lono/template/strategy/dsl/builder/section/extensions.rb +9 -0
  174. data/lib/lono/template/{dsl/builder → strategy/dsl/builder/section}/mapping.rb +1 -1
  175. data/lib/lono/template/{dsl/builder/section_methods.rb → strategy/dsl/builder/section/methods.rb} +9 -2
  176. data/lib/lono/template/{dsl/builder → strategy/dsl/builder/section}/output.rb +1 -1
  177. data/lib/lono/template/strategy/dsl/builder/section/parameter.rb +69 -0
  178. data/lib/lono/template/{dsl/builder → strategy/dsl/builder/section}/resource.rb +1 -1
  179. data/lib/lono/template/{dsl/builder → strategy/dsl/builder/section}/resource/property_mover.rb +1 -1
  180. data/lib/lono/template/{dsl/builder → strategy/dsl/builder/section}/section.rb +1 -1
  181. data/lib/lono/template/{dsl → strategy/dsl}/builder/squeezer.rb +1 -1
  182. data/lib/lono/template/strategy/dsl/builder/stringify.rb +15 -0
  183. data/lib/lono/template/{dsl → strategy/dsl}/builder/syntax.rb +3 -2
  184. data/lib/lono/template/strategy/dsl/finalizer.rb +12 -0
  185. data/lib/lono/template/strategy/dsl/finalizer/parameter_groups.rb +56 -0
  186. data/lib/lono/template/{erb.rb → strategy/erb.rb} +5 -5
  187. data/lib/lono/template/strategy/source.rb +8 -0
  188. data/lib/lono/template/template.rb +1 -1
  189. data/lib/lono/template/upload.rb +4 -9
  190. data/lib/lono/template/util.rb +0 -40
  191. data/lib/lono/upgrade.rb +12 -10
  192. data/lib/lono/user_data.rb +4 -4
  193. data/lib/lono/utils/pretty_time.rb +14 -0
  194. data/lib/lono/utils/sure.rb +23 -0
  195. data/lib/lono/version.rb +1 -1
  196. data/lib/lono/yamler/loader.rb +52 -0
  197. data/lib/lono/yamler/validator.rb +51 -0
  198. data/lib/templates/blueprint/%blueprint_name%.gemspec.tt +4 -0
  199. data/lib/templates/blueprint/README.md.tt +1 -1
  200. data/lib/templates/blueprint/seed/configs.rb +2 -2
  201. data/lib/templates/blueprint_types/dsl/app/templates/%blueprint_name%.rb +17 -18
  202. data/lib/templates/blueprint_types/erb/app/templates/%blueprint_name%.yml +63 -4
  203. data/lib/templates/configset/%configset_name%.gemspec.tt +41 -0
  204. data/lib/templates/configset/.gitignore +11 -0
  205. data/lib/templates/configset/CHANGELOG.md +7 -0
  206. data/lib/templates/configset/Gemfile +4 -0
  207. data/lib/templates/configset/README.md.tt +3 -0
  208. data/lib/templates/configset/Rakefile.tt +9 -0
  209. data/lib/templates/configset/lib/configset.yml +20 -0
  210. data/lib/templates/skeleton/.gitignore +1 -0
  211. data/lib/templates/skeleton/Gemfile +0 -1
  212. data/lib/templates/skeleton/README.md +4 -4
  213. data/lib/templates/skeleton/configs/settings.yml +1 -1
  214. data/lono.gemspec +1 -4
  215. metadata +146 -79
  216. data/Guardfile +0 -19
  217. data/lib/lono/app_file.rb +0 -5
  218. data/lib/lono/blueprint/find.rb +0 -90
  219. data/lib/lono/blueprint/info.rb +0 -10
  220. data/lib/lono/blueprint/list.rb +0 -14
  221. data/lib/lono/cfn/current.rb +0 -95
  222. data/lib/lono/cfn/preview.rb +0 -4
  223. data/lib/lono/cfn/suffix.rb +0 -67
  224. data/lib/lono/cfn/util.rb +0 -27
  225. data/lib/lono/help/cfn/current.md +0 -18
  226. data/lib/lono/help/upgrade4.md +0 -25
  227. data/lib/lono/inspector.rb +0 -4
  228. data/lib/lono/output_template.rb +0 -35
  229. data/lib/lono/template/base.rb +0 -13
  230. data/lib/lono/template/dsl/builder/helpers.rb +0 -8
  231. data/lib/lono/template/dsl/builder/helpers/core_helper.rb +0 -107
  232. data/lib/lono/template/dsl/builder/helpers/param_helper.rb +0 -61
  233. data/lib/lono/template/dsl/builder/parameter.rb +0 -39
  234. data/lib/lono/upgrade/upgrade4.rb +0 -175
  235. data/lib/lono/upgrade/upgrade42.rb +0 -36
  236. data/lib/lono/upgrade/upgrade5.rb +0 -55
  237. data/lib/templates/blueprint/.meta/config.yml.tt +0 -4
  238. data/lib/templates/skeleton/Guardfile +0 -12
  239. data/lib/templates/upgrade5/blueprints/main/.lono/config.yml +0 -3
  240. data/lib/templates/upgrade5/blueprints/main/.meta/config.yml +0 -3
@@ -1,4 +1,4 @@
1
- class Lono::Template::Dsl::Builder
1
+ class Lono::Template::Strategy::Dsl::Builder
2
2
  module Fn
3
3
  # Also act as documentation on the method signatures
4
4
  # Also used in Coder crafting so should always list all the functions here
@@ -0,0 +1,11 @@
1
+ # Built-in helpers for the DSL form
2
+ class Lono::Template::Strategy::Dsl::Builder
3
+ module Helpers
4
+ extend Memoist
5
+ include CoreHelper
6
+ include FileHelper
7
+ include LookupHelper
8
+ include S3Helper
9
+ include TagsHelper
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ module Lono::Template::Strategy::Dsl::Builder::Helpers
2
+ module CoreHelper
3
+ extend Memoist
4
+
5
+ def stack_name
6
+ @options[:stack]
7
+ end
8
+
9
+ def setting
10
+ Lono::Setting.new
11
+ end
12
+ memoize :setting
13
+ end
14
+ end
@@ -0,0 +1,48 @@
1
+ module Lono::Template::Strategy::Dsl::Builder::Helpers
2
+ module FileHelper
3
+ extend Memoist
4
+
5
+ def content(path)
6
+ render_file(Lono.config.content_path, path)
7
+ end
8
+
9
+ def user_data(path)
10
+ render_file(Lono.config.user_data_path, path)
11
+ end
12
+
13
+ def user_data_script
14
+ unless @user_data_script
15
+ return <<~EOL
16
+ # @user_data_script variable not set. IE: @user_data_script = "configs/#{@blueprint}/user-data/boostrap.sh"
17
+ # Also, make sure that "configs/#{@blueprint}/user-data/boostrap.sh" path you're using exists.
18
+ EOL
19
+ end
20
+
21
+ if File.exist?(@user_data_script)
22
+ render_path(@user_data_script)
23
+ else
24
+ message = "WARN: #{@user_data_script} not found"
25
+ puts message.color(:yellow)
26
+ "# #{message}"
27
+ end
28
+ end
29
+
30
+ def render_file(folder, path)
31
+ path = "#{folder}/#{path}"
32
+ if File.exist?(path)
33
+ render_path(path)
34
+ else
35
+ message = "WARNING: path #{path} not found"
36
+ puts message.color(:yellow)
37
+ puts "Called from:"
38
+ puts caller[2]
39
+ message
40
+ end
41
+ end
42
+ memoize :render_file
43
+
44
+ def render_path(path)
45
+ RenderMePretty.result(path, context: self)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,27 @@
1
+ module Lono::Template::Strategy::Dsl::Builder::Helpers
2
+ module LookupHelper
3
+ extend Memoist
4
+ include Lono::AwsServices
5
+
6
+ def lookup_output(name)
7
+ stack_name, key = name.split(".")
8
+ resp = describe_stacks(stack_name: stack_name)
9
+ stack = resp.stacks.first
10
+ if stack
11
+ o = stack.outputs.detect { |h| h.output_key == key }
12
+ end
13
+
14
+ if o
15
+ o.output_value
16
+ else
17
+ "NOT FOUND: Did not lookup_output #{name} for stack #{stack}"
18
+ end
19
+ end
20
+
21
+ private
22
+ def describe_stacks(options={})
23
+ cfn.describe_stacks(options)
24
+ end
25
+ memoize :describe_stacks
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ module Lono::Template::Strategy::Dsl::Builder::Helpers
2
+ module S3Helper
3
+ def s3_bucket
4
+ Lono::S3::Bucket.name
5
+ end
6
+
7
+ def file_s3_key(name, options={})
8
+ Lono::AppFile::Registry.register(name, @blueprint, options)
9
+ "file://app/files/#{name}" # placeholder for post processing
10
+ end
11
+ alias_method :s3_key, :file_s3_key
12
+ end
13
+ end
@@ -0,0 +1,39 @@
1
+ module Lono::Template::Strategy::Dsl::Builder::Helpers
2
+ module TagsHelper
3
+ def tags(hash={})
4
+ if hash.empty?
5
+ tag_list(@tags) if @tags # when hash is empty, use @tags variable. If not set then return nil
6
+ else
7
+ tag_list(hash)
8
+ end
9
+ end
10
+
11
+ def tag_list(hash)
12
+ raise "tags hash cannot be empty" if hash == nil
13
+
14
+ if hash.is_a?(Array)
15
+ hash = hash.inject({}) do |h,i|
16
+ i.symbolize_keys!
17
+ h[i[:Key]] = i[:Value]
18
+ h
19
+ end
20
+ return tag_list(hash) # recursive call tag_list to normalized the argument with a Hash
21
+ end
22
+
23
+ propagate = hash[:PropagateAtLaunch] # special treatment
24
+ list = hash.map do |k,v|
25
+ h = {Key: k.to_s, Value: v}
26
+ h[:PropagateAtLaunch] = propagate unless propagate.nil?
27
+ h
28
+ end
29
+ list.reject { |h| h[:Key] == "PropagateAtLaunch" }
30
+ end
31
+
32
+ def dimensions(hash)
33
+ tag_list(hash).map { |h|
34
+ h[:Name] = h.delete(:Key) || h.delete(:key)
35
+ h
36
+ }
37
+ end
38
+ end
39
+ end
@@ -1,7 +1,8 @@
1
- class Lono::Template::Dsl::Builder
1
+ module Lono::Template::Strategy::Dsl::Builder::Section
2
2
  class Base
3
- include Fn
4
- include Helpers
3
+ include Lono::Template::Strategy::Dsl::Builder::Fn
4
+ include Lono::Template::Strategy::Dsl::Builder::Helpers
5
+ include Lono::Template::Strategy::Dsl::Builder::Stringify
5
6
 
6
7
  def initialize(blueprint, *definition)
7
8
  @blueprint = blueprint
@@ -16,26 +17,14 @@ class Lono::Template::Dsl::Builder
16
17
  data = if blueprint_meta.auto_camelize?(target_section)
17
18
  CfnCamelizer.transform(attributes)
18
19
  else
19
- stringify_keys!(attributes)
20
+ stringify!(attributes)
20
21
  end
21
22
  clean(data)
22
23
  end
23
24
 
24
- # Accounts for Arrays also. ActiveSupport only works for Hashes.
25
- def stringify_keys!(data)
26
- case data
27
- when Array
28
- data.map! { |i| stringify_keys!(i) }
29
- when Hash
30
- data.deep_transform_keys! { |k| k.to_s }
31
- else
32
- data # do not transform
33
- end
34
- end
35
-
36
25
  # Remove items with nil value automatically
37
26
  def clean(data)
38
- Squeezer.new(data).squeeze
27
+ Lono::Template::Strategy::Dsl::Builder::Squeezer.new(data).squeeze
39
28
  end
40
29
  end
41
30
  end
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # template - uses @definition to build a CloudFormation template section
4
4
  #
5
- class Lono::Template::Dsl::Builder
5
+ module Lono::Template::Strategy::Dsl::Builder::Section
6
6
  class Condition < Base
7
7
  def template
8
8
  camelize(standarize(@definition))
@@ -0,0 +1,9 @@
1
+ module Lono::Template::Strategy::Dsl::Builder::Section
2
+ module Extensions
3
+ def parameter_group(label)
4
+ @group_label = label
5
+ yield
6
+ @group_label = nil
7
+ end
8
+ end
9
+ end
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # template - uses @definition to build a CloudFormation template section
4
4
  #
5
- class Lono::Template::Dsl::Builder
5
+ module Lono::Template::Strategy::Dsl::Builder::Section
6
6
  class Mapping < Base
7
7
  def template
8
8
  camelize(standarize(@definition))
@@ -1,6 +1,6 @@
1
1
  # Organize core section method syntax here
2
- class Lono::Template::Dsl::Builder
3
- module SectionMethods
2
+ module Lono::Template::Strategy::Dsl::Builder::Section
3
+ module Methods
4
4
  def aws_template_format_version(version_date)
5
5
  @cfn["AWSTemplateFormatVersion"] = version_date
6
6
  end
@@ -22,6 +22,13 @@ class Lono::Template::Dsl::Builder
22
22
  @cfn["Parameters"] ||= {}
23
23
  param = Parameter.new(@blueprint, definition)
24
24
  @cfn["Parameters"].merge!(param.template)
25
+
26
+ # Additional decorations
27
+ param.group_label = @group_label
28
+ @parameters << param # register for to build Metadata Interface later
29
+ if param.conditional
30
+ condition("Has#{param.name}", not!(equals(ref(param.name), "")))
31
+ end
25
32
  end
26
33
 
27
34
  def mapping(*definition)
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # template - uses @definition to build a CloudFormation template section
4
4
  #
5
- class Lono::Template::Dsl::Builder
5
+ module Lono::Template::Strategy::Dsl::Builder::Section
6
6
  class Output < Base
7
7
  def template
8
8
  camelize(standarize(@definition))
@@ -0,0 +1,69 @@
1
+ # Implements:
2
+ #
3
+ # template - uses @definition to build a CloudFormation template section
4
+ #
5
+ module Lono::Template::Strategy::Dsl::Builder::Section
6
+ class Parameter < Base
7
+ attr_accessor :group_label
8
+ attr_reader :conditional, :label
9
+
10
+ def template
11
+ camelize(add_required(track_label(track_conditional(standarize(@definition)))))
12
+ end
13
+
14
+ # Type is the only required property: https://amzn.to/2x8W5aD
15
+ def standarize(definition)
16
+ first, second, third = definition
17
+ if definition.size == 1 && first.is_a?(Hash) # long form
18
+ first # pass through
19
+ elsif definition.size == 2 && second.is_a?(Hash) # medium form - 1
20
+ logical_id, properties = first, second
21
+ { logical_id => properties }
22
+ elsif definition.size == 3 && !second.is_a?(Hash) && third.is_a?(Hash) # medium form variant - 2
23
+ third[:Default] = second # probably a String, Integer, or Float
24
+ logical_id, properties = first, third
25
+ { logical_id => properties }
26
+ elsif (definition.size == 2 && valid_value?(second)) || # short form
27
+ definition.size == 1
28
+ logical_id = first
29
+ properties = valid_value?(second) ? { Default: second } : {}
30
+ { logical_id => properties }
31
+ else # I dont know what form
32
+ raise "Invalid form provided. definition #{definition.inspect}"
33
+ end
34
+ end
35
+
36
+ def add_required(attributes)
37
+ properties = attributes.values.first
38
+ properties["Type"] ||= 'String'
39
+ attributes
40
+ end
41
+
42
+ def valid_value?(o)
43
+ o.is_a?(Float) || o.is_a?(Integer) || o.is_a?(String) || o.is_a?(TrueClass) || o.is_a?(FalseClass)
44
+ end
45
+
46
+ def track_conditional(attributes)
47
+ properties = attributes.values.first
48
+ @conditional ||= properties[:Conditional] # flag for later
49
+ properties.delete(:Conditional) # remove property, it's not a real property, used to flag conditional parameters
50
+ # Ensure default
51
+ if @conditional
52
+ defaults = { Default: "" }
53
+ properties.reverse_merge!(defaults)
54
+ end
55
+ attributes
56
+ end
57
+
58
+ def track_label(attributes)
59
+ properties = attributes.values.first
60
+ @label ||= properties[:Label] # flag for later
61
+ properties.delete(:Label) # remove property, it's not a real property, used to build metadata interface
62
+ attributes
63
+ end
64
+
65
+ def name
66
+ template.keys.first # logical_id or name
67
+ end
68
+ end
69
+ end
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # template - uses @definition to build a CloudFormation template section
4
4
  #
5
- class Lono::Template::Dsl::Builder
5
+ module Lono::Template::Strategy::Dsl::Builder::Section
6
6
  class Resource < Base
7
7
  def template
8
8
  camelize(standarize(@definition))
@@ -1,4 +1,4 @@
1
- class Lono::Template::Dsl::Builder::Resource
1
+ class Lono::Template::Strategy::Dsl::Builder::Section::Resource
2
2
  # Moves the property to the top-level attributes *destructively*
3
3
  class PropertyMover
4
4
  def initialize(resource, logical_id, properties)
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # template - uses @definition to build a CloudFormation template section
4
4
  #
5
- class Lono::Template::Dsl::Builder
5
+ module Lono::Template::Strategy::Dsl::Builder::Section
6
6
  class Section < Base
7
7
  def template
8
8
  hash, _ = @definition
@@ -1,4 +1,4 @@
1
- class Lono::Template::Dsl::Builder
1
+ class Lono::Template::Strategy::Dsl::Builder
2
2
  class Squeezer
3
3
  def initialize(data)
4
4
  @data = data
@@ -0,0 +1,15 @@
1
+ class Lono::Template::Strategy::Dsl::Builder
2
+ module Stringify
3
+ # Accounts for Arrays also. ActiveSupport only works for Hashes.
4
+ def stringify!(data)
5
+ case data
6
+ when Array
7
+ data.map! { |i| stringify!(i) }
8
+ when Hash
9
+ data.deep_transform_keys! { |k| k.to_s }
10
+ else
11
+ data # do not transform
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,9 +1,10 @@
1
1
  # Encapsulates syntax methods so they can be included in both the Builder and Context scope
2
- class Lono::Template::Dsl::Builder
2
+ class Lono::Template::Strategy::Dsl::Builder
3
3
  module Syntax
4
4
  include Fn
5
5
  include Lono::Template::Evaluate
6
- include SectionMethods
6
+ include Section::Methods
7
+ include Section::Extensions
7
8
  include Helpers # built-in helpers
8
9
  end
9
10
  end
@@ -0,0 +1,12 @@
1
+ class Lono::Template::Strategy::Dsl
2
+ class Finalizer
3
+ def initialize(cfn, options={})
4
+ @cfn, @options = cfn, options
5
+ end
6
+
7
+ def run
8
+ @cfn = ParameterGroups.new(@cfn, @options[:parameters]).run
9
+ @cfn
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,56 @@
1
+ class Lono::Template::Strategy::Dsl::Finalizer
2
+ class ParameterGroups
3
+ extend Memoist
4
+ include Lono::Template::Strategy::Dsl::Builder::Stringify
5
+
6
+ def initialize(cfn, parameters)
7
+ @cfn, @parameters = cfn, parameters
8
+ end
9
+
10
+ def run
11
+ return @cfn if parameter_groups.empty?
12
+ @cfn["Metadata"] ||= {}
13
+ @cfn["Metadata"]["AWS::CloudFormation::Interface"] = stringify!(interface)
14
+ @cfn
15
+ end
16
+
17
+ def interface
18
+ interface = {}
19
+ parameter_groups.each do |group_label, parameters|
20
+ group = {
21
+ Label: { default: group_label},
22
+ Parameters: parameters,
23
+ }
24
+ interface[:ParameterGroups] ||= []
25
+ interface[:ParameterGroups] << group
26
+ end
27
+ parameter_labels.each do |name, label|
28
+ l = { name => { default: label } }
29
+ interface[:ParameterLabels] ||= {}
30
+ interface[:ParameterLabels].merge!(l)
31
+ end
32
+ interface
33
+ end
34
+
35
+ def parameter_groups
36
+ parameter_groups = {}
37
+ @parameters.each do |p|
38
+ next unless p.group_label
39
+ parameter_groups[p.group_label] ||= []
40
+ parameter_groups[p.group_label] << p.name
41
+ end
42
+ parameter_groups
43
+ end
44
+ memoize :parameter_groups
45
+
46
+ def parameter_labels
47
+ parameter_labels = {}
48
+ @parameters.each do |p|
49
+ next unless p.label
50
+ parameter_labels[p.name] = p.label
51
+ end
52
+ parameter_labels
53
+ end
54
+ memoize :parameter_labels
55
+ end
56
+ end