rubycfn 0.3.7 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 85ac61bfe1b03a66e40625c1b060e1bb95cbbe22
4
- data.tar.gz: 9f15208720740bf70662579c0e59dd211ac94376
3
+ metadata.gz: 3a67c783ed3a9632618ffe3feab06c75fdfc7539
4
+ data.tar.gz: 1166d0dee1db9009e259e51eb4e069c84c6e0047
5
5
  SHA512:
6
- metadata.gz: 8495e7b2a758bddddd44b2c343f4ed36208dcaa350549cdf635cd460da63fd68094fb294630e9dd187d0d296e9a7f2c0cc2dc9e93a639ef3bef1c14af8819e61
7
- data.tar.gz: f7f4cace496dec204bf5ae8bc7ec0c1e149d351fab3d8ed05b3f28af500c4c5a3b847ea990588529ad1c8d06d02480ff53fd895baf649e8bc67bc654a7884513
6
+ metadata.gz: 8cbb3b83362fd9705f289e4c5fa098cd91d9d34c74d1f7c145e2cda7c131336280ea6f883fe2ff630d366bd28fb6388ce7d0cbc7f2aa36958e9940b55b768717
7
+ data.tar.gz: b1f803072f2bdf77d5e032c689f93252608fa31130cf8f0dc3431b4202b06e3d570d08d36e359415c035208d86f0384902545f574ebd4fd33e79b5c3cfaba6a4
data/.rubocop.yml ADDED
@@ -0,0 +1,114 @@
1
+ AllCops:
2
+ TargetRubyVersion: 2.3
3
+
4
+ DisplayCopNames: true
5
+ Include:
6
+ - "Gemfile"
7
+ - "Rakefile"
8
+ - "bin/*"
9
+ - "*.gemspec"
10
+ - "lib/**/*.rb"
11
+ Exclude:
12
+ - "lib/core/monkeypatch.rb"
13
+ - "test/**/*.rb"
14
+ - "spec/**/*.rb"
15
+ - "attic/**/*"
16
+
17
+ Metrics/AbcSize:
18
+ Max: 500
19
+ Exclude:
20
+ - "test/**/*"
21
+ - "spec/**/*"
22
+
23
+ Metrics/ClassLength:
24
+ Max: 500
25
+ Exclude:
26
+ - "test/**/*"
27
+ - "spec/**/*"
28
+
29
+ Metrics/CyclomaticComplexity:
30
+ Max: 40
31
+ Exclude:
32
+ - "test/**/*"
33
+ - "spec/**/*"
34
+
35
+ Metrics/PerceivedComplexity:
36
+ Max: 40
37
+ Exclude:
38
+ - "test/**/*"
39
+ - "spec/**/*"
40
+
41
+ Layout/SpaceInsideHashLiteralBraces:
42
+ EnforcedStyle: space
43
+
44
+ Metrics/LineLength:
45
+ Max: 500
46
+ Exclude:
47
+ - "test/**/*"
48
+ - "spec/**/*"
49
+
50
+ Metrics/ModuleLength:
51
+ Max: 500
52
+
53
+ Metrics/MethodLength:
54
+ Max: 40
55
+
56
+ Metrics/BlockLength:
57
+ Max: 500
58
+
59
+ Performance/Casecmp:
60
+ Enabled: false
61
+
62
+ Style/DoubleNegation:
63
+ Enabled: false
64
+
65
+ Style/StringLiterals:
66
+ EnforcedStyle: double_quotes
67
+
68
+ Style/StringLiteralsInInterpolation:
69
+ EnforcedStyle: double_quotes
70
+
71
+ Style/Next:
72
+ Enabled: false
73
+
74
+ Style/FrozenStringLiteralComment:
75
+ Enabled: false
76
+
77
+ Security/MarshalLoad:
78
+ Enabled: false
79
+
80
+ Style/PercentLiteralDelimiters:
81
+ PreferredDelimiters:
82
+ default: '()'
83
+ '%i': '()'
84
+ '%w': '()'
85
+
86
+ Style/Alias:
87
+ Enabled: false
88
+
89
+ Style/ClassAndModuleChildren:
90
+ Enabled: false
91
+
92
+ Style/Documentation:
93
+ Enabled: false
94
+
95
+ Style/ExpandPathArguments:
96
+ Enabled: false
97
+
98
+ Style/IfUnlessModifier:
99
+ Enabled: false
100
+
101
+ Style/DateTime:
102
+ Enabled: false
103
+
104
+ Style/MissingRespondToMissing:
105
+ Enabled: false
106
+
107
+ Style/NestedTernaryOperator:
108
+ Enabled: false
109
+
110
+ Style/PerlBackrefs:
111
+ Enabled: false
112
+
113
+ Style/RescueStandardError:
114
+ EnforcedStyle: "implicit"
data/CHANGELOG.md CHANGED
@@ -2,7 +2,12 @@
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.3.8 (Next Release)
5
+ ## 0.3.9 (Next Release)
6
+
7
+ ## 0.3.8
8
+
9
+ * Added Fn::Transform intrinsic function `.fntransform` -- [@dennisvink][@dennisvink]
10
+ * Refactored some code -- [@dennisvink][@dennisvink]
6
11
 
