rubycfn 0.4.5 → 0.4.6

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: b1bb92a5757a5c7061695b4460f8cb071cdfae48
4
- data.tar.gz: 150e5faf63fde45afe96df907964e86ecc39f90a
3
+ metadata.gz: 54323e492522b3ea1a2d1052b07792fee27e2a95
4
+ data.tar.gz: 106b5915d1354d4a4753bccf45eb54b4f2af6375
5
5
  SHA512:
6
- metadata.gz: 37db6e219b441d66f8cfe13d24849cef86a80bb73e32c7532df06f6f0fde98fece5cacb413148901375cad6b884f0dce71b6f6f094ad30035143dd5c58dc8a1e
7
- data.tar.gz: abf563cc7cd2313fae68a60ca97cc73a0613350c584f7ad632ff662201c6c2e66c1f93cdd31b2c94dc4bf6ebe6a66952711de17e8e6e015d55a8df3ccf011b30
6
+ metadata.gz: 7b41fc96833ad3d852dd2092324bd8283a5e39e847860b9677c4c7ab7edaf5760bd940710ba38f6c1f2530fa17edab71a0992605b5cd87673534185864115dbe
7
+ data.tar.gz: 7985ac469a239223734bb8f3a2e9c976f3f5af42c365de7fd439df7ecf78149c99d2d33391f42fd685d90d62f53a7f942b694afaef9432798596c38cab1cab82
data/CHANGELOG.md CHANGED
@@ -2,7 +2,13 @@
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.4.6 (Next Release)
5
+ ## 0.4.7 (Next Release)
6
+
7
+ ## 0.4.6
8
+
9
+ * Added `template` attribute to variables -- [@dennisvink][@dennisvink]
10
+ * Added `rubycfn stack` command to add new stack quickly -- [@dennisvink][@dennisvink]
11
+ * Added `get_output` method -- [@dennisvink][@dennisvink]
6
12
 
7
13
  ## 0.4.5
8
14
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rubycfn (0.4.5)
4
+ rubycfn (0.4.6)
5
5
  activesupport (~> 5.1.5)
6
6
  dotenv (~> 2.4.0)
7
7
  json (~> 2.1.0)
@@ -119,7 +119,7 @@ GEM
119
119
  tty-screen (0.6.5)
120
120
  tzinfo (1.2.5)
121
121
  thread_safe (~> 0.1)
122
- wisper (2.0.0)
122
+ wisper (2.0.1)
123
123
 
124
124
  PLATFORMS
125
125
  ruby
data/README.md CHANGED
@@ -61,7 +61,7 @@ __________ ____ __________________.___._________ _____________________
61
61
  | _/ | /| | _// | |/ \ \/ | __) | | _/
62
62
  | | \ | / | | \\____ |\ \____| \ | | \
63
63
  |____|_ /______/ |______ // ______| \______ /\___ / |______ /
64
- \/ \/ \/ \/ \/ \/ [v0.4.5]
64
+ \/ \/ \/ \/ \/ \/ [v0.4.6]
65
65
  Project name? example
66
66
  Account ID? 1234567890
67
67
  Select region EU (Frankfurt)
@@ -313,6 +313,10 @@ part of `VpcStack`. The second line defines the name of the module, in this case
313
313
  `Main`. The code beteen `included do` and `end` is the implementation of this
314
314
  module.
315
315
 
316
+ Adding a new stack is trivial: Go to the root folder of the project and type
317
+ `rubycfn stack`. This will prompt you for a stack name (do not include the 'stack' keyword)
318
+ and it will generate the stack for you.
319
+
316
320
  ## AWS Intrinsic functions
317
321
 
318
322
  You can Ref by postpending the .ref method to any string or hash, e.g. :foobar.ref
data/bin/rubycfn CHANGED
@@ -10,29 +10,36 @@ require_relative "../lib/cli_methods"
10
10
 
11
11
  # rubocop:disable Style/AndOr
12
12
  if ARGV.first || (ARGF.filename != "-" or (not STDIN.tty? and not STDIN.closed?)) # rubocop:disable Style/Not
