aws-must 0.0.13 → 0.0.14
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 +4 -4
- data/README.md +1 -1
- data/bin/aws-must.rb +1 -304
- data/lib/aws-must.rb +1 -0
- data/lib/aws-must/aws-must.rb +3 -1
- data/lib/aws-must/docu.rb +4 -2
- data/lib/aws-must/fileprovider.rb +13 -0
- data/lib/cli/aws-must-cli.rb +338 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef1ec5cf98ec249bc3e9be5ece8c0c7d4688f987
|
4
|
+
data.tar.gz: 5433b3272b9c497981c4ada810e52701bc4f5ef4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1decbdc3b13c2cf84603a916b7e2ed42768b54a7e81ef902ee7639cc2419829bf0901d4cf7c7842ec1110146fe649ac10e6f2e243fd1925934cd9b92b91509c
|
7
|
+
data.tar.gz: bc5bd0f0664d9ec1b32dc9e6394f1dee496978c584f7484fc9ffb8250baf5b5986325b64e73d682d334d3dab07b7681951ad3b8f7316ab5f3bb769d13753cf56
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# aws-must - Minimum Viable Solution to Manage CloudFormation Templates - $Release:0.0.
|
1
|
+
# aws-must - Minimum Viable Solution to Manage CloudFormation Templates - $Release:0.0.14$
|
2
2
|
|
3
3
|
`aws-must` is a tool, which allows separating infrastructure
|
4
4
|
configuration and Amazon related syntax in CloudFormation JSON
|
data/bin/aws-must.rb
CHANGED
@@ -1,308 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
require 'thor'
|
5
|
-
require_relative '../lib/aws-must'
|
6
|
-
|
7
|
-
class App < Thor
|
8
|
-
|
9
|
-
include Utils::MyLogger # mix logger
|
10
|
-
PROGNAME = "main" # logger progname
|
11
|
-
|
12
|
-
# default values
|
13
|
-
|
14
|
-
DEAFAULT_TEMPLATE="root" # name of template in :template_path -directory
|
15
|
-
|
16
|
-
# DEFAUL_FOLD_ON="<!--*SED-MAGIC* <div class=window> -->" # default output for +++fold-on+++ tag
|
17
|
-
# DEFAUL_FOLD_OFF="<!--*SED-MAGIC* </div> -->" # default output for +++fold-off+++ tag
|
18
|
-
|
19
|
-
# default output for +++fold-on+++ tag
|
20
|
-
DEFAUL_FOLD_ON="<div class='fold'>Check to show template: <input type='checkbox' class='toggle'/><div>"
|
21
|
-
DEFAUL_FOLD_OFF="</div></div>" # default output for +++fold-off+++ tag
|
22
|
-
|
23
|
-
# ------------------------------------------------------------------
|
24
|
-
# make two thor tasks share options?
|
25
|
-
# http://stackoverflow.com/questions/14346285/how-to-make-two-thor-tasks-share-options
|
26
|
-
|
27
|
-
class << self
|
28
|
-
def add_shared_option(name, options = {})
|
29
|
-
@shared_options = {} if @shared_options.nil?
|
30
|
-
@shared_options[name] = options
|
31
|
-
end
|
32
|
-
|
33
|
-
def shared_options(*option_names)
|
34
|
-
option_names.each do |option_name|
|
35
|
-
opt = @shared_options[option_name]
|
36
|
-
raise "Tried to access shared option '#{option_name}' but it was not previously defined" if opt.nil?
|
37
|
-
option option_name, opt
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def initialize(*args)
|
43
|
-
super
|
44
|
-
@logger = getLogger( PROGNAME, options )
|
45
|
-
end
|
46
|
-
|
47
|
-
# ------------------------------------------------------------------
|
48
|
-
|
49
|
-
class_option :log, :aliases => "-l", :type =>:string, :default => nil,
|
50
|
-
:enum => [ "DEBUG", "INFO", "WARN", "ERROR" ],
|
51
|
-
:desc => "Set debug level "
|
52
|
-
|
53
|
-
|
54
|
-
# ------------------------------------------------------------------
|
55
|
-
add_shared_option :template_gem, :aliases => "-g", :type => :string,
|
56
|
-
:desc => "Mustache template Gem name (optionally with version constraint e.g. 'aws-must-templates,~>0.0.1') (DEPRECATED)"
|
57
|
-
|
58
|
-
add_shared_option :template_path, :aliases => "-t", :type =>
|
59
|
-
:string, :desc => "Directory holding mustache templates (DEPRECATED)"
|
60
|
-
|
61
|
-
add_shared_option :mustaches, :aliases => "-m", :type =>
|
62
|
-
:array, :default => [ "mustache/"],
|
63
|
-
:desc => "Array of directory paths (ending with slash '/' char e.g. 'mustache/') of Gem names (optionally with version constraint e.g. 'aws-must-templates,~>0.0.1') holding mustache templates"
|
64
|
-
|
65
|
-
# ------------------------------------------------------------------
|
66
|
-
# action 'doc'
|
67
|
-
|
68
|
-
desc "doc", "Extract template documentation"
|
69
|
-
|
70
|
-
shared_options :template_path
|
71
|
-
shared_options :mustaches
|
72
|
-
shared_options :template_gem
|
73
|
-
|
74
|
-
option :fold_on, :aliases => "-n", :type => :string,
|
75
|
-
:default => DEFAUL_FOLD_ON,
|
76
|
-
:desc => "Output for +++fold-on+++ tag"
|
77
|
-
|
78
|
-
option :fold_off, :aliases => "-f", :type => :string,
|
79
|
-
:default => DEFAUL_FOLD_OFF,
|
80
|
-
:desc => "Output for +++fold-off+++ tag"
|
81
|
-
|
82
|
-
long_desc <<-LONGDESC
|
83
|
-
|
84
|
-
Extract documation from <template_name> in ':template_path' -directory.
|
85
|
-
|
86
|
-
<template_name> defaults to '#{DEAFAULT_TEMPLATE}'
|
87
|
-
|
88
|
-
|
89
|
-
Documentation is extracted from lines surrounded by #{AwsMust::Docu::DEFAULT_OPEN_TAG} and #{AwsMust::Docu::DEFAULT_CLOSE_TAG} tags,
|
90
|
-
or by #{AwsMust::Docu::DEFAULT_FOLD_ON_TAG} and #{AwsMust::Docu::DEFAULT_FOLD_OFF_TAG} tags.
|
91
|
-
|
92
|
-
Following rules apply:
|
93
|
-
|
94
|
-
- #{AwsMust::Docu::DEFAULT_OPEN_TAG}, #{AwsMust::Docu::DEFAULT_CLOSE_TAG} -tags: nothing is outputted for these lines
|
95
|
-
|
96
|
-
- #{AwsMust::Docu::DEFAULT_FOLD_ON_TAG} -tag: output text for --fold_on option (defaults '#{DEFAUL_FOLD_ON}')
|
97
|
-
|
98
|
-
- #{AwsMust::Docu::DEFAULT_FOLD_OFF_TAG} -tag: output text for --fold_off option (defaults '#{DEFAUL_FOLD_OFF}')
|
99
|
-
|
100
|
-
|
101
|
-
Defult fold_on and fold_off parameters implement CCS-toggle when using following css-code
|
102
|
-
|
103
|
-
/* CSS-support fold-on/fold-off toggle */\n
|
104
|
-
div.fold { width: 90%; padding: .42rem; border-radius: 5px; margin: 1rem; }\n
|
105
|
-
div.fold div { height: 0px; margin: .2rem; overflow: hidden; }\n
|
106
|
-
div.toggle ~ div { height: 0px; margin: .2rem; overflow: hidden; }\n
|
107
|
-
input.toggle:checked ~ div { height: auto;color: white; background: #c6a24b;font-family: monospace;white-space: pre; }\n
|
108
|
-
|
109
|
-
|
110
|
-
LONGDESC
|
111
|
-
|
112
|
-
def doc( template_name=DEAFAULT_TEMPLATE )
|
113
|
-
|
114
|
-
@logger.info( "#{__method__} starting" )
|
115
|
-
|
116
|
-
|
117
|
-
my_options = option_adjust_common( options )
|
118
|
-
|
119
|
-
app = ::AwsMust::AwsMust.new( my_options )
|
120
|
-
app.doc( template_name )
|
121
|
-
|
122
|
-
end
|
123
|
-
|
124
|
-
# ------------------------------------------------------------------
|
125
|
-
# action 'json'
|
126
|
-
|
127
|
-
desc "json <yaml_file> [with_adjust]", "Dump configuration in JSON format (with or without adjustment)"
|
128
|
-
|
129
|
-
long_desc <<-LONGDESC
|
130
|
-
|
131
|
-
Reads <yaml_file> and dumps it to stdout in JSON format
|
132
|
-
'with_adjust' (yes/no)
|
133
|
-
|
134
|
-
By default 'adjusts' data, i.e. adds property "_comma" with the
|
135
|
-
value "," to each sub document, expect the last sub-document is
|
136
|
-
adjusted with empty string "".
|
137
|
-
|
138
|
-
The "_comma" -property helps in generating valid json arrays in
|
139
|
-
mustache templates. For example, YAML construct
|
140
|
-
|
141
|
-
tags:
|
142
|
-
- Key: key1
|
143
|
-
Value: value1
|
144
|
-
|
145
|
-
- Key: key2
|
146
|
-
Value: value2
|
147
|
-
|
148
|
-
and Mustache template snippet
|
149
|
-
|
150
|
-
{ "Tags" : [
|
151
|
-
{{#tags}}
|
152
|
-
{ "Key" : "{{Key}}", "Value" : "{{Value}}"{{_comma}} }
|
153
|
-
{{/tags}}
|
154
|
-
]}
|
155
|
-
|
156
|
-
results to valid JSON document
|
157
|
-
|
158
|
-
{ "Tags" : [
|
159
|
-
{ "Key" : "key1", "Value" : "value1",
|
160
|
-
{ "Key" : "key2", "Value" : "value2"
|
161
|
-
]}
|
162
|
-
|
163
|
-
LONGDESC
|
164
|
-
|
165
|
-
|
166
|
-
def json( yaml_file, with_adjust="true" )
|
167
|
-
|
168
|
-
app = ::AwsMust::AwsMust.new( options )
|
169
|
-
app.json( yaml_file, with_adjust =~ /^true$/ || with_adjust =~ /^yes$/ ? true : false )
|
170
|
-
|
171
|
-
end
|
172
|
-
|
173
|
-
|
174
|
-
# ------------------------------------------------------------------
|
175
|
-
# action 'gen'
|
176
|
-
|
177
|
-
desc "gen <yaml_file> [<template_name>]", "Generate CloudFormation JSON template"
|
178
|
-
|
179
|
-
shared_options :template_path
|
180
|
-
shared_options :mustaches
|
181
|
-
shared_options :template_gem
|
182
|
-
|
183
|
-
long_desc <<-LONGDESC
|
184
|
-
|
185
|
-
Generate Amazon CloudFormation JSON file for <yaml_file> using
|
186
|
-
<template_name> in ':template_path' -directory.
|
187
|
-
|
188
|
-
<template_name> defaults to '#{DEAFAULT_TEMPLATE}'
|
189
|
-
|
190
|
-
LONGDESC
|
191
|
-
|
192
|
-
|
193
|
-
def gen( yaml_file, template_name=DEAFAULT_TEMPLATE )
|
194
|
-
|
195
|
-
my_options = option_adjust_common( options )
|
196
|
-
|
197
|
-
app = ::AwsMust::AwsMust.new( my_options )
|
198
|
-
app.generate( template_name, yaml_file, my_options )
|
199
|
-
|
200
|
-
end
|
201
|
-
|
202
|
-
# ------------------------------------------------------------------
|
203
|
-
# common routines
|
204
|
-
no_commands do
|
205
|
-
|
206
|
-
def option_adjust_common( options )
|
207
|
-
|
208
|
-
raise "No optios given" unless options
|
209
|
-
|
210
|
-
# options readonly - dup allows modification
|
211
|
-
options = options.dup
|
212
|
-
|
213
|
-
@logger.debug( "#{__method__}, options '#{options}'" )
|
214
|
-
|
215
|
-
options = option_template_gem_to_template_path( options ) if options[:template_gem]
|
216
|
-
options = option_template_path( options ) if options[:template_path]
|
217
|
-
|
218
|
-
warn <<-EOS unless options[:mustaches] && options[:mustaches].any?
|
219
|
-
|
220
|
-
Deprecation!!
|
221
|
-
|
222
|
-
Use option -m to define location of templates
|
223
|
-
|
224
|
-
Options -g and -t deprecated
|
225
|
-
EOS
|
226
|
-
|
227
|
-
options = option_mustaches_to_template_paths( options ) if options[:mustaches]
|
228
|
-
|
229
|
-
return options
|
230
|
-
end
|
231
|
-
|
232
|
-
# set `options[:template_path]` to an array of local directory
|
233
|
-
# paths parsed from list of options[:mustaches]
|
234
|
-
def option_mustaches_to_template_paths( options )
|
235
|
-
|
236
|
-
# init, NB: plural
|
237
|
-
options[:template_paths] = []
|
238
|
-
|
239
|
-
options[:mustaches].each do |mustache_def|
|
240
|
-
if mustache_def[-1] == '/' then
|
241
|
-
# directory with last char removed
|
242
|
-
options[:template_paths] << mustache_def[0..-1]
|
243
|
-
else
|
244
|
-
# gemname
|
245
|
-
options[:template_paths] << gem_name_to_template_path( mustache_def )
|
246
|
-
end
|
247
|
-
|
248
|
-
end
|
249
|
-
return options
|
250
|
-
end
|
251
|
-
|
252
|
-
# overrides -m option
|
253
|
-
def option_template_path( options )
|
254
|
-
# overrides -m option
|
255
|
-
options[:mustaches] = []
|
256
|
-
return options
|
257
|
-
end
|
258
|
-
|
259
|
-
# set 'options[:template_path]' to mustache directory withing
|
260
|
-
# `options[:template_gem]` Gem
|
261
|
-
def option_template_gem_to_template_path( options )
|
262
|
-
|
263
|
-
# overrides -m option
|
264
|
-
options[:mustaches] = []
|
265
|
-
|
266
|
-
options[:template_path] = gem_name_to_template_path( options[:template_gem] )
|
267
|
-
|
268
|
-
return options
|
269
|
-
|
270
|
-
end
|
271
|
-
|
272
|
-
# map 'gem_name_and_spec' to path of mustache templates
|
273
|
-
def gem_name_to_template_path( gem_name_and_spec )
|
274
|
-
|
275
|
-
# The version requirements are optional.
|
276
|
-
# You can also specify multiple version requirements, just append more at the end
|
277
|
-
gem_spec = gem_name_and_spec.split(',')
|
278
|
-
gem_name, *gem_ver_reqs = gem_spec[0], gem_spec[1]
|
279
|
-
@logger.debug( "#{__method__}, gem_name=#{gem_name}, *gem_ver_reqs=#{gem_ver_reqs}" )
|
280
|
-
gdep = Gem::Dependency.new(gem_name, *gem_ver_reqs)
|
281
|
-
# find latest that satisifies
|
282
|
-
found_gspec = gdep.matching_specs.sort_by(&:version).last
|
283
|
-
@logger.debug( "#{__method__}, found_gspec=#{found_gspec}" )
|
284
|
-
# instead of using Gem::Dependency, you can also do:
|
285
|
-
# Gem::Specification.find_all_by_name(gem_name, *gem_ver_reqs)
|
286
|
-
|
287
|
-
if found_gspec
|
288
|
-
@logger.debug( "#{__method__}, Requirement '#{gdep}' already satisfied by #{found_gspec.name}-#{found_gspec.version}" )
|
289
|
-
@logger.debug( "#{__method__}, old-options=#{options}" )
|
290
|
-
template_path = "#{found_gspec.gem_dir}/mustache"
|
291
|
-
@logger.debug( "#{__method__}, template_path=#{template_path}" )
|
292
|
-
else
|
293
|
-
#puts "Requirement '#{gdep}' not satisfied; installing..."
|
294
|
-
# ver_args = gdep.requirements_list.map{|s| ['-v', s] }.flatten
|
295
|
-
# # multi-arg is safer, to avoid injection attacks
|
296
|
-
# system('gem', 'install', gem_name, *ver_args)
|
297
|
-
raise "Could not find gem '#{gdep}' - try 'gem install #{gdep}'"
|
298
|
-
end
|
299
|
-
|
300
|
-
return template_path
|
301
|
-
|
302
|
-
end
|
303
|
-
|
304
|
-
end # no commands
|
305
|
-
|
306
|
-
end
|
3
|
+
require_relative "../lib/cli/aws-must-cli"
|
307
4
|
|
308
5
|
App.start
|
data/lib/aws-must.rb
CHANGED
data/lib/aws-must/aws-must.rb
CHANGED
@@ -56,13 +56,15 @@ module AwsMust
|
|
56
56
|
end
|
57
57
|
|
58
58
|
# ------------------------------------------------------------------
|
59
|
-
#
|
59
|
+
# output result of rendering 'template_name' using configurations
|
60
60
|
# from 'yaml_file'
|
61
61
|
|
62
62
|
def generate( template_name, yaml_file, options )
|
63
63
|
puts generate_str( template_name, yaml_file, options )
|
64
64
|
end
|
65
65
|
|
66
|
+
# return the result of rendering 'template_name' using
|
67
|
+
# configurations from 'yaml_file' as a string
|
66
68
|
def generate_str( template_name, yaml_file, options )
|
67
69
|
|
68
70
|
@logger.debug( "#{__method__}, template_name '#{template_name}'" )
|
data/lib/aws-must/docu.rb
CHANGED
@@ -61,7 +61,7 @@ module AwsMust
|
|
61
61
|
|
62
62
|
def document( template_name )
|
63
63
|
|
64
|
-
@logger.
|
64
|
+
@logger.info( "#{__method__}, template_name '#{template_name}'" )
|
65
65
|
|
66
66
|
#
|
67
67
|
template_string = @template.get_template( template_name )
|
@@ -81,6 +81,7 @@ module AwsMust
|
|
81
81
|
if open_found then
|
82
82
|
|
83
83
|
state_opened = true
|
84
|
+
@logger.info( "#{__method__}, open tag in '#{template_name}'" )
|
84
85
|
|
85
86
|
# something follows the start -tag
|
86
87
|
redo if line && ! line.empty?
|
@@ -95,9 +96,11 @@ module AwsMust
|
|
95
96
|
# puts "close_found=#{close_found}, #{close_found.class}, line=#{line}"
|
96
97
|
if close_found then
|
97
98
|
output( line_pre ) if line_pre && !line_pre.empty?
|
99
|
+
@logger.info( "#{__method__}, close tag in '#{template_name}'" )
|
98
100
|
state_opened = false
|
99
101
|
redo if line && ! line.empty?
|
100
102
|
elsif template_name = directive_include( line ) then
|
103
|
+
@logger.info( "#{__method__}, include in '#{template_name}'" )
|
101
104
|
document( template_name )
|
102
105
|
else
|
103
106
|
output( line )
|
@@ -112,7 +115,6 @@ module AwsMust
|
|
112
115
|
# output - document output
|
113
116
|
|
114
117
|
def output( line )
|
115
|
-
|
116
118
|
puts( line )
|
117
119
|
end
|
118
120
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module AwsMust
|
2
|
+
|
3
|
+
# allow Docu class to access files
|
4
|
+
class FileProvider
|
5
|
+
def initialize( optionss=nil )
|
6
|
+
end
|
7
|
+
# return lines in a file as a long string
|
8
|
+
def get_template( file_name )
|
9
|
+
return File.readlines( file_name ).join
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,338 @@
|
|
1
|
+
|
2
|
+
require 'thor'
|
3
|
+
require_relative '../aws-must'
|
4
|
+
|
5
|
+
|
6
|
+
class App < Thor
|
7
|
+
|
8
|
+
include Utils::MyLogger # mix logger
|
9
|
+
PROGNAME = "main" # logger progname
|
10
|
+
|
11
|
+
# default values
|
12
|
+
|
13
|
+
DEAFAULT_TEMPLATE="root" # name of template in :template_path -directory
|
14
|
+
|
15
|
+
# DEFAUL_FOLD_ON="<!--*SED-MAGIC* <div class=window> -->" # default output for +++fold-on+++ tag
|
16
|
+
# DEFAUL_FOLD_OFF="<!--*SED-MAGIC* </div> -->" # default output for +++fold-off+++ tag
|
17
|
+
|
18
|
+
# default output for +++fold-on+++ tag
|
19
|
+
DEFAUL_FOLD_ON="<div class='fold'>Check to show template: <input type='checkbox' class='toggle'/><div>"
|
20
|
+
DEFAUL_FOLD_OFF="</div></div>" # default output for +++fold-off+++ tag
|
21
|
+
|
22
|
+
# ------------------------------------------------------------------
|
23
|
+
# make two thor tasks share options?
|
24
|
+
# http://stackoverflow.com/questions/14346285/how-to-make-two-thor-tasks-share-options
|
25
|
+
|
26
|
+
class << self
|
27
|
+
def add_shared_option(name, options = {})
|
28
|
+
@shared_options = {} if @shared_options.nil?
|
29
|
+
@shared_options[name] = options
|
30
|
+
end
|
31
|
+
|
32
|
+
def shared_options(*option_names)
|
33
|
+
option_names.each do |option_name|
|
34
|
+
opt = @shared_options[option_name]
|
35
|
+
raise "Tried to access shared option '#{option_name}' but it was not previously defined" if opt.nil?
|
36
|
+
option option_name, opt
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(*args)
|
42
|
+
super
|
43
|
+
@logger = getLogger( PROGNAME, options )
|
44
|
+
end
|
45
|
+
|
46
|
+
# ------------------------------------------------------------------
|
47
|
+
|
48
|
+
class_option :log, :aliases => "-l", :type =>:string, :default => nil,
|
49
|
+
:enum => [ "DEBUG", "INFO", "WARN", "ERROR" ],
|
50
|
+
:desc => "Set debug level "
|
51
|
+
|
52
|
+
|
53
|
+
# ------------------------------------------------------------------
|
54
|
+
add_shared_option :template_gem, :aliases => "-g", :type => :string,
|
55
|
+
:desc => "Mustache template Gem name (optionally with version constraint e.g. 'aws-must-templates,~>0.0.1') (DEPRECATED)"
|
56
|
+
|
57
|
+
add_shared_option :template_path, :aliases => "-t", :type =>
|
58
|
+
:string, :desc => "Directory holding mustache templates (DEPRECATED)"
|
59
|
+
|
60
|
+
add_shared_option :mustaches, :aliases => "-m", :type =>
|
61
|
+
:array, :default => [ "mustache/"],
|
62
|
+
:desc => "Array of directory paths (ending with slash '/' char e.g. 'mustache/') of Gem names (optionally with version constraint e.g. 'aws-must-templates,~>0.0.1') holding mustache templates"
|
63
|
+
|
64
|
+
|
65
|
+
add_shared_option :fold_on, :aliases => "-n", :type => :string,
|
66
|
+
:default => DEFAUL_FOLD_ON,
|
67
|
+
:desc => "Output for +++fold-on+++ tag"
|
68
|
+
|
69
|
+
add_shared_option :fold_off, :aliases => "-f", :type => :string,
|
70
|
+
:default => DEFAUL_FOLD_OFF,
|
71
|
+
:desc => "Output for +++fold-off+++ tag"
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
# ------------------------------------------------------------------
|
76
|
+
# action 'doc'
|
77
|
+
|
78
|
+
desc "doc", "Extract documentation in template"
|
79
|
+
|
80
|
+
shared_options :template_path
|
81
|
+
shared_options :mustaches
|
82
|
+
shared_options :template_gem
|
83
|
+
|
84
|
+
shared_options :fold_on
|
85
|
+
shared_options :fold_off
|
86
|
+
|
87
|
+
|
88
|
+
long_desc <<-LONGDESC
|
89
|
+
|
90
|
+
Extract documation from <template_name> in ':template_path' -directory.
|
91
|
+
|
92
|
+
<template_name> defaults to '#{DEAFAULT_TEMPLATE}'
|
93
|
+
|
94
|
+
|
95
|
+
Documentation is extracted from lines surrounded by #{AwsMust::Docu::DEFAULT_OPEN_TAG} and #{AwsMust::Docu::DEFAULT_CLOSE_TAG} tags,
|
96
|
+
or by #{AwsMust::Docu::DEFAULT_FOLD_ON_TAG} and #{AwsMust::Docu::DEFAULT_FOLD_OFF_TAG} tags.
|
97
|
+
|
98
|
+
Following rules apply:
|
99
|
+
|
100
|
+
- #{AwsMust::Docu::DEFAULT_OPEN_TAG}, #{AwsMust::Docu::DEFAULT_CLOSE_TAG} -tags: nothing is outputted for these lines
|
101
|
+
|
102
|
+
- #{AwsMust::Docu::DEFAULT_FOLD_ON_TAG} -tag: output text for --fold_on option (defaults '#{DEFAUL_FOLD_ON}')
|
103
|
+
|
104
|
+
- #{AwsMust::Docu::DEFAULT_FOLD_OFF_TAG} -tag: output text for --fold_off option (defaults '#{DEFAUL_FOLD_OFF}')
|
105
|
+
|
106
|
+
|
107
|
+
Defult fold_on and fold_off parameters implement CCS-toggle when using following css-code
|
108
|
+
|
109
|
+
/* CSS-support fold-on/fold-off toggle */\n
|
110
|
+
div.fold { width: 90%; padding: .42rem; border-radius: 5px; margin: 1rem; }\n
|
111
|
+
div.fold div { height: 0px; margin: .2rem; overflow: hidden; }\n
|
112
|
+
div.toggle ~ div { height: 0px; margin: .2rem; overflow: hidden; }\n
|
113
|
+
input.toggle:checked ~ div { height: auto;color: white; background: #c6a24b;font-family: monospace;white-space: pre; }\n
|
114
|
+
|
115
|
+
|
116
|
+
LONGDESC
|
117
|
+
|
118
|
+
def doc( template_name=DEAFAULT_TEMPLATE )
|
119
|
+
|
120
|
+
@logger.info( "#{__method__} starting" )
|
121
|
+
|
122
|
+
|
123
|
+
my_options = option_adjust_common( options )
|
124
|
+
|
125
|
+
app = ::AwsMust::AwsMust.new( my_options )
|
126
|
+
app.doc( template_name )
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
# ------------------------------------------------------------------
|
131
|
+
# action 'ddoc'
|
132
|
+
|
133
|
+
desc "ddoc <pattern>", "Extract documentation in <pattern> files"
|
134
|
+
|
135
|
+
shared_options :fold_on
|
136
|
+
shared_options :fold_off
|
137
|
+
|
138
|
+
|
139
|
+
def ddoc( pattern )
|
140
|
+
|
141
|
+
@logger.info( "#{__method__} starting, options '#{options}'" )
|
142
|
+
|
143
|
+
|
144
|
+
files = Dir.glob( pattern ).sort
|
145
|
+
files.each do |file|
|
146
|
+
@logger.debug( "#{__method__}, file '#{file}'" )
|
147
|
+
fileProvider = AwsMust::FileProvider.new( options )
|
148
|
+
docu = AwsMust::Docu.new( fileProvider, options )
|
149
|
+
docu.document( file )
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
# ------------------------------------------------------------------
|
156
|
+
# action 'json'
|
157
|
+
|
158
|
+
desc "json <yaml_file> [with_adjust]", "Dump configuration in JSON format (with or without adjustment)"
|
159
|
+
|
160
|
+
long_desc <<-LONGDESC
|
161
|
+
|
162
|
+
Reads <yaml_file> and dumps it to stdout in JSON format
|
163
|
+
'with_adjust' (yes/no)
|
164
|
+
|
165
|
+
By default 'adjusts' data, i.e. adds property "_comma" with the
|
166
|
+
value "," to each sub document, expect the last sub-document is
|
167
|
+
adjusted with empty string "".
|
168
|
+
|
169
|
+
The "_comma" -property helps in generating valid json arrays in
|
170
|
+
mustache templates. For example, YAML construct
|
171
|
+
|
172
|
+
tags:
|
173
|
+
- Key: key1
|
174
|
+
Value: value1
|
175
|
+
|
176
|
+
- Key: key2
|
177
|
+
Value: value2
|
178
|
+
|
179
|
+
and Mustache template snippet
|
180
|
+
|
181
|
+
{ "Tags" : [
|
182
|
+
{{#tags}}
|
183
|
+
{ "Key" : "{{Key}}", "Value" : "{{Value}}"{{_comma}} }
|
184
|
+
{{/tags}}
|
185
|
+
]}
|
186
|
+
|
187
|
+
results to valid JSON document
|
188
|
+
|
189
|
+
{ "Tags" : [
|
190
|
+
{ "Key" : "key1", "Value" : "value1",
|
191
|
+
{ "Key" : "key2", "Value" : "value2"
|
192
|
+
]}
|
193
|
+
|
194
|
+
LONGDESC
|
195
|
+
|
196
|
+
|
197
|
+
def json( yaml_file, with_adjust="true" )
|
198
|
+
|
199
|
+
app = ::AwsMust::AwsMust.new( options )
|
200
|
+
app.json( yaml_file, with_adjust =~ /^true$/ || with_adjust =~ /^yes$/ ? true : false )
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
|
205
|
+
# ------------------------------------------------------------------
|
206
|
+
# action 'gen'
|
207
|
+
|
208
|
+
desc "gen <yaml_file> [<template_name>]", "Generate CloudFormation JSON template"
|
209
|
+
|
210
|
+
shared_options :template_path
|
211
|
+
shared_options :mustaches
|
212
|
+
shared_options :template_gem
|
213
|
+
|
214
|
+
long_desc <<-LONGDESC
|
215
|
+
|
216
|
+
Generate Amazon CloudFormation JSON file for <yaml_file> using
|
217
|
+
<template_name> in ':template_path' -directory.
|
218
|
+
|
219
|
+
<template_name> defaults to '#{DEAFAULT_TEMPLATE}'
|
220
|
+
|
221
|
+
LONGDESC
|
222
|
+
|
223
|
+
|
224
|
+
def gen( yaml_file, template_name=DEAFAULT_TEMPLATE )
|
225
|
+
|
226
|
+
my_options = option_adjust_common( options )
|
227
|
+
|
228
|
+
app = ::AwsMust::AwsMust.new( my_options )
|
229
|
+
app.generate( template_name, yaml_file, my_options )
|
230
|
+
|
231
|
+
end
|
232
|
+
|
233
|
+
# ------------------------------------------------------------------
|
234
|
+
# common routines
|
235
|
+
no_commands do
|
236
|
+
|
237
|
+
def option_adjust_common( options )
|
238
|
+
|
239
|
+
raise "No optios given" unless options
|
240
|
+
|
241
|
+
# options readonly - dup allows modification
|
242
|
+
options = options.dup
|
243
|
+
|
244
|
+
@logger.debug( "#{__method__}, options '#{options}'" )
|
245
|
+
|
246
|
+
options = option_template_gem_to_template_path( options ) if options[:template_gem]
|
247
|
+
options = option_template_path( options ) if options[:template_path]
|
248
|
+
|
249
|
+
warn <<-EOS unless options[:mustaches] && options[:mustaches].any?
|
250
|
+
|
251
|
+
Deprecation!!
|
252
|
+
|
253
|
+
Use option -m to define location of templates
|
254
|
+
|
255
|
+
Options -g and -t deprecated
|
256
|
+
EOS
|
257
|
+
|
258
|
+
options = option_mustaches_to_template_paths( options ) if options[:mustaches]
|
259
|
+
|
260
|
+
return options
|
261
|
+
end
|
262
|
+
|
263
|
+
# set `options[:template_path]` to an array of local directory
|
264
|
+
# paths parsed from list of options[:mustaches]
|
265
|
+
def option_mustaches_to_template_paths( options )
|
266
|
+
|
267
|
+
# init, NB: plural
|
268
|
+
options[:template_paths] = []
|
269
|
+
|
270
|
+
options[:mustaches].each do |mustache_def|
|
271
|
+
if mustache_def[-1] == '/' then
|
272
|
+
# directory with last char removed
|
273
|
+
options[:template_paths] << mustache_def[0..-1]
|
274
|
+
else
|
275
|
+
# gemname
|
276
|
+
options[:template_paths] << gem_name_to_template_path( mustache_def )
|
277
|
+
end
|
278
|
+
|
279
|
+
end
|
280
|
+
return options
|
281
|
+
end
|
282
|
+
|
283
|
+
# overrides -m option
|
284
|
+
def option_template_path( options )
|
285
|
+
# overrides -m option
|
286
|
+
options[:mustaches] = []
|
287
|
+
return options
|
288
|
+
end
|
289
|
+
|
290
|
+
# set 'options[:template_path]' to mustache directory withing
|
291
|
+
# `options[:template_gem]` Gem
|
292
|
+
def option_template_gem_to_template_path( options )
|
293
|
+
|
294
|
+
# overrides -m option
|
295
|
+
options[:mustaches] = []
|
296
|
+
|
297
|
+
options[:template_path] = gem_name_to_template_path( options[:template_gem] )
|
298
|
+
|
299
|
+
return options
|
300
|
+
|
301
|
+
end
|
302
|
+
|
303
|
+
# map 'gem_name_and_spec' to path of mustache templates
|
304
|
+
def gem_name_to_template_path( gem_name_and_spec )
|
305
|
+
|
306
|
+
# The version requirements are optional.
|
307
|
+
# You can also specify multiple version requirements, just append more at the end
|
308
|
+
gem_spec = gem_name_and_spec.split(',')
|
309
|
+
gem_name, *gem_ver_reqs = gem_spec[0], gem_spec[1]
|
310
|
+
@logger.debug( "#{__method__}, gem_name=#{gem_name}, *gem_ver_reqs=#{gem_ver_reqs}" )
|
311
|
+
gdep = Gem::Dependency.new(gem_name, *gem_ver_reqs)
|
312
|
+
# find latest that satisifies
|
313
|
+
found_gspec = gdep.matching_specs.sort_by(&:version).last
|
314
|
+
@logger.debug( "#{__method__}, found_gspec=#{found_gspec}" )
|
315
|
+
# instead of using Gem::Dependency, you can also do:
|
316
|
+
# Gem::Specification.find_all_by_name(gem_name, *gem_ver_reqs)
|
317
|
+
|
318
|
+
if found_gspec
|
319
|
+
@logger.debug( "#{__method__}, Requirement '#{gdep}' already satisfied by #{found_gspec.name}-#{found_gspec.version}" )
|
320
|
+
@logger.debug( "#{__method__}, old-options=#{options}" )
|
321
|
+
template_path = "#{found_gspec.gem_dir}/mustache"
|
322
|
+
@logger.debug( "#{__method__}, template_path=#{template_path}" )
|
323
|
+
else
|
324
|
+
#puts "Requirement '#{gdep}' not satisfied; installing..."
|
325
|
+
# ver_args = gdep.requirements_list.map{|s| ['-v', s] }.flatten
|
326
|
+
# # multi-arg is safer, to avoid injection attacks
|
327
|
+
# system('gem', 'install', gem_name, *ver_args)
|
328
|
+
raise "Could not find gem '#{gdep}' - try 'gem install #{gdep}'"
|
329
|
+
end
|
330
|
+
|
331
|
+
return template_path
|
332
|
+
|
333
|
+
end
|
334
|
+
|
335
|
+
end # no commands
|
336
|
+
|
337
|
+
end
|
338
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-must
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jarjuk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mustache
|
@@ -101,7 +101,9 @@ files:
|
|
101
101
|
- lib/aws-must.rb
|
102
102
|
- lib/aws-must/aws-must.rb
|
103
103
|
- lib/aws-must/docu.rb
|
104
|
+
- lib/aws-must/fileprovider.rb
|
104
105
|
- lib/aws-must/template.rb
|
106
|
+
- lib/cli/aws-must-cli.rb
|
105
107
|
- lib/tasks/demo.rake
|
106
108
|
- lib/utils/hasher.rb
|
107
109
|
- lib/utils/logger.rb
|
@@ -131,3 +133,4 @@ signing_key:
|
|
131
133
|
specification_version: 4
|
132
134
|
summary: Minimum Viable Solution to Manage CloudFormation Templates'
|
133
135
|
test_files: []
|
136
|
+
has_rdoc:
|