7
12
  ## 0.3.7
8
13
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rubycfn (0.3.7)
4
+ rubycfn (0.3.8)
5
5
  activesupport (~> 5.1.5)
6
6
  dotenv (~> 2.4.0)
7
7
  json (~> 2.1.0)
data/README.md CHANGED
@@ -61,7 +61,7 @@ __________ ____ __________________.___._________ _____________________
61
61
  | _/ | /| | _// | |/ \ \/ | __) | | _/
62
62
  | | \ | / | | \\____ |\ \____| \ | | \
63
63
  |____|_ /______/ |______ // ______| \______ /\___ / |______ /
64
- \/ \/ \/ \/ \/ \/ [v0.3.7]
64
+ \/ \/ \/ \/ \/ \/ [v0.3.8]
65
65
  Project name? example
66
66
  Account ID? 1234567890
67
67
  Select region EU (Frankfurt)
data/bin/rubycfn CHANGED
@@ -1,18 +1,20 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "erb"
4
- require 'fileutils'
5
- require 'ostruct'
4
+ require "fileutils"
5
+ require "ostruct"
6
6
  require "tty-prompt"
7
7
  require "rubycfn/version"
8
8
 
9
9
  require_relative "../lib/cli_methods"
10
10
 
11
- if ARGV.first || (ARGF.filename != "-" or (not STDIN.tty? and not STDIN.closed?))
11
+ # rubocop:disable Style/AndOr
12
+ if ARGV.first || (ARGF.filename != "-" or (not STDIN.tty? and not STDIN.closed?)) # rubocop:disable Style/Not
12
13
  require "rubycfn"
13
14
  require "active_support/concern"
14
15
  module RubycfnStack
15
- if (ARGF.filename != "-" or (not STDIN.tty? and not STDIN.closed?))
16
+ if ARGF.filename != "-" or (not STDIN.tty? and not STDIN.closed?) # rubocop:disable Style/Not
17
+ # rubocop:enable Style/AndOr
16
18
  contents = []
17
19
  ARGF.each_line do |line|
18
20
  contents.push(line)