13
- require "rubycfn"
14
- require "active_support/concern"
15
- module RubycfnStack
16
- if ARGF.filename != "-" or (not STDIN.tty? and not STDIN.closed?) # rubocop:disable Style/Not
17
- # rubocop:enable Style/AndOr
18
- contents = []
19
- ARGF.each_line do |line|
20
- contents.push(line)
21
- end
22
- contents = contents.join("\n")
23
- else
24
- raise "File #{ARGV.first} not found!" unless File.file?(ARGV.first)
25
- contents = File.read(ARGV.first)
13
+ if ARGV.class == Array && ARGV.first == "stack"
14
+ case ARGV.first
15
+ when "stack"
16
+ scaffold_stack
26
17
  end
27
- extend ActiveSupport::Concern
28
- include Rubycfn
29
- included do
30
- eval(contents) # rubocop:disable Security/Eval
18
+ else
19
+ require "rubycfn"
20
+ require "active_support/concern"
21
+ module RubycfnStack
22
+ if ARGF.filename != "-" or (not STDIN.tty? and not STDIN.closed?) # rubocop:disable Style/Not
23
+ # rubocop:enable Style/AndOr
24
+ contents = []
25
+ ARGF.each_line do |line|
26
+ contents.push(line)
27
+ end
28
+ contents = contents.join("\n")
29
+ else
30
+ raise "File #{ARGV.first} not found!" unless File.file?(ARGV.first)
31
+ contents = File.read(ARGV.first)
32
+ end
33
+ extend ActiveSupport::Concern
34
+ include Rubycfn
35
+ included do
36
+ eval(contents) # rubocop:disable Security/Eval
37
+ end
31
38
  end
39
+ cfn = include RubycfnStack # rubocop:disable Style/MixinUsage
40
+ puts cfn.render_template
41
+ exit
32
42
  end
33
- cfn = include RubycfnStack # rubocop:disable Style/MixinUsage
34
- puts cfn.render_template
35
- exit
36
43
  end
37
44
 
38
45
  path = File.expand_path(File.dirname(File.dirname(__FILE__)))
@@ -72,7 +79,7 @@ dotenv_test = render(".env.test", { name: project_name }, path)
72
79
  dotenv_production = render(".env.production", { name: project_name }, path)
73
80
  dotenv_rspec = render(".env.rspec", { name: project_name }, path)
74
81
  ecs_stack = render("ecs_stack.rb", {}, path)
75
- ecs_stack_concern = render("ecs_Stack_concern.rb", { name: project_name }, path)
82
+ ecs_stack_concern = render("ecs_stack_concern.rb", { name: project_name }, path)
76
83
  gemfile = render("Gemfile", { version: Rubycfn::VERSION }, path)
77
84
  gitignore = render(".gitignore", {}, path)
78
85
  global_variables = render("global_variables.rb", { name: project_name.downcase }, path)
data/lib/cli_methods.rb CHANGED
@@ -50,3 +50,22 @@ def rubycfn_structure(project_name)
50
50
  project_name + "/spec/lib"
51
51
  ]
52
52
  end
53
+
54
+ def scaffold_stack
55
+ puts rubycfn_banner(Rubycfn::VERSION)
56
+ raise "Run `rubycfn stack` from project root folder" unless File.file? "lib/stacks/parent_stack/parent.rb"
57
+ prompt = TTY::Prompt.new
58
+ stack_name = prompt.ask("Stack name?", default: "application") do |q|
59
+ q.validate(/^([a-zA-Z]*)$/, "Invalid stack name")
60
+ end
61
+ stack_name = "#{stack_name.downcase}_stack"
62
+ raise "Stack already exists" if File.file? "lib/stacks/#{stack_name}.rb"
63
+ path = File.expand_path(File.dirname(File.dirname(__FILE__)))
64
+ new_stack = render("new_stack.rb", { stack_name: stack_name.split("_").collect(&:capitalize).join }, path)
65
+ new_concern = render("new_concern.rb", { stack_name: stack_name.split("_").collect(&:capitalize).join }, path)
66
+ File.open("lib/stacks/#{stack_name}.rb", "w") { |file| file.write(new_stack) }
67
+ FileUtils.mkdir_p "lib/stacks/#{stack_name}"
68
+ File.open("lib/stacks/#{stack_name}/my_module.rb", "w") { |file| file.write(new_concern) }
69
+ puts "Created stack. Don't forget to add it to lib/stacks/parent_stack/parent.rb !"
70
+ exit
71
+ end
data/lib/monkeypatch.rb CHANGED
@@ -4,6 +4,15 @@ class Symbol
4
4
  to_s.split("_").map(&:capitalize).join
