lono 6.0.1 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ffc3d416a358f6676a11c46731c18dff4c2eb1220ec68dce304e4e570e19dca0
4
- data.tar.gz: 03a5e764bb8f66582d909fef1f5c32274e1a1105d4c3627a0834bb1316f0b2f4
3
+ metadata.gz: 00b82bf7f6fe03723b4819ebe0852b507d141654905d9fab6be7755d5bda22d2
4
+ data.tar.gz: 20552ff66d7d729e114c1539f1f5e8df2956b746c444a3bc3ce699021b46ce28
5
5
  SHA512:
6
- metadata.gz: 2cf2ee72d6d80f0be84171139b45855d167012e28c54a262c5f7954941d577958d7cb600aecffc9fc446c8b5b4f1f873750ff8511eafc84197b875e9758952af
7
- data.tar.gz: fdb40125279f0e67eea4e5abda5e445febfd3ce26ae427070f850955b794206c83f58e311778a6febb60ebba20ff6472afd3fae77609f7339402a15d4fb96bd9
6
+ metadata.gz: e408ef09601c5472db878a329968fa4da5bca6f14980cc7adf56fee36895ae5a7312ebe4ebf8bbb969b12dcdeac8ef01b9bf9f542149b4c230ed6e271678a804
7
+ data.tar.gz: 437bb6232f2ab9b605c7653cf3da3fba70ab93d8a4e6bc201598a2917eac4a365612a2fb66a1359a71fbc38c3fc30a32b4f25b4ebc9f65793f8ad1d4ffd2297c
@@ -3,6 +3,17 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
5
5
 
6
+ ## [6.1.0]
7
+ - #17 big improvements to how the configs lookup logic happens: simpler and easier to understand
8
+ - variables lookup strategy is same as params
9
+ - `--config` option sets both `--param` and `--variable`
10
+ - also account for stack name as part of conventional lookup - big win to help provide consistent and organized configs files.
11
+ - #18 parameter(name, Conditional: true)
12
+ - ref(name, Conditional: true)
13
+ - deprecated `conditional_parameter`, `optional_ref`
14
+ - deprecated `tags` helper, use `tag_list` instead
15
+ - cleanup: organize CoreHelper
16
+
6
17
  ## [6.0.1]
7
18
  - #14 restructure dsl methods are available in variables definition
8
19
  - #15 fix Type camelize bug
data/README.md CHANGED
@@ -54,7 +54,7 @@ resource("Instance", "AWS::EC2::Instance",
54
54
  UserData: base64(user_data("bootstrap.sh"))
55
55
  )
56
56
  resource("SecurityGroup", "AWS::EC2::SecurityGroup",
57
- group_description: "demo security group",
57
+ GroupDescription: "demo security group",
58
58
  )
59
59
 
60
60
  output("Instance")
@@ -5,15 +5,16 @@ module Lono
5
5
 
6
6
  base_options = Proc.new do
7
7
  # common to create, update and deploy
8
+ option :config, aliases: "c", desc: "override convention and specify both the param and variable file to use"
8
9
  option :blueprint, desc: "override convention and specify the template file to use"
9
10
  option :capabilities, type: :array, desc: "iam capabilities. Ex: CAPABILITY_IAM, CAPABILITY_NAMED_IAM"
10
11
  option :iam, type: :boolean, desc: "Shortcut for common IAM capabilities: CAPABILITY_IAM, CAPABILITY_NAMED_IAM"
11
12
  option :lono, type: :boolean, desc: "invoke lono to generate CloudFormation templates", default: true
12
- option :param, desc: "override convention and specify the param file to use"
13
+ option :param, aliases: "p", desc: "override convention and specify the param file to use"
13
14
  option :rollback, type: :boolean, desc: "rollback", default: true
14
15
  option :tags, type: :hash, desc: "Tags for the stack. IE: name:api-web owner:bob"
15
16
  option :template, desc: "override convention and specify the template file to use"
