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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a89e4f19981be58c78f515a9d3889e6695720d6
4
- data.tar.gz: 41c80d1691b6bf92c52aca43468860bec24168c9
3
+ metadata.gz: c43cabdbb5f495f514c1ebc4a349558b5c9d8333
4
+ data.tar.gz: d5440442930fa154a50f53499b29f33c7caeac69
5
5
  SHA512:
6
- metadata.gz: 0f1f7fb12c993d004a14959af5cecdb101345ba852efc4a1bd63964913e05e4f312e4b1bd179208a0de3db5a0a2837937daa72a2a6b997d5d63b85d1ab7d7e35
7
- data.tar.gz: c5ede7352a5379fd501bb33dcb332a552c0fbf02da632f775f41db80436aa5491a9c98a0e07016da3723933071fb1259a6e44231b7bf199c6bde1b6ad36f1158
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.12 (Next Release)
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
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rubycfn (0.1.11)
4
+ rubycfn (0.2.0)
5
5
  activesupport (~> 5.1.5)
6
6
  dotenv (~> 2.4.0)
7
7
  json (~> 2.1.0)
data/README.md CHANGED
@@ -12,7 +12,7 @@ or, create a Gemfile with this content:
12
12
  ```
13
13
  source "https://rubygems.org"
14
14
 
15
- gem "rubycfn", "~> 0.1.10"
15
+ gem "rubycfn", "~> 0.2.0"
16
16
 
17
17
  ```
18
18
 
@@ -1,4 +1,4 @@
1
1
  # Rubycfn version
2
2
  module Rubycfn
3
- VERSION = "0.1.11"
3
+ VERSION = "0.2.0"
4
4
  end
data/lib/rubycfn.rb CHANGED
@@ -13,7 +13,10 @@ require "rubycfn/version"
13
13
  @properties = {}
14
14
  @mappings = {}
15
15
  @conditions = {}
16
- @resources = {}
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 = TOPLEVEL_BINDING.eval("'#{name}'.cfnize")
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
- name = name.to_s.cfnize
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
- res = {
319
- "#{name.to_s}#{i == 0 ? "" : resource_postpend}": {
320
- DependsOn: TOPLEVEL_BINDING.eval("@depends_on"),
321
- Properties: TOPLEVEL_BINDING.eval("@properties"),
322
- Type: arguments[:type],
323
- Condition: arguments[:condition]
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
- TOPLEVEL_BINDING.eval("@resources = @resources.deep_merge(#{res})")
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
- skeleton = { "AWSTemplateFormatVersion": "2010-09-09" }
341
- skeleton = JSON.parse(skeleton.to_json)
342
- skeleton.merge!(Description: TOPLEVEL_BINDING.eval("@description"))
343
- skeleton.merge!(Mappings: sort_json(TOPLEVEL_BINDING.eval("@mappings")))
344
- skeleton.merge!(Parameters: sort_json(TOPLEVEL_BINDING.eval("@parameters")))
345
- skeleton.merge!(Conditions: sort_json(TOPLEVEL_BINDING.eval("@conditions")))
346
- skeleton.merge!(Resources: sort_json(TOPLEVEL_BINDING.eval("@resources")))
347
- skeleton.merge!(Outputs: sort_json(TOPLEVEL_BINDING.eval("@outputs")))
348
- TOPLEVEL_BINDING.eval("@variables = @resources = @outputs = @properties = @mappings = @parameters = {}")
349
- TOPLEVEL_BINDING.eval("@depends_on = []")
350
- TOPLEVEL_BINDING.eval("@description = ''")
351
- JSON.pretty_generate(skeleton.recursive_compact)
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
@@ -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
- stacks[mod.to_sym] = send("include", Object.const_get(mod)).render_template
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubycfn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dennis Vink