5
5
  end
6
6
 
7
+ def get_output(attr)
8
+ attr = attr.class == String ? attr : attr.to_s.split("_").map(&:capitalize).join
9
+ {
10
+ "Fn::GetAtt": [
11
+ to_s.split("_").map(&:capitalize).join, "Outputs.#{attr}"
12
+ ]
13
+ }
14
+ end
15
+
7
16
  def ref(attr = nil)
8
17
  unless attr
9
18
  return { Ref: to_s.split("_").map(&:capitalize).join }
@@ -44,6 +53,15 @@ class String
44
53
  split("_").map(&:capitalize).join
45
54
  end
46
55
 
56
+ def get_output(attr)
57
+ attr = attr.class == String ? attr : attr.to_s.split("_").map(&:capitalize).join
58
+ {
59
+ "Fn::GetAtt": [
60
+ to_s.split("_").map(&:capitalize).join, "Outputs.#{attr}"
61
+ ]
62
+ }
63
+ end
64
+
47
65
  def ref(attr = nil)
48
66
  unless attr
49
67
  return { Ref: self }
@@ -1,4 +1,4 @@
1
1
  # Rubycfn version
2
2
  module Rubycfn
3
- VERSION = "0.4.5".freeze
3
+ VERSION = "0.4.6".freeze
4
4
  end
data/lib/rubycfn.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  # Rubycfn RubyCFN is a light-weight CloudFormation DSL
2
2
  require "active_support/concern"
3
+ require "erb"
3
4
  require "json"
4
5
  require "neatjson"
5
6
  require "rubycfn/version"
@@ -125,6 +126,7 @@ module Rubycfn
125
126
  arguments[:required] ||= false
126
127
  arguments[:global] ||= false
127
128
  arguments[:filter] ||= nil
129
+ arguments[:template] ||= nil
128
130
 
129
131
  if arguments[:value].empty?
130
132
  arguments[:value] = arguments[:default]
@@ -139,6 +141,10 @@ module Rubycfn
139
141
  arguments[:value] = send(arguments[:filter], arguments[:value])
140
142
  end
141
143
 
144
+ if arguments[:template]
145
+ arguments[:value] = ERB.new("#{File.open(arguments[:template]).read}").result(binding)
146
+ end
147
+
142
148
  res = {
143
149
  "#{name}": arguments[:value]
144
150
  }
@@ -292,7 +298,7 @@ module Rubycfn
292
298
  TOPLEVEL_BINDING.eval("@depends_on = []")
293
299
  TOPLEVEL_BINDING.eval("@description = ''")
294
300
  TOPLEVEL_BINDING.eval("@transform = ''")
295
- JSON.pretty_generate(skeleton.recursive_compact).gsub("<emptyString>","")
301
+ JSON.pretty_generate(skeleton.recursive_compact).gsub("<emptyString>", "")
296
302
  end
297
303
  end
298
304
  end
@@ -0,0 +1,10 @@
1
+ module <%= stack_name %>
2
+ module MyModule
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ resource :sample_resource,
7
+ type: "AWS::SQS::Queue"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module <%= stack_name %>
2
+ extend ActiveSupport::Concern
3
+ include Rubycfn
4
+
5
+ included do
6
+ include Concerns::GlobalVariables
7
+ include Concerns::SharedMethods
8
+ include <%= stack_name %>::MyModule
9
+
10
+ description generate_stack_description("<%= stack_name %>")
11
+ end
12
+ end
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.4.5
4
+ version: 0.4.6
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-10-07 00:00:00.000000000 Z
11
+ date: 2019-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: neatjson
@@ -297,6 +297,8 @@ files:
297
297
  - templates/helpers.rb.erb
298
298
  - templates/main.rb.erb
299
299
  - templates/main_aws_helper.rb.erb
300
+ - templates/new_concern.rb.erb
301
+ - templates/new_stack.rb.erb
300
302
  - templates/parent_stack_spec.rb.erb
301
303
  - templates/project_concern.rb.erb
302
304
  - templates/project_stack.rb.erb