16
- option :variable, desc: "override convention and specify the variable file to use"
17
+ option :variable, aliases: "v", desc: "override convention and specify the variable file to use"
17
18
  end
18
19
  wait_option = Proc.new do
19
20
  option :wait, type: :boolean, desc: "Wait for stack operation to complete.", default: true
@@ -19,9 +19,6 @@ class Lono::Cfn
19
19
  @blueprint = options[:blueprint] || remove_suffix(@stack_name)
20
20
  @template, @param = template_param_convention(options)
21
21
 
22
- # Add template and param to options because used later for Lono::Param::Generator
23
- @options[:blueprint], @options[:template], @options[:param] = @blueprint, @template, @param
24
-
25
22
  set_blueprint_root(@blueprint)
26
23
 
27
24
  @template_path = "#{Lono.config.output_path}/#{@blueprint}/templates/#{@template}.yml"
@@ -149,27 +146,10 @@ class Lono::Cfn
149
146
  param_generator.generate # Writes the json file in CamelCase keys format
150
147
  @@generate_all = param_generator.params # Returns Array in underscore keys format
151
148
 
152
- # At this point we have the info about params path used so we can display it.
153
- # We display other useful info here too so it's together logically.
154
- unless @options[:mute_using]
155
- puts "Using template: #{pretty_path(@template_path)}"
156
- param_generator.puts_param_message(:base)
157
- param_generator.puts_param_message(:env)
158
- end
159
-
160
149
  check_for_errors
161
150
  @@generate_all
162
151
  end
163
152
 
164
- def param_generator
165
- generator_options = {
166
- regenerate: false,
167
- allow_not_exists: true
168
- }.merge(@options)
169
- Lono::Param::Generator.new(@blueprint, generator_options)
170
- end
171
- memoize :param_generator
172
-
173
153
  def ensure_s3_bucket_exist
174
154
  bucket = Lono::S3::Bucket.new
175
155
  return if bucket.exist?
@@ -185,8 +165,18 @@ class Lono::Cfn
185
165
  end
186
166
 
187
167
  def generate_templates
188
- Lono::Template::Generator.new(@blueprint, @options).run
168
+ Lono::Template::Generator.new(@blueprint, @options.merge(stack: @stack_name)).run
169
+ end
170
+
171
+ def param_generator
172
+ generator_options = {
173
+ regenerate: true,
174
+ allow_not_exists: true,
175
+ }.merge(@options)
176
+ generator_options[:stack] ||= @stack_name || @blueprint
177
+ Lono::Param::Generator.new(@blueprint, generator_options)
189
178
  end
179
+ memoize :param_generator
190
180
 
191
181
  def post_process_templates
192
182
  Lono::Template::PostProcessor.new(@blueprint, @options).run
@@ -18,6 +18,7 @@ module Lono
18
18
  long_desc Help.text(:generate)
19
19
  option :clean, type: :boolean, default: false, desc: "remove all output files before generating"
20
20
  option :quiet, type: :boolean, desc: "silence the output"
21
+ option :stack, desc: "stack name. defaults to blueprint name."
21
22
  def generate(blueprint=nil)
22
23
  Blueprint::Find.one_or_all(blueprint).each do |b|
23
24
  Script::Build.new(b, options).run