@@ -25,10 +27,10 @@ if ARGV.first || (ARGF.filename != "-" or (not STDIN.tty? and not STDIN.closed?)
25
27
  extend ActiveSupport::Concern
26
28
  include Rubycfn
27
29
  included do
28
- eval(contents)
30
+ eval(contents) # rubocop:disable Security/Eval
29
31
  end
30
32
  end
31
- cfn = include RubycfnStack
33
+ cfn = include RubycfnStack # rubocop:disable Style/MixinUsage
32
34
  puts cfn.render_template
33
35
  exit
34
36
  end
@@ -37,97 +39,98 @@ path = File.expand_path(File.dirname(File.dirname(__FILE__)))
37
39
  puts rubycfn_banner(Rubycfn::VERSION)
38
40
  prompt = TTY::Prompt.new
39
41
 
40
- project_name = prompt.ask('Project name?', default: 'example') do |q|
41
- q.validate(/^([a-z0-9]*)$/, 'Invalid project name')
42
+ project_name = prompt.ask("Project name?", default: "example") do |q|
43
+ q.validate(/^([a-z0-9]*)$/, "Invalid project name")
42
44
  end
43
45
 
44
- project_path = project_name + '-rubycfn'
46
+ project_path = project_name + "-rubycfn"
45
47
 
46
- account_id = prompt.ask('AWS Account ID?', default: '1234567890') do |q|
47
- q.validate(/^([0-9]*)$/, 'Invalid account id')
48
+ account_id = prompt.ask("AWS Account ID?", default: "1234567890") do |q|
49
+ q.validate(/^([0-9]*)$/, "Invalid account id")
48
50
  end
49
51
 
50
52
  region = prompt.select(
51
53
  "Select AWS region", aws_regions
52
54
  )
53
55
 
54
- dotenv = render('.env', {
55
- :project_name => project_name,
56
- :account_id => account_id,
57
- :region => region
58
- }, path)
56
+ render_args = {
57
+ project_name: project_name,
58
+ account_id: account_id,
59
+ region: region
60
+ }
59
61
 
60
- aws_sdk = render('aws_sdk.rb', {}, path)
61
- compiler = render('compiler.rb', {}, path)
62
- core_deploy = render('core_deploy.rb', { name: project_name }, path)
63
- core_upload = render('core_upload.rb', {}, path)
64
- core_compile = render('core_compile.rb', {}, path)
65
- core_diff = render('core_diff.rb', {}, path)
66
- dependencies = render('dependencies.rb', {}, path)
67
- deploy = render('deploy.rb', {}, path)
68
- dotenv_test = render('.env.test', { name: project_name }, path)
69
- dotenv_production = render('.env.production', { name: project_name }, path)
70
- dotenv_rspec = render('.env.rspec', { name: project_name }, path)
71
- ecs_stack = render('ecs_stack.rb', {}, path)
72
- ecs_stack_concern = render('ecs_Stack_concern.rb', { name: project_name }, path)
73
- gemfile = render('Gemfile', { version: Rubycfn::VERSION }, path)
74
- gitignore = render('.gitignore', {}, path)
75
- global_variables = render('global_variables.rb', { name: project_name.downcase }, path)
76
- helpers = render('helpers.rb', {}, path)
77
- helper_methods = render('helper_methods.rb', {}, path)
78
- main = render('main.rb', {}, path)
79
- main_aws_helper = render('main_aws_helper.rb', {}, path)
80
- parent_spec = render('parent_stack_spec.rb', { name: project_name.capitalize }, path)
81
- project_concern = render('project_concern.rb', { name: project_name.capitalize }, path)
82
- project_stack = render('project_stack.rb', { name: project_name.capitalize }, path)
83
- rakefile = render('Rakefile', {}, path)
84
- rubocop = render('.rubocop.yml', {}, path)
85
- shared_methods = render('shared_methods.rb', {}, path)
86
- spec_helper = render('spec_helper.rb', {}, path)
87
- subnets = render('subnets.rb', { name: project_name }, path)
88
- upload_stack = render('upload_stack.rb', {}, path)
89
- vpc_stack = render('vpc_stack.rb', { name: project_name }, path)
90
- vpc_concern = render('vpc_concerns.rb', { name: project_name }, path)
91
- vpc_spec = render('vpc_spec.rb', { name: project_name.capitalize }, path)
62
+ dotenv = render(".env", render_args, path)
63
+ aws_sdk = render("aws_sdk.rb", {}, path)
64
+ compiler = render("compiler.rb", {}, path)
65
+ core_deploy = render("core_deploy.rb", { name: project_name }, path)
66
+ core_upload = render("core_upload.rb", {}, path)
67
+ core_compile = render("core_compile.rb", {}, path)
68
+ core_diff = render("core_diff.rb", {}, path)
69
+ dependencies = render("dependencies.rb", {}, path)
70
+ deploy = render("deploy.rb", {}, path)
71
+ dotenv_test = render(".env.test", { name: project_name }, path)
72
+ dotenv_production = render(".env.production", { name: project_name }, path)
73
+ dotenv_rspec = render(".env.rspec", { name: project_name }, path)
74
+ ecs_stack = render("ecs_stack.rb", {}, path)
75
+ ecs_stack_concern = render("ecs_Stack_concern.rb", { name: project_name }, path)
76
+ gemfile = render("Gemfile", { version: Rubycfn::VERSION }, path)
77
+ gitignore = render(".gitignore", {}, path)
78
+ global_variables = render("global_variables.rb", { name: project_name.downcase }, path)
79
+ helpers = render("helpers.rb", {}, path)
80
+ helper_methods = render("helper_methods.rb", {}, path)
81
+ main = render("main.rb", {}, path)
82
+ main_aws_helper = render("main_aws_helper.rb", {}, path)
83
+ parent_spec = render("parent_stack_spec.rb", { name: project_name.capitalize }, path)
84
+ project_concern = render("project_concern.rb", { name: project_name.capitalize }, path)
85
+ project_stack = render("project_stack.rb", { name: project_name.capitalize }, path)
86
+ rakefile = render("Rakefile", {}, path)
87
+ rubocop = render(".rubocop.yml", {}, path)
88
+ shared_methods = render("shared_methods.rb", {}, path)
89
+ spec_helper = render("spec_helper.rb", {}, path)
90
+ subnets = render("subnets.rb", { name: project_name }, path)
91
+ upload_stack = render("upload_stack.rb", {}, path)
92
+ vpc_stack = render("vpc_stack.rb", { name: project_name }, path)
93
+ vpc_concern = render("vpc_concerns.rb", { name: project_name }, path)
94
+ vpc_spec = render("vpc_spec.rb", { name: project_name.capitalize }, path)
92
95
 
93
96
  # Create directory structure
94
97
  rubycfn_structure(project_path).each do |dir|
95
98
  FileUtils.mkdir_p dir
96
99
  end
97
100
 
98
- File.open("#{project_path}/lib/aws_helper/aws_sdk.rb", 'w') { |file| file.write(aws_sdk) }
99
- File.open("#{project_path}/lib/aws_helper/compiler.rb", 'w') { |file| file.write(compiler) }
100
- File.open("#{project_path}/lib/aws_helper/dependencies.rb", 'w') { |file| file.write(dependencies) }
101
- File.open("#{project_path}/lib/aws_helper/deploy.rb", 'w') { |file| file.write(deploy) }
102
- File.open("#{project_path}/lib/core/deploy.rb", 'w') { |file| file.write(core_deploy) }
103
- File.open("#{project_path}/lib/core/compile.rb", 'w') { |file| file.write(core_compile) }
104
- File.open("#{project_path}/lib/core/diff.rb", 'w') { |file| file.write(core_diff) }
105
- File.open("#{project_path}/lib/core/upload.rb", 'w') { |file| file.write(core_upload) }
106
- File.open("#{project_path}/.env", 'w') { |file| file.write(dotenv) }
107
- File.open("#{project_path}/.env.test", 'w') { |file| file.write(dotenv_test) }
108
- File.open("#{project_path}/.env.production", 'w') { |file| file.write(dotenv_production) }
109
- File.open("#{project_path}/.env.rspec", 'w') { |file| file.write(dotenv_rspec) }
110
- File.open("#{project_path}/lib/stacks/ecs_stack.rb", 'w') { |file| file.write(ecs_stack) }
111
- File.open("#{project_path}/lib/stacks/ecs_stack/ecs_cluster.rb", 'w') { |file| file.write(ecs_stack_concern) }
112
- File.open("#{project_path}/Gemfile", 'w') { |file| file.write(gemfile) }
113
- File.open("#{project_path}/.gitignore", 'w') { |file| file.write(gitignore) }
114
- File.open("#{project_path}/lib/shared_concerns/global_variables.rb", 'w') { |file| file.write(global_variables) }
115
- File.open("#{project_path}/lib/aws_helper/helpers.rb", 'w') { |file| file.write(helpers) }
116
- File.open("#{project_path}/lib/shared_concerns/helper_methods.rb", 'w') { |file| file.write(helper_methods) }
117
- File.open("#{project_path}/lib/main.rb", 'w') { |file| file.write(main) }
118
- File.open("#{project_path}/lib/aws_helper/main.rb", 'w') { |file| file.write(main_aws_helper) }
119
- File.open("#{project_path}/spec/lib/parent_spec.rb", 'w') { |file| file.write(parent_spec) }
120
- File.open("#{project_path}/lib/stacks/parent_stack.rb", 'w') { |file| file.write(project_stack) }
121
- File.open("#{project_path}/lib/stacks/parent_stack/parent.rb", 'w') { |file| file.write(project_concern) }
122
- File.open("#{project_path}/Rakefile", 'w') { |file| file.write(rakefile) }
123
- File.open("#{project_path}/.rubocop.yml", 'w') { |file| file.write(rubocop) }
124
- File.open("#{project_path}/lib/shared_concerns/shared_methods.rb", 'w') { |file| file.write(shared_methods) }
125
- File.open("#{project_path}/spec/spec_helper.rb", 'w') { |file| file.write(spec_helper) }
126
- File.open("#{project_path}/lib/stacks/vpc_stack/subnets.rb", 'w') { |file| file.write(subnets) }
127
- File.open("#{project_path}/lib/aws_helper/upload_stack.rb", 'w') { |file| file.write(upload_stack) }
128
- File.open("#{project_path}/spec/lib/vpc_spec.rb", 'w') { |file| file.write(vpc_spec) }
129
- File.open("#{project_path}/lib/stacks/vpc_stack.rb", 'w') { |file| file.write(vpc_stack) }
130
- File.open("#{project_path}/lib/stacks/vpc_stack/vpc.rb", 'w') { |file| file.write(vpc_concern) }
101
+ File.open("#{project_path}/lib/aws_helper/aws_sdk.rb", "w") { |file| file.write(aws_sdk) }
102
+ File.open("#{project_path}/lib/aws_helper/compiler.rb", "w") { |file| file.write(compiler) }
103
+ File.open("#{project_path}/lib/aws_helper/dependencies.rb", "w") { |file| file.write(dependencies) }
104
+ File.open("#{project_path}/lib/aws_helper/deploy.rb", "w") { |file| file.write(deploy) }
105
+ File.open("#{project_path}/lib/core/deploy.rb", "w") { |file| file.write(core_deploy) }
106
+ File.open("#{project_path}/lib/core/compile.rb", "w") { |file| file.write(core_compile) }
107
+ File.open("#{project_path}/lib/core/diff.rb", "w") { |file| file.write(core_diff) }
108
+ File.open("#{project_path}/lib/core/upload.rb", "w") { |file| file.write(core_upload) }
109
+ File.open("#{project_path}/.env", "w") { |file| file.write(dotenv) }
110
+ File.open("#{project_path}/.env.test", "w") { |file| file.write(dotenv_test) }
111
+ File.open("#{project_path}/.env.production", "w") { |file| file.write(dotenv_production) }
112
+ File.open("#{project_path}/.env.rspec", "w") { |file| file.write(dotenv_rspec) }
113
+ File.open("#{project_path}/lib/stacks/ecs_stack.rb", "w") { |file| file.write(ecs_stack) }
114
+ File.open("#{project_path}/lib/stacks/ecs_stack/ecs_cluster.rb", "w") { |file| file.write(ecs_stack_concern) }
115
+ File.open("#{project_path}/Gemfile", "w") { |file| file.write(gemfile) }
116
+ File.open("#{project_path}/.gitignore", "w") { |file| file.write(gitignore) }
117
+ File.open("#{project_path}/lib/shared_concerns/global_variables.rb", "w") { |file| file.write(global_variables) }
118
+ File.open("#{project_path}/lib/aws_helper/helpers.rb", "w") { |file| file.write(helpers) }
119
+ File.open("#{project_path}/lib/shared_concerns/helper_methods.rb", "w") { |file| file.write(helper_methods) }
120
+ File.open("#{project_path}/lib/main.rb", "w") { |file| file.write(main) }
121
+ File.open("#{project_path}/lib/aws_helper/main.rb", "w") { |file| file.write(main_aws_helper) }
122
+ File.open("#{project_path}/spec/lib/parent_spec.rb", "w") { |file| file.write(parent_spec) }
123
+ File.open("#{project_path}/lib/stacks/parent_stack.rb", "w") { |file| file.write(project_stack) }
124
+ File.open("#{project_path}/lib/stacks/parent_stack/parent.rb", "w") { |file| file.write(project_concern) }
125
+ File.open("#{project_path}/Rakefile", "w") { |file| file.write(rakefile) }
126
+ File.open("#{project_path}/.rubocop.yml", "w") { |file| file.write(rubocop) }
127
+ File.open("#{project_path}/lib/shared_concerns/shared_methods.rb", "w") { |file| file.write(shared_methods) }
128
+ File.open("#{project_path}/spec/spec_helper.rb", "w") { |file| file.write(spec_helper) }
129
+ File.open("#{project_path}/lib/stacks/vpc_stack/subnets.rb", "w") { |file| file.write(subnets) }
130
+ File.open("#{project_path}/lib/aws_helper/upload_stack.rb", "w") { |file| file.write(upload_stack) }
131
+ File.open("#{project_path}/spec/lib/vpc_spec.rb", "w") { |file| file.write(vpc_spec) }
132
+ File.open("#{project_path}/lib/stacks/vpc_stack.rb", "w") { |file| file.write(vpc_stack) }
133
+ File.open("#{project_path}/lib/stacks/vpc_stack/vpc.rb", "w") { |file| file.write(vpc_concern) }
131
134
 
132
135
  puts "Setting up Rubycfn #{project_name} project..."
133
136
  `cd #{project_name}-rubycfn && git init && bundle`
data/lib/cli_methods.rb CHANGED
@@ -38,15 +38,15 @@ end
38
38
  def rubycfn_structure(project_name)
39
39
  [
40
40
  project_name,
41
- project_name + '/build',
42
- project_name + '/lib/aws_helper',
43
- project_name + '/lib/core',
44
- project_name + '/lib/shared_concerns',
45
- project_name + '/lib/stacks',
46
- project_name + '/lib/stacks/ecs_stack',
47
- project_name + '/lib/stacks/parent_stack',
48
- project_name + '/lib/stacks/vpc_stack',
49
- project_name + '/spec',
50
- project_name + '/spec/lib'
41
+ project_name + "/build",
42
+ project_name + "/lib/aws_helper",
43
+ project_name + "/lib/core",
44
+ project_name + "/lib/shared_concerns",
45
+ project_name + "/lib/stacks",
46
+ project_name + "/lib/stacks/ecs_stack",
47
+ project_name + "/lib/stacks/parent_stack",
48
+ project_name + "/lib/stacks/vpc_stack",
49
+ project_name + "/spec",
50
+ project_name + "/spec/lib"
51
51
  ]
52
52
  end
@@ -1,4 +1,4 @@
1
1
  # Rubycfn version
2
2
  module Rubycfn
3
- VERSION = "0.3.7"
3
+ VERSION = "0.3.8".freeze
4
4
  end
data/lib/rubycfn.rb CHANGED
@@ -1,11 +1,10 @@
1
1
  # Rubycfn RubyCFN is a light-weight CloudFormation DSL
2
- require 'active_support/concern'
2
+ require "active_support/concern"
3
3
  require "json"
4
4
  require "neatjson"
5
5
  require "rubycfn/version"
6
- #require "tasks/tasks"
7
6
 
8
- @depends_on = []
7
+ @depends_on = []
9
8
  @description = ""
10
9
  @transform = ""
11
10
  @outputs = {}
@@ -14,7 +13,7 @@ require "rubycfn/version"
14
13
  @metadata = {}
15
14
  @mappings = {}
16
15
  @conditions = {}
17
- @AWSresources = {}
16
+ @aws_resources = {}
18
17
  @imports = []
19
18
  @resource_name = ""
20
19
  @variables = {}
@@ -24,10 +23,24 @@ require "rubycfn/version"
24
23
  class Symbol
25
24
  def ref(attr = nil)
26
25
  unless attr
27
- return { Ref: self.to_s.split("_").map{ |e| e.capitalize }.join }
26
+ return { Ref: to_s.split("_").map(&:capitalize).join }
28
27
  end
29
- attr = attr.class == String ? attr : attr.to_s.split('_').map{|e| e.capitalize}.join
30
- return { "Fn::GetAtt": [ self.to_s.split("_").map{ |e| e.capitalize }.join, attr ] }
28
+ attr = attr.class == String ? attr : attr.to_s.split("_").map(&:capitalize).join
29
+ {
30
+ "Fn::GetAtt": [
31
+ to_s.split("_").map(&:capitalize).join, attr
32
+ ]
33
+ }
34
+ end
35
+
36
+ def fntransform(parameters = nil)
37
+ raise "fntransform parameters must be of type Hash" unless parameters.class == Hash
38
+ {
39
+ "Fn::Transform": {
40
+ "Name": to_s.split("_").map(&:capitalize).join,
41
+ "Parameters": parameters
42
+ }
43
+ }
31
44
  end
32
45
  end
33
46
 
@@ -45,15 +58,30 @@ end
45
58
  class String
46
59
  def cfnize
47
60
  return self if self !~ /_/ && self =~ /[A-Z]+.*/
48
- split('_').map{|e| e.capitalize}.join
61
+ split("_").map(&:capitalize).join
49
62
  end
50
63
 
51
64
  def ref(attr = nil)
52
65
  unless attr
53
66
  return { Ref: self }
54
67
  end
55
- attr = attr.class == String ? attr : attr.to_s.split('_').map{|e| e.capitalize}.join
56
- return { "Fn::GetAtt": [ self, attr ] }
68
+ attr = attr.class == String ? attr : attr.to_s.split("_").map(&:capitalize).join
69
+ {
70
+ "Fn::GetAtt": [
71
+ self,
72
+ attr
73
+ ]
74
+ }
75
+ end
76
+
77
+ def fntransform(parameters = nil)
78
+ raise "fntransform parameters must be of type Hash" unless parameters.class == Hash
79
+ {
80
+ "Fn::Transform": {
81
+ "Name": self,
82
+ "Parameters": parameters
83
+ }
84
+ }
57
85
  end
58
86
 
59
87
  def fnsplit(separator = "")
@@ -66,25 +94,35 @@ class String
66
94
  end
67
95
 
68
96
  def fnbase64
69
- return { "Fn::Base64": self }
97
+ {
98
+ "Fn::Base64": self
99
+ }
70
100
  end
71
101
 
72
102
  def fngetazs
73
- return { "Fn::GetAZs": self }
103
+ {
104
+ "Fn::GetAZs": self
105
+ }
74
106
  end
75
107
 
76
108
  def fnsub(variable_map = nil)
77
109
  unless variable_map
78
110
  return { "Fn::Sub": self }
79
111
  end
80
- return { "Fn::Sub": [ self, variable_map ] }
112
+ {
113
+ "Fn::Sub": [
114
+ self,
115
+ variable_map
116
+ ]
117
+ }
81
118
  end
82
119
 
83
120
  def fnimportvalue
84
- return { "Fn::Import": self }
121
+ {
122
+ "Fn::Import": self
123
+ }
85
124
  end
86
125
  alias_method :fnimport, :fnimportvalue
87
-
88
126
  end
89
127
 
90
128
  class Array
@@ -126,7 +164,7 @@ class Array
126
164
  end
127
165
 
128
166
  def fnfindinmap(name = nil)
129
- self.unshift(name.cfnize) if name
167
+ unshift(name.cfnize) if name
130
168
  {
131
169
  "Fn::FindInMap": self
132
170
  }
@@ -154,20 +192,26 @@ class Array
154
192
  end
155
193
 
156
194
  class ::Hash
195
+ # rubocop:disable Style/RedundantSelf
196
+ # rubocop:disable Style/CaseEquality
197
+ # rubocop:disable Lint/UnusedBlockArgument
157
198
  def deep_merge(second)
158
199
  merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : Array === v1 && Array === v2 ? v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2 }
