rubycfn 0.1.11 → 0.2.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 +4 -4
- data/CHANGELOG.md +5 -1
- data/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/lib/rubycfn/version.rb +1 -1
- data/lib/rubycfn.rb +68 -24
- data/templates/compile.rb.erb +10 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c43cabdbb5f495f514c1ebc4a349558b5c9d8333
|
4
|
+
data.tar.gz: d5440442930fa154a50f53499b29f33c7caeac69
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47448e9fa021ecb199521f3550d1c4f5b505dc6c34700dea376518f5972416601852f73f716372010e90d19fa3e7afe71b222eadcdf14a3e63099bc12f39e786
|
7
|
+
data.tar.gz: d27ca79b9e457f496e5435e659845df1870a9fb140806a4f777d991d88fae306d685b7c47a70acb92989d125b229df88abd1b6692fc8833e5fb288f760c2c838
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,11 @@
|
|
2
2
|
All notable changes to Rubycfn will be documented in this file.
|
3
3
|
This project uses [Semantic Versioning](http://semver.org/).
|
4
4
|
|
5
|
-
## 0.1
|
5
|
+
## 0.2.1 (Next Release)
|
6
|
+
|
7
|
+
## 0.2.0
|
8
|
+
* Added support for GCP templates -- [@dennisvink][@dennisvink]
|
9
|
+
* No camel casing property and resource names if type is String instead of Symbol -- [@dennisvink][@dennisvink]
|
6
10
|
|
7
11
|
## 0.1.11
|
8
12
|
* Added small script to convert a CloudFormation template to Rubycfn code -- [@dennisvink][@dennisvink]
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
data/lib/rubycfn/version.rb
CHANGED
data/lib/rubycfn.rb
CHANGED
@@ -13,7 +13,10 @@ require "rubycfn/version"
|
|
13
13
|
@properties = {}
|
14
14
|
@mappings = {}
|
15
15
|
@conditions = {}
|
16
|
-
@
|
16
|
+
@AWSresources = {}
|
17
|
+
@GCPresources = []
|
18
|
+
@MSFresources = {}
|
19
|
+
@imports = []
|
17
20
|
@resource_name = ""
|
18
21
|
@variables = {}
|
19
22
|
@global_variables = {}
|
@@ -271,6 +274,10 @@ module Rubycfn
|
|
271
274
|
end
|
272
275
|
end
|
273
276
|
|
277
|
+
def self.import(gcp_import)
|
278
|
+
TOPLEVEL_BINDING.eval("@imports.push(#{gcp_import})")
|
279
|
+
end
|
280
|
+
|
274
281
|
def self.depends_on(resources)
|
275
282
|
case resources
|
276
283
|
when String
|
@@ -293,7 +300,11 @@ module Rubycfn
|
|
293
300
|
end
|
294
301
|
|
295
302
|
def self.property(name, index = 0, &block)
|
296
|
-
name
|
303
|
+
if name.class == Symbol
|
304
|
+
name = TOPLEVEL_BINDING.eval("'#{name}'.cfnize")
|
305
|
+
else
|
306
|
+
name = TOPLEVEL_BINDING.eval("'#{name}'")
|
307
|
+
end
|
297
308
|
res = { "#{name}": yield(block) }
|
298
309
|
TOPLEVEL_BINDING.eval("@properties = @properties.deep_merge(#{res})")
|
299
310
|
end
|
@@ -301,7 +312,19 @@ module Rubycfn
|
|
301
312
|
def self.resource(name, arguments, &block)
|
302
313
|
arguments[:amount] ||= 1
|
303
314
|
origname = name.to_s
|
304
|
-
|
315
|
+
# Allow for non-camelcased resource names
|
316
|
+
if name.class == Symbol
|
317
|
+
name = name.to_s.cfnize
|
318
|
+
else
|
319
|
+
name = name.to_s
|
320
|
+
end
|
321
|
+
arguments[:type] =~ /^([A-Za-z0-9]*)\:\:/
|
322
|
+
arguments[:cloud] ||= $1
|
323
|
+
|
324
|
+
# Custom resource types are AWS resources
|
325
|
+
if arguments[:cloud] == "Custom" || arguments[:cloud] == "Rspec"
|
326
|
+
arguments[:cloud] = "AWS"
|
327
|
+
end
|
305
328
|
arguments[:amount].times do |i|
|
306
329
|
resource_suffix = i == 0 ? "" : "#{i+1}"
|
307
330
|
if arguments[:type].class == Module
|
@@ -315,15 +338,24 @@ module Rubycfn
|
|
315
338
|
TOPLEVEL_BINDING.eval("@resource_name = ''")
|
316
339
|
end
|
317
340
|
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
341
|
+
if arguments[:cloud] == "AWS"
|
342
|
+
res = {
|
343
|
+
"#{name.to_s}#{i == 0 ? "" : resource_postpend}": {
|
344
|
+
DependsOn: TOPLEVEL_BINDING.eval("@depends_on"),
|
345
|
+
Properties: TOPLEVEL_BINDING.eval("@properties"),
|
346
|
+
Type: arguments[:type],
|
347
|
+
Condition: arguments[:condition]
|
348
|
+
}
|
349
|
+
}
|
350
|
+
TOPLEVEL_BINDING.eval("@AWSresources = @AWSresources.deep_merge(#{res})")
|
351
|
+
elsif arguments[:cloud] == "GCP"
|
352
|
+
res = {
|
353
|
+
"name": "#{name.to_s}",
|
354
|
+
"type": "#{arguments[:type].to_s.gsub(/GCP::/, "")}",
|
355
|
+
"properties": TOPLEVEL_BINDING.eval("@properties")
|
324
356
|
}
|
325
|
-
|
326
|
-
|
357
|
+
TOPLEVEL_BINDING.eval("@GCPresources.push(#{res})")
|
358
|
+
end
|
327
359
|
end
|
328
360
|
TOPLEVEL_BINDING.eval("@depends_on = []")
|
329
361
|
TOPLEVEL_BINDING.eval("@properties = {}")
|
@@ -336,19 +368,31 @@ module Rubycfn
|
|
336
368
|
)
|
337
369
|
end
|
338
370
|
|
339
|
-
def self.render_template
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
371
|
+
def self.render_template(type = "AWS")
|
372
|
+
case type
|
373
|
+
when "AWS"
|
374
|
+
skeleton = { "AWSTemplateFormatVersion": "2010-09-09" }
|
375
|
+
skeleton = JSON.parse(skeleton.to_json)
|
376
|
+
skeleton.merge!(Description: TOPLEVEL_BINDING.eval("@description"))
|
377
|
+
skeleton.merge!(Mappings: sort_json(TOPLEVEL_BINDING.eval("@mappings")))
|
378
|
+
skeleton.merge!(Parameters: sort_json(TOPLEVEL_BINDING.eval("@parameters")))
|
379
|
+
skeleton.merge!(Conditions: sort_json(TOPLEVEL_BINDING.eval("@conditions")))
|
380
|
+
skeleton.merge!(Resources: sort_json(TOPLEVEL_BINDING.eval("@AWSresources")))
|
381
|
+
skeleton.merge!(Outputs: sort_json(TOPLEVEL_BINDING.eval("@outputs")))
|
382
|
+
TOPLEVEL_BINDING.eval("@variables = @AWSresources = @outputs = @properties = @mappings = @parameters = {}")
|
383
|
+
TOPLEVEL_BINDING.eval("@depends_on = []")
|
384
|
+
TOPLEVEL_BINDING.eval("@description = ''")
|
385
|
+
JSON.pretty_generate(skeleton.recursive_compact)
|
386
|
+
when "GCP"
|
387
|
+
gcp_skeleton = {}
|
388
|
+
gcp_skeleton = JSON.parse(gcp_skeleton.to_json)
|
389
|
+
gcp_skeleton.merge!(imports: TOPLEVEL_BINDING.eval("@imports"))
|
390
|
+
gcp_skeleton.merge!(resources: sort_json(TOPLEVEL_BINDING.eval("@GCPresources")))
|
391
|
+
TOPLEVEL_BINDING.eval("@variables = @outputs = @properties = @mappings = @parameters = {}")
|
392
|
+
TOPLEVEL_BINDING.eval("@imports = @GCPresources = @depends_on = []")
|
393
|
+
TOPLEVEL_BINDING.eval("@description = ''")
|
394
|
+
JSON.pretty_generate(gcp_skeleton.recursive_compact)
|
395
|
+
end
|
352
396
|
end
|
353
397
|
end
|
354
398
|
end
|
data/templates/compile.rb.erb
CHANGED
@@ -2,11 +2,15 @@ require 'fileutils'
|
|
2
2
|
|
3
3
|
FileUtils.mkdir_p 'build'
|
4
4
|
|
5
|
+
google_stacks = {}
|
5
6
|
stacks = {}
|
7
|
+
|
6
8
|
Module.constants.select do |mod|
|
7
9
|
if mod =~ /Stack$/
|
8
10
|
send("include", Object.const_get("SharedConcerns"))
|
9
|
-
|
11
|
+
google_stacks[mod.to_sym] = send("include", Object.const_get(mod)).render_template("GCP")
|
12
|
+
send("include", Object.const_get("SharedConcerns"))
|
13
|
+
stacks[mod.to_sym] = send("include", Object.const_get(mod)).render_template("AWS")
|
10
14
|
end
|
11
15
|
end
|
12
16
|
|
@@ -14,3 +18,8 @@ stacks.each do |stack_name, stack|
|
|
14
18
|
puts "- Saved #{stack_name} to build/#{ENV["ENVIRONMENT"]}-#{stack_name.downcase}.json"
|
15
19
|
File.open("build/#{ENV["ENVIRONMENT"]}-#{stack_name.downcase}.json", "w") { |f| f.write(stack) }
|
16
20
|
end
|
21
|
+
|
22
|
+
google_stacks.each do |stack_name, stack|
|
23
|
+
puts "- Saved #{stack_name} to build/#{ENV["ENVIRONMENT"]}-gcp-#{stack_name.downcase}.json"
|
24
|
+
File.open("build/#{ENV["ENVIRONMENT"]}-gcp-#{stack_name.downcase}.json", "w") { |f| f.write(stack) }
|
25
|
+
end
|