@@ -0,0 +1,93 @@
1
+ module Lono
2
+ class ConfigLocation
3
+ extend Memoist
4
+ include Lono::Conventions
5
+
6
+ def initialize(config, options={}, env=Lono.env, root=Lono.root)
7
+ # config can be params or variables
8
+ @config, @options, @root, @env = config, options, root, env
9
+
10
+ @stack = options[:stack]
11
+ @blueprint = options[:blueprint] || @stack
12
+ @template, @param = template_param_convention(options)
13
+
14
+ @requested = determine_requested
15
+ end
16
+
17
+ def lookup
18
+ levels = []
19
+ levels += direct_levels
20
+ # Standard lookup paths
21
+ template_level = "#{@root}/configs/#{@blueprint}/#{@config}/#{@env}/#{@template}/#{@requested}"
22
+ env_level = "#{@root}/configs/#{@blueprint}/#{@config}/#{@env}/#{@requested}"
23
+ config_level = "#{@root}/configs/#{@blueprint}/#{@config}/#{@requested}"
24
+ generic_env = "#{@root}/configs/#{@blueprint}/#{@config}/#{@env}"
25
+ levels += [template_level, env_level, config_level, generic_env]
26
+
27
+ print_levels(levels)
28
+
29
+ found = levels.find do |level|
30
+ requested_file(level)
31
+ end
32
+ if found
33
+ file = requested_file(found)
34
+ using_message(file, @env)
35
+ file
36
+ end
37
+ end
38
+
39
+ def direct_levels
40
+ [
41
+ @requested, # IE: absolute full path
42
+ "#{@root}/#{@requested}", # IE : relative path within lono project
43
+ ]
44
+ end
45
+
46
+ def lookup_base
47
+ base = "#{@root}/configs/#{@blueprint}/#{@config}/base"
48
+ file = requested_file(base)
49
+ if file
50
+ using_message(file, "base")
51
+ file
52
+ end
53
+ end
54
+
55
+ def print_levels(levels)
56
+ return unless ENV["LONO_DEBUG_CONFIG"]
57
+ puts "levels:"
58
+ pp levels
59
+ end
60
+
61
+ @@using_message_displayed = {}
62
+ def using_message(file, type)
63
+ return if @@using_message_displayed[file]
64
+
65
+ pretty_file = file.sub("#{Lono.root}/", "")
66
+ puts "Using #{@config} for #{type}: #{pretty_file}"
67
+
68
+ @@using_message_displayed[file] = true
69
+ end
70
+
71
+ # Some switching logic between variable and param below
72
+
73
+ def determine_requested
74
+ # param is usually set from the convention. when set from convention stack name takes higher precedence
75
+ config_key = @config.singularize.to_sym # param or variable
76
+ from_convention = !@options[config_key] && !@options[:config]
77
+ if from_convention
78
+ @options[:stack]
79
+ else
80
+ @options[config_key] || @options[:config] || @options[:stack]
81
+ end
82
+ end
83
+
84
+ def requested_file(path)
85
+ # List of paths to consider from initial path provided
86
+ paths = @config == "params" ?
87
+ [path, "#{path}.txt", "#{path}.sh"] :
88
+ [path, "#{path}.rb"]
89
+ paths.find { |p| File.file?(p) }
90
+ end
91
+ memoize :requested_file
92
+ end
93
+ end
@@ -6,6 +6,7 @@ module Lono
6
6
 
7
7
  desc "generate", "Generate parameter output files to `output/params`."
8
8
  long_desc Lono::Help.text("param/generate")
9
+ option :stack, desc: "stack name. defaults to blueprint name."
9
10
  def generate(blueprint=nil)
10
11
  Blueprint::Find.one_or_all(blueprint).each do |b|
11
12
  Generator.new(b, options).generate
@@ -5,107 +5,25 @@ class Lono::Param
5
5
 
6
6
  attr_reader :env_path, :base_path # set when generate is called
7
7
  def initialize(blueprint, options={})
8
- @blueprint, @options = blueprint, options
8
+ # dup because we're modifying the Thor frozen hash
9
+ # HashWithIndifferentAccess.new again because .dup changes it to a normal Hash
10
+ @blueprint, @options = blueprint, ActiveSupport::HashWithIndifferentAccess.new(options.dup)
11
+ @options[:stack] ||= @blueprint
9
12
  set_blueprint_root(@blueprint)
10
13
  @template, @param = template_param_convention(options)
11
14
  end
12
15
 