159
200
  self.merge(second.to_h, &merger)
160
201
  end
202
+ # rubocop:enable Style/RedundantSelf
203
+ # rubocop:enable Style/CaseEquality
204
+ # rubocop:enable Lint/UnusedBlockArgument
161
205
 
162
206
  def recursive_compact
163
207
  delete_if do |k, v|
164
- next if v === false || k =~ /Fn\:/
165
- (v.respond_to?(:empty?) ? v.empty? : !v) or v.instance_of?(Hash) && v.recursive_compact.empty?
208
+ next if v == false || k =~ /Fn\:/
209
+ (v.respond_to?(:empty?) ? v.empty? : !v) || v.instance_of?(Hash) && v.recursive_compact.empty?
166
210
  end
167
211
  end
168
212
 
169
213
  def compact
170
- delete_if { |k, v| v.nil? }
214
+ delete_if { |_k, v| v.nil? }
171
215
  end
172
216
 
173
217
  def fnselect(index = 0)
@@ -184,6 +228,7 @@ module Rubycfn
184
228
  extend ActiveSupport::Concern
185
229
 
186
230
  included do
231
+ # rubocop:disable Style/UnneededCondition
187
232
  def self.method_missing(name, *args)
188
233
  super unless TOPLEVEL_BINDING.eval("@variables[:#{name}]") || \