13
- def puts_param_message(type)
14
- path = send("#{type}_path")
15
- return unless path
16
- if param_file?(path)
17
- pretty_path = path.sub("#{Lono.root}/",'')
18
- puts "Using param for #{type}: #{pretty_path}".color(:yellow)
19
- end
20
- end
21
-
22
- # Lookup precedence:
23
- #
24
- # configs/BLUEPRINT/params/development/TEMPLATE/PARAM.txt
25
- # configs/BLUEPRINT/params/development/PARAM.txt
26
- # configs/BLUEPRINT/params/development.txt
27
- #
28
- def lookup_param_file(root: Lono.root, env: Lono.env)
29
- # The docs conver direct_absolute_form and direct_relative_form as the "Direct Form"
30
- unless env == "base"
31
- direct_absolute_form = @param # user provided the absolute full path
32
- direct_relative_form = "#{root}/#{@param}" # user provided the full path within the lono project
33
- direct_env_form = "#{root}/configs/#{@blueprint}/params/#{env}/#{@param}" # direct lookup is simple
34
- direct_simple_form = "#{root}/configs/#{@blueprint}/params/#{@param}" # direct lookup is simple
35
- end
36
- long_form = "#{root}/configs/#{@blueprint}/params/#{env}/#{@template}/#{@param}"
37
- medium_form = "#{root}/configs/#{@blueprint}/params/#{env}/#{@param}"
38
- short_form = "#{root}/configs/#{@blueprint}/params/#{env}"
39
-
40
- if ENV['LONO_DEBUG_PARAM']
41
- puts "Lono.blueprint_root #{Lono.blueprint_root}"
42
- puts "direct_absolute_form #{direct_absolute_form}"
43
- puts "direct_relative_form #{direct_relative_form}"
44
- puts "direct_env_form #{direct_env_form}"
45
- puts "direct_simple_form #{direct_simple_form}"
46
- puts "long_form #{long_form}"
47
- puts "medium_form #{medium_form}"
48
- puts "short_form #{short_form}"
49
- end
50
-
51
- unless env == "base"
52
- return param_file(direct_absolute_form) if param_file?(direct_absolute_form)
53
- return param_file(direct_relative_form) if param_file?(direct_relative_form)
54
- return param_file(direct_env_form) if param_file?(direct_env_form) # consider this first its simple and direct but is scope to env so it's more specific
55
- return param_file(direct_simple_form) if param_file?(direct_simple_form) # consider this first its simple and direct but is scope to env so it's more specific
56
- end
57
- return param_file(long_form) if param_file?(long_form) # consider this first because its more explicit
58
-
59
- # All 3 are the same
60
- # Also, blueprint and template the same and explicitly specified param
61
- if @blueprint == @template
62
- return param_file(medium_form) if param_file?(medium_form) # higher precedence between longer but short form should be encouraged
63
- return param_file(short_form) if param_file?(short_form)
64
- return # cannot find a param file
65
- end
66
-
67
- # Only template and param are the same
68
- if @template == @param
69
- return param_file(medium_form) if param_file?(medium_form) # only consider medium form
70
- return # cannot find a param file
71
- end
72
- end
73
-
74
- # Allows user to specify the .txt extension or not to.
75
- # Also allows user to use other extensions like .sh if they are explicit about it.
76
- def param_file?(path)
77
- File.file?(path) || File.file?("#{path}.txt") || File.file?("#{path}.sh")
78
- end
79
-
80
- def param_file(path)
81
- return path if File.file?(path)
82
- return "#{path}.txt" if File.file?("#{path}.txt")
83
- return "#{path}.sh" if File.file?("#{path}.sh")
84
- end
85
-
86
- def lookup_paths
87
- @base_path = lookup_param_file(env: "base")
88
- @env_path = lookup_param_file(env: Lono.env)
89
-
90
- if ENV['LONO_DEBUG_PARAM']
91
- puts " @base_path #{@base_path.inspect}"
92
- puts " @env_path #{@env_path.inspect}"
93
- end
94
-
95
- [@base_path, @env_path]
96
- end
97
-
98
16
  def generate
99
17
  puts "Generating parameter files for blueprint #{@blueprint.color(:green)}:"
100
18
 
101
- @base_path, @env_path = lookup_paths
19
+ @base_path, @env_path = config_locations
102
20
 
103
21
  return unless @base_path || @env_path
104
22
 
105
23
  # useful option for lono cfn, since some templates dont require params
106
- return if @options[:allow_not_exists] && !source_exist?
24
+ return if @options[:allow_not_exists] && !params_exist?
107
25
 
108
- if source_exist?
26
+ if params_exist?
109
27
  contents = process_erb
110
28
  data = convert_to_cfn_format(contents)
111
29
  json = JSON.pretty_generate(data)
@@ -121,21 +39,51 @@ class Lono::Param
121
39
  json
122
40
  end
123
41
 
42
+ def config_locations
43
+ @base_path = lookup_config_location("base")
44
+ @env_path = lookup_config_location(Lono.env)
45
+
46
+ if ENV['LONO_DEBUG_PARAM']
47
+ puts "LONO_DEBUG_PARAM enabled"
48
+ puts " @base_path #{@base_path.inspect}"
49
+ puts " @env_path #{@env_path.inspect}"
50
+ end
51
+
52
+ [@base_path, @env_path]
53
+ end
54
+
55
+ def lookup_config_location(env)
56
+ options = @options.clone
57
+ options[:blueprint] = @blueprint
58
+ options[:stack] ||= @blueprint
59
+ location = Lono::ConfigLocation.new("params", options, env)
60
+ env == "base" ? location.lookup_base : location.lookup
61
+ end
62
+
63
+ def puts_param_message(type)
64
+ path = send("#{type}_path")
65
+ return unless path
66
+ if param_file?(path)
67
+ pretty_path = path.sub("#{Lono.root}/",'')
68
+ puts "Using param for #{type}: #{pretty_path}".color(:yellow)
69
+ end
70
+ end
71
+
124
72
  # Checks both base and source path for existing of the param file.
125
73
  # Example:
126
74
  # params/base/mystack.txt - base path
127
75
  # params/production/mystack.txt - source path
128
- def source_exist?
76
+ def params_exist?
129
77
  @base_path && File.exist?(@base_path) ||
130
78
  @env_path && File.exist?(@env_path)
131
79
  end
132
80
 
133
81
  # useful for when calling CloudFormation via the aws-sdk gem
134
82
  def params(casing = :underscore)
135
- @base_path, @env_path = lookup_paths
83
+ @base_path, @env_path = config_locations
136
84
 
137
85
  # useful option for lono cfn
138
- return {} if @options[:allow_not_exists] && !source_exist?
86
+ return {} if @options[:allow_not_exists] && !params_exist?
139
87
 
140
88
  contents = process_erb
141
89
  convert_to_cfn_format(contents, casing)
@@ -206,7 +154,7 @@ class Lono::Param
206
154
  # Now build up the aws json format for parameters
207
155
  params = []
208
156
  data.each do |key,value|