189
234
  TOPLEVEL_BINDING.eval("@variables[:#{name}] === false") ||
@@ -195,17 +240,16 @@ module Rubycfn
195
240
  TOPLEVEL_BINDING.eval("@global_variables[:#{name}]")
196
241
  end
197
242
  end
243
+ # rubocop:enable Style/UnneededCondition
198
244
 
199
245
  def self.transform(transform = "AWS::Serverless-2016-10-31")
200
- unless transform.nil?
201
- TOPLEVEL_BINDING.eval("@transform = '#{transform}'")
202
- end
246
+ return if transform.nil?
247
+ TOPLEVEL_BINDING.eval("@transform = '#{transform}'")
203
248
  end
204
249
 
205
250
  def self.description(description = "")
206
- unless description.nil?
207
- TOPLEVEL_BINDING.eval("@description = '#{description}'")
208
- end
251
+ return if description.nil?
252
+ TOPLEVEL_BINDING.eval("@description = '#{description}'")
209
253
  end
210
254
 
211
255
  def self.condition(name, arguments)
@@ -225,7 +269,9 @@ module Rubycfn
225
269
  end
226
270
 
227
271
  name = name.to_s.cfnize
228
- kv_pairs = arguments[:data] ? arguments[:data] : { "#{arguments[:key]}": "#{arguments[:value]}" }
272
+ # rubocop:disable Style/UnneededCondition
273
+ kv_pairs = arguments[:data] ? arguments[:data] : { "#{arguments[:key]}": (arguments[:value]).to_s }
274
+ # rubocop:enable Style/UnneededCondition
229
275
  res = {
230
276
  "#{name}": {
231
277
  "#{arguments[:name]}": kv_pairs
@@ -287,26 +333,22 @@ module Rubycfn
287
333
  end
288
334
 
289
335
  if arguments[:filter]
290
- arguments[:value] = self.send(arguments[:filter], arguments[:value])
336
+ arguments[:value] = send(arguments[:filter], arguments[:value])
291
337
  end
292
338
 
293
339
  res = {
294
340
  "#{name}": arguments[:value]
295
341
  }
296
- if arguments[:global] == false
297
- TOPLEVEL_BINDING.eval("@variables = @variables.deep_merge(#{res})")
298
- else
299
- TOPLEVEL_BINDING.eval("@global_variables = @global_variables.deep_merge(#{res})")
300
- TOPLEVEL_BINDING.eval("@variables = @variables.deep_merge(#{res})")
301
- end
342
+ TOPLEVEL_BINDING.eval("@global_variables = @global_variables.deep_merge(#{res})") unless arguments[:global] == false
343
+ TOPLEVEL_BINDING.eval("@variables = @variables.deep_merge(#{res})")
302
344
  end
303
345
 
304
346
  def self.depends_on(resources)
305
347
  case resources
306
- when String
307
- resources = [resources.cfnize]
308
- when Array
309
- resources = resources.map { |r| r.cfnize }
348
+ when String
349
+ resources = [resources.cfnize]
350
+ when Array
351
+ resources = resources.map(&:cfnize)
310
352
  end
311
353
  TOPLEVEL_BINDING.eval("@depends_on = #{resources}")
312
354
  end
@@ -315,29 +357,23 @@ module Rubycfn
315
357
  TOPLEVEL_BINDING.eval("@resource_name = '#{name}'")
316
358
  end
317
359
 
318
- def self.set(name, index = 0, &block)
360
+ # rubocop:disable Lint/UnusedMethodArgument
361
+ def self.set(name, _index = 0, &block)
319
362
  res = {
320
363
  "#{name}": yield
321
364
  }
322
365
  TOPLEVEL_BINDING.eval("@variables = @variables.deep_merge(#{res})")
323
366
  end
367
+ # rubocop:enable Lint/UnusedMethodArgument
324
368
 
325
- def self.meta(name, index = 0, &block)
326
- if name.class == Symbol
327
- name = TOPLEVEL_BINDING.eval("'#{name}'.cfnize")
328
- else
329
- name = TOPLEVEL_BINDING.eval("'#{name}'")
330
- end
369
+ def self.meta(name, _index = 0, &block)
370
+ name = name.class == Symbol ? TOPLEVEL_BINDING.eval("'#{name}'.cfnize") : TOPLEVEL_BINDING.eval("'#{name}'")
331
371
  res = { "#{name}": yield(block) }
332
372
  TOPLEVEL_BINDING.eval("@metadata = @metadata.deep_merge(#{res})")
333
373
  end
334
374
 
335
- def self.property(name, index = 0, &block)
336
- if name.class == Symbol
337
- name = TOPLEVEL_BINDING.eval("'#{name}'.cfnize")
338
- else
339
- name = TOPLEVEL_BINDING.eval("'#{name}'")
340
- end
375
+ def self.property(name, _index = 0, &block)
376
+ name = name.class == Symbol ? TOPLEVEL_BINDING.eval("'#{name}'.cfnize") : TOPLEVEL_BINDING.eval("'#{name}'")
341
377
  res = { "#{name}": yield(block) }
342
378
  TOPLEVEL_BINDING.eval("@properties = @properties.deep_merge(#{res})")
343
379
  end
@@ -345,12 +381,8 @@ module Rubycfn
345
381
  def self.resource(name, arguments, &block)
346
382
  arguments[:amount] ||= 1
347
383
  origname = name.to_s
348
- # Allow for non-camelcased resource names
349
- if name.class == Symbol
350
- name = name.to_s.cfnize
351
- else
352
- name = name.to_s
353
- end
384
+ # Allow for non-camelcased resource names
385
+ name = name.class == Symbol ? name.to_s.cfnize : name = name.to_s
354
386
  arguments[:type] =~ /^([A-Za-z0-9]*)\:\:/
355
387
  arguments[:cloud] ||= $1
356
388
 
@@ -359,20 +391,20 @@ module Rubycfn
359
391
  arguments[:cloud] = "AWS"
360
392
  end
361
393
  arguments[:amount].times do |i|
362
- resource_suffix = i == 0 ? "" : "#{i+1}"
394
+ resource_suffix = i.zero? ? "" : (i + 1).to_s
363
395
  if arguments[:type].class == Module
364
396
  send("include", arguments[:type][origname, resource_suffix, &block])
365
397
  else
366
398
  yield self, i if block_given?
367
399
 
368
- resource_postpend = TOPLEVEL_BINDING.eval("@resource_name").empty? ? i+1 : ""
400
+ resource_postpend = TOPLEVEL_BINDING.eval("@resource_name").empty? ? i + 1 : ""
369
401
  unless TOPLEVEL_BINDING.eval("@resource_name").empty?
370
402
  name = TOPLEVEL_BINDING.eval("@resource_name")
371
403
  TOPLEVEL_BINDING.eval("@resource_name = ''")
372
404
  end
373
405
 
374
406
  res = {
375
- "#{name.to_s}#{i == 0 ? "" : resource_postpend}": {
407
+ "#{name.to_s}#{i.zero? ? "" : resource_postpend}": {
376
408
  DependsOn: TOPLEVEL_BINDING.eval("@depends_on"),
377
409
  Metadata: TOPLEVEL_BINDING.eval("@metadata"),
378
410
  Properties: TOPLEVEL_BINDING.eval("@properties"),
@@ -380,7 +412,7 @@ module Rubycfn
380
412
  Condition: arguments[:condition]
381
413
  }
382
414
  }
383
- TOPLEVEL_BINDING.eval("@AWSresources = @AWSresources.deep_merge(#{res})")
415
+ TOPLEVEL_BINDING.eval("@aws_resources = @aws_resources.deep_merge(#{res})")
384
416
  end
385
417
  TOPLEVEL_BINDING.eval("@depends_on = []")
386
418
  TOPLEVEL_BINDING.eval("@properties = {}")
@@ -399,14 +431,14 @@ module Rubycfn
399
431
  when "AWS"
400
432
  skeleton = { "AWSTemplateFormatVersion": "2010-09-09" }
401
433
  skeleton = JSON.parse(skeleton.to_json)
402
- skeleton.merge!(Transform: TOPLEVEL_BINDING.eval("@transform"))
403
- skeleton.merge!(Description: TOPLEVEL_BINDING.eval("@description"))
404
- skeleton.merge!(Mappings: sort_json(TOPLEVEL_BINDING.eval("@mappings")))
405
- skeleton.merge!(Parameters: sort_json(TOPLEVEL_BINDING.eval("@parameters")))
406
- skeleton.merge!(Conditions: sort_json(TOPLEVEL_BINDING.eval("@conditions")))
407
- skeleton.merge!(Resources: sort_json(TOPLEVEL_BINDING.eval("@AWSresources")))
408
- skeleton.merge!(Outputs: sort_json(TOPLEVEL_BINDING.eval("@outputs")))
409
- TOPLEVEL_BINDING.eval("@variables = @AWSresources = @outputs = @metadata = @properties = @mappings = @parameters = {}")
434
+ skeleton[:Transform] = TOPLEVEL_BINDING.eval("@transform")
435
+ skeleton[:Description] = TOPLEVEL_BINDING.eval("@description")
436
+ skeleton[:Mappings] = sort_json(TOPLEVEL_BINDING.eval("@mappings"))
437
+ skeleton[:Parameters] = sort_json(TOPLEVEL_BINDING.eval("@parameters"))
438
+ skeleton[:Conditions] = sort_json(TOPLEVEL_BINDING.eval("@conditions"))
439
+ skeleton[:Resources] = sort_json(TOPLEVEL_BINDING.eval("@aws_resources"))
440
+ skeleton[:Outputs] = sort_json(TOPLEVEL_BINDING.eval("@outputs"))
441
+ TOPLEVEL_BINDING.eval("@variables = @aws_resources = @outputs = @metadata = @properties = @mappings = @parameters = {}")
410
442
  TOPLEVEL_BINDING.eval("@depends_on = []")
411
443
  TOPLEVEL_BINDING.eval("@description = ''")
412
444
  TOPLEVEL_BINDING.eval("@transform = ''")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubycfn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.7
4
+ version: 0.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dennis Vink
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-20 00:00:00.000000000 Z
11
+ date: 2019-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: neatjson
@@ -257,6 +257,7 @@ extensions: []
257
257
  extra_rdoc_files: []
258
258
  files:
259
259
  - ".gitignore"
260
+ - ".rubocop.yml"
260
261
  - CHANGELOG.md
261
262
  - Gemfile
262
263
  - Gemfile.lock
@@ -324,7 +325,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
324
325
  version: '0'
325
326
  requirements: []
326
327
  rubyforge_project:
327
- rubygems_version: 2.6.7
328
+ rubygems_version: 2.5.1
328
329
  signing_key:
329
330
  specification_version: 4
330
331
  summary: Rubycfn