209
- param = if value == "use_previous_value"
157
+ param = if value == "use_previous_value" || value == "UsePreviousValue"
210
158
  {
211
159
  "ParameterKey": key,
212
160
  "UsePreviousValue": true
@@ -8,36 +8,12 @@ class Lono::Template::Context
8
8
  # config/variables/development.rb - will override any variables in base.rb
9
9
  #
10
10
  def load_variables
11
- load_variables_file(project_path("base"))
12
-
13
- direct_absolute_form = @options[:variable] # user provided the absolute full path
14
- direct_relative_form = "#{Lono.root}/configs/#{@blueprint}/variables/#{@options[:variable]}" # user provided the full path within the lono project
15
- conventional_form = project_path(Lono.env)
16
-
17
- if ENV['LONO_DEBUG_VARIABLE']
18
- puts "direct_absolute_form: #{direct_absolute_form.inspect}"
19
- puts "direct_relative_form: #{direct_relative_form.inspect}"
20
- puts "conventional_form: #{conventional_form.inspect}"
21
- end
22
-
23
- load_variables_file(variable_file(direct_absolute_form)) if variable_file?(direct_absolute_form)
24
- load_variables_file(variable_file(direct_relative_form)) if variable_file?(direct_relative_form)
25
- load_variables_file(conventional_form) if variable_file?(conventional_form)
26
- end
27
-
28
- def variable_file?(path)
29
- return if path.nil?
30
- return path if File.file?(path) # direct lookup with .rb extension
31
- return "#{path}.rb" if File.file?("#{path}.rb") # direct lookup without .rb extension
32
- end
33
-
34
- def variable_file(path)
35
- return path if File.file?(path)
36
- return "#{path}.rb" if File.file?("#{path}.rb")
37
- end
38
-
39
- def project_path(name)
40
- "#{Lono.root}/configs/#{@blueprint}/variables/#{name}.rb"
11
+ options = @options.clone
12
+ options[:blueprint] = @blueprint
13
+ options[:stack] ||= @blueprint
14
+ location = Lono::ConfigLocation.new("variables", options, Lono.env)
15
+ evaluate_variables_file(location.lookup_base) if location.lookup_base
16
+ evaluate_variables_file(location.lookup) if location.lookup # config file
41
17
  end
42
18
 
43
19
  # Load the variables defined in config/variables/* to make available in the
@@ -56,15 +32,8 @@ class Lono::Template::Context
56
32
  #
57
33
  # NOTE: Only able to make instance variables avaialble with instance_eval,
58
34
  # wasnt able to make local variables available.
59
- def load_variables_file(path)
60
- # if File.exist?(path)
61
- # puts "context.rb loading #{path}"
62
- # else
63
- # puts "context.rb file doesnt exist #{path}"
64
- # end
65
-
35
+ def evaluate_variables_file(path)
66
36
  return unless File.exist?(path)
67
-
68
37
  instance_eval(IO.read(path), path)
69
38
  end
70
39
 
@@ -67,9 +67,13 @@ class Lono::Template::Dsl::Builder
67
67
  end
68
68
 
69
69
  # special cases
70
- def ref(name)
70
+ def ref(name, options={})
71
71
  name = name.to_s.camelize
72
- { "Ref" => name }
72
+ if options[:Conditional] || options[:conditional]
73
+ if!("Has#{name}", ref(name), ref("AWS::NoValue"))
74
+ else
75
+ { "Ref" => name }
76
+ end
73
77
  end
74
78
 
75
79
  # Examples:
@@ -78,7 +82,7 @@ class Lono::Template::Dsl::Builder
78
82
  # get_attr(["logical_id", "attribute"])
79
83
  def get_att(*item)
80
84
  item = item.flatten
81
- options = item.last.is_a?(Hash) ? item.pop : {}
85
+ item.last.is_a?(Hash) ? item.pop : {}
82
86
 
83
87
  # list is an Array
84
88
  list = if item.size == 1
@@ -2,72 +2,7 @@
2
2
  class Lono::Template::Dsl::Builder
3
3
  module Helpers
4
4
  extend Memoist
5
+ include CoreHelper
5
6
  include ParamHelper
6
-
7
- def tags(hash, casing: :camelize)
8
- hash.map do |k,v|
9
- k = k.to_s
10
- k = case casing
11
- when :camelize
12
- k.camelize
13
- when :underscore
14
- k.underscore
15
- when :dasherize
16
- k.dasherize
17
- else # leave alone
18
- k
19
- end
20
-
21
- {Key: k, Value: v}
22
- end
23
- end
24
-
25
- def dimensions(hash, casing: :camelize)
26
- tags(hash, casing: casing).map { |h|
27
- h[:Name] = h.delete(:Key) || h.delete(:key)
28
- h
29
- }
30
- end
31
-
32
- def content(path)
33
- render_file(Lono.config.content_path, path)
34
- end
35
-
36
- def user_data(path)
37
- render_file(Lono.config.user_data_path, path)
38
- end
39
-
40
- def render_file(folder, path)
41
- path = "#{folder}/#{path}"
42
- if File.exist?(path)
43
- render_path(path)
44
- else
45
- message = "WARNING: path #{path} not found"
46
- puts message.color(:yellow)
47
- puts "Called from:"
48
- puts caller[2]
49
- message
50
- end
51
- end
52
- memoize :render_file
53
-
54
- def render_path(path)
55
- RenderMePretty.result(path, context: self)
56
- end
57
-
58
- def s3_bucket
59
- Lono::S3::Bucket.name
60
- end
61
-
62
- def file_s3_key(name, options={})
63
- Lono::AppFile::Registry.register(name, @blueprint, options)
64
- "file://app/files/#{name}" # placeholder for post processing
65
- end
66
- alias_method :s3_key, :file_s3_key
67
-
68
- def setting
69
- Lono::Setting.new
70
- end
71
- memoize :setting
72
7
  end
73
8
  end
@@ -0,0 +1,76 @@
1
+ module Lono::Template::Dsl::Builder::Helpers
2
+ module CoreHelper
3
+ extend Memoist
4
+
5
+ def tags(hash, casing: :camelize)
6
+ puts "DEPRECATED: tags helper will be removed. Use tag_list instead."
7
+ tag_list(hash, casing: casing)
8
+ end
9
+
10
+ def tag_list(hash, casing: :camelize)
11
+ hash.map do |k,v|
12
+ k = k.to_s
13
+ k = case casing
14
+ when :camelize
15
+ k.camelize
16
+ when :underscore
17
+ k.underscore
18
+ when :dasherize
19
+ k.dasherize
20
+ else # leave alone
21
+ k
22
+ end
23
+
24
+ {Key: k, Value: v}
25
+ end
26
+ end
27
+
28
+ def dimensions(hash, casing: :camelize)
29
+ tags(hash, casing: casing).map { |h|
30
+ h[:Name] = h.delete(:Key) || h.delete(:key)
31
+ h
32
+ }
33
+ end
34
+
35
+ def content(path)
36
+ render_file(Lono.config.content_path, path)
37
+ end
38
+
39
+ def user_data(path)
40
+ render_file(Lono.config.user_data_path, path)
41
+ end
42
+
43
+ def render_file(folder, path)
44
+ path = "#{folder}/#{path}"
45
+ if File.exist?(path)
46
+ render_path(path)
47
+ else
48
+ message = "WARNING: path #{path} not found"
49
+ puts message.color(:yellow)
50
+ puts "Called from:"
51
+ puts caller[2]
52
+ message
53
+ end
54
+ end
55
+ memoize :render_file
56
+
57
+ def render_path(path)
58
+ RenderMePretty.result(path, context: self)
59
+ end
60
+
61
+ def s3_bucket
62
+ Lono::S3::Bucket.name
63
+ end
64
+
65
+ def file_s3_key(name, options={})
66
+ Lono::AppFile::Registry.register(name, @blueprint, options)
67
+ "file://app/files/#{name}" # placeholder for post processing
68
+ end
69
+ alias_method :s3_key, :file_s3_key
70
+
71
+ def setting
72
+ Lono::Setting.new
73
+ end
74
+ memoize :setting
75
+ end
76
+ end
@@ -1,15 +1,22 @@
1
1
  # Note: These are experimental helpers. Their interface may change or removed entirely.
2
2
  module Lono::Template::Dsl::Builder::Helpers
3
3
  module ParamHelper
4
- # Creates:
5
- #
6
- # 1. parameter
7
- # 2. condition - used to make it optional
8
- #
9
- def conditional_parameter(name, options={})
10
- options = normalize_conditional_parameter_options(options)
11
- parameter(name, options)
12
- condition("Has#{name}", not!(equals(ref(name), "")))
4
+ # Decorate the parameter method to make smarter.
5
+ def parameter(*definition)
6
+ name, second, _ = definition
7
+ # medium form
8
+ if definition.size == 2 && second.is_a?(Hash) && second[:Conditional]
9
+ # Creates:
10
+ #
11
+ # 1. parameter
12
+ # 2. condition - used to make it optional
13
+ #
14
+ options = normalize_conditional_parameter_options(second)
15
+ super(name, options)
16
+ condition("Has#{name}", not!(equals(ref(name), "")))
17
+ else
18
+ super
19
+ end
13
20
  end
14
21
 
15
22
  # use long name to minimize method name collision
@@ -26,7 +33,20 @@ module Lono::Template::Dsl::Builder::Helpers
26
33
  options
27
34
  end
28
35
 
36
+ # Creates:
37
+ #
38
+ # 1. parameter
39
+ # 2. condition - used to make it optional
40
+ #
41
+ def conditional_parameter(name, options={})
42
+ puts "DEPRECATED: Will be removed. Instead use: parameter(name, Conditional: true)"
43
+ options = normalize_conditional_parameter_options(options)
44
+ parameter(name, options)
45
+ condition("Has#{name}", not!(equals(ref(name), "")))
46
+ end
47
+
29
48
  def optional_ref(name)
49
+ puts "DEPRECATED: Will be removed. Instead use: ref(name, Conditional: true)"
30
50
  if!("Has#{name}", ref(name), ref("AWS::NoValue"))
31
51
  end
32
52
  end
@@ -2,8 +2,8 @@
2
2
  class Lono::Template::Dsl::Builder
3
3
  module Syntax
4
4
  include Fn
5
- include Helpers # built-in helpers
6
5
  include Lono::Template::Evaluate
7
6
  include SectionMethods
7
+ include Helpers # built-in helpers
8
8
  end
9
9
  end
@@ -5,7 +5,7 @@ class Lono::Template
5
5
  include Lono::Blueprint::Root
6
6
 
7
7
  def initialize(blueprint, options={})
8
- @blueprint, @options = blueprint, options
8
+ @blueprint, @options = blueprint, ActiveSupport::HashWithIndifferentAccess.new(options.dup)
9
9
  @template = @options[:template] || @blueprint
10
10
  Lono::ProjectChecker.check
11
11
  set_blueprint_root(@blueprint)
@@ -13,11 +13,11 @@ class Lono::Template
13
13
 
14
14
  def run
15
15
  # Examples:
16
- # Erb.new(b, options.clone).run
17
- # Dsl.new(b, options.clone).run
16
+ # Erb.new(b, options.dup).run
17
+ # Dsl.new(b, options.dup).run
18
18
  generator_class = "Lono::Template::#{template_type.classify}"
19
19
  generator_class = Object.const_get(generator_class)
20
- generator_class.new(@blueprint, @options.clone).run
20
+ generator_class.new(@blueprint, @options).run
21
21
  end
22
22
 
23
23
  def template_type
@@ -1,3 +1,3 @@
1
1
  module Lono
2
- VERSION = "6.0.1"
2
+ VERSION = "6.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lono
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.1
4
+ version: 6.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-02 00:00:00.000000000 Z
11
+ date: 2019-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -486,6 +486,7 @@ files:
486
486
  - lib/lono/completer/script.rb
487
487
  - lib/lono/completer/script.sh
488
488
  - lib/lono/completion.rb
489
+ - lib/lono/config_location.rb
489
490
  - lib/lono/conventions.rb
490
491
  - lib/lono/core.rb
491
492
  - lib/lono/core/config.rb
@@ -555,6 +556,7 @@ files:
555
556
  - lib/lono/template/dsl/builder/condition.rb
556
557
  - lib/lono/template/dsl/builder/fn.rb
557
558
  - lib/lono/template/dsl/builder/helpers.rb
559
+ - lib/lono/template/dsl/builder/helpers/core_helper.rb
558
560
  - lib/lono/template/dsl/builder/helpers/param_helper.rb
559
561
  - lib/lono/template/dsl/builder/mapping.rb
560
562
  - lib/lono/template/dsl/builder/output.rb