lono 1.1.3 → 2.0.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.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +3 -0
  3. data/CHANGELOG.md +8 -0
  4. data/README.md +150 -39
  5. data/bin/lono +2 -2
  6. data/circle.yml +4 -0
  7. data/lib/lono.rb +16 -7
  8. data/lib/lono/cfn.rb +64 -0
  9. data/lib/lono/cfn/aws_services.rb +37 -0
  10. data/lib/lono/cfn/base.rb +144 -0
  11. data/lib/lono/cfn/create.rb +34 -0
  12. data/lib/lono/cfn/delete.rb +26 -0
  13. data/lib/lono/cfn/diff.rb +43 -0
  14. data/lib/lono/cfn/help.rb +93 -0
  15. data/lib/lono/cfn/preview.rb +133 -0
  16. data/lib/lono/cfn/update.rb +62 -0
  17. data/lib/lono/cfn/util.rb +21 -0
  18. data/lib/lono/cli.rb +19 -10
  19. data/lib/lono/command.rb +25 -0
  20. data/lib/lono/help.rb +59 -0
  21. data/lib/lono/new.rb +3 -2
  22. data/lib/lono/param.rb +20 -0
  23. data/lib/lono/param/generator.rb +90 -0
  24. data/lib/lono/param/help.rb +15 -0
  25. data/lib/lono/project_checker.rb +44 -0
  26. data/lib/lono/template.rb +22 -248
  27. data/lib/lono/template/bashify.rb +39 -0
  28. data/lib/lono/template/dsl.rb +139 -0
  29. data/lib/lono/template/help.rb +25 -0
  30. data/lib/lono/template/template.rb +251 -0
  31. data/lib/lono/version.rb +1 -1
  32. data/lib/{starter_project_yaml → starter_projects/json_project}/Gemfile +0 -1
  33. data/lib/{starter_project_json → starter_projects/json_project}/Guardfile +0 -0
  34. data/lib/{starter_project_json → starter_projects/json_project}/config/lono.rb +0 -0
  35. data/lib/{starter_project_json → starter_projects/json_project}/config/lono/api.rb +0 -0
  36. data/lib/starter_projects/json_project/params/api-web-prod.txt +20 -0
  37. data/lib/{starter_project_json → starter_projects/json_project}/templates/db.json.erb +0 -0
  38. data/lib/{starter_project_json → starter_projects/json_project}/templates/partial/host_record.json.erb +0 -0
  39. data/lib/{starter_project_json → starter_projects/json_project}/templates/partial/server.json.erb +0 -0
  40. data/lib/{starter_project_json → starter_projects/json_project}/templates/user_data/app.sh.erb +0 -0
  41. data/lib/{starter_project_json → starter_projects/json_project}/templates/user_data/db.sh.erb +0 -0
  42. data/lib/{starter_project_json → starter_projects/json_project}/templates/user_data/db2.sh.erb +0 -0
  43. data/lib/{starter_project_json → starter_projects/json_project}/templates/user_data/ruby_script.rb.erb +0 -0
  44. data/lib/{starter_project_json → starter_projects/json_project}/templates/web.json.erb +0 -0
  45. data/lib/{starter_project_json → starter_projects/yaml_project}/Gemfile +0 -1
  46. data/lib/{starter_project_yaml → starter_projects/yaml_project}/Guardfile +0 -0
  47. data/lib/{starter_project_yaml → starter_projects/yaml_project}/config/lono.rb +0 -0
  48. data/lib/{starter_project_yaml → starter_projects/yaml_project}/config/lono/api.rb +0 -0
  49. data/lib/starter_projects/yaml_project/params/api-web-prod.txt +20 -0
  50. data/lib/{starter_project_yaml → starter_projects/yaml_project}/templates/db.yml.erb +0 -0
  51. data/lib/{starter_project_yaml → starter_projects/yaml_project}/templates/partial/host_record.yml.erb +0 -0
  52. data/lib/{starter_project_yaml → starter_projects/yaml_project}/templates/partial/server.yml.erb +0 -0
  53. data/lib/{starter_project_yaml → starter_projects/yaml_project}/templates/partial/user_data/bootstrap.sh.erb +0 -0
  54. data/lib/{starter_project_yaml → starter_projects/yaml_project}/templates/web.yml.erb +0 -0
  55. data/lono.gemspec +15 -10
  56. data/spec/fixtures/my_project/config/lono.rb +1 -0
  57. data/spec/fixtures/my_project/params/my-stack.txt +3 -0
  58. data/spec/fixtures/my_project/templates/.gitkeep +0 -0
  59. data/spec/fixtures/my_project/templates/my-stack.yml.erb +0 -0
  60. data/spec/lib/lono/cfn_spec.rb +35 -0
  61. data/spec/lib/lono/new_spec.rb +3 -3
  62. data/spec/lib/lono/param_spec.rb +15 -0
  63. data/spec/lib/lono/{dsl_spec.rb → template/dsl_spec.rb} +9 -9
  64. data/spec/lib/lono/template/template_spec.rb +104 -0
  65. data/spec/lib/lono/template_spec.rb +22 -37
  66. data/spec/lib/lono_spec.rb +6 -83
  67. data/vendor/plissken/Gemfile +14 -0
  68. data/vendor/plissken/LICENSE.txt +20 -0
  69. data/vendor/plissken/README.md +46 -0
  70. data/vendor/plissken/Rakefile +56 -0
  71. data/vendor/plissken/VERSION +1 -0
  72. data/vendor/plissken/lib/plissken.rb +1 -0
  73. data/vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb +45 -0
  74. data/vendor/plissken/plissken.gemspec +61 -0
  75. data/vendor/plissken/spec/lib/to_snake_keys_spec.rb +177 -0
  76. data/vendor/plissken/spec/spec_helper.rb +90 -0
  77. data/vendor/plissken/test/helper.rb +20 -0
  78. data/vendor/plissken/test/plissken/ext/hash/to_snake_keys_test.rb +184 -0
  79. data/vendor/plissken/test/test_plissken.rb +2 -0
  80. metadata +115 -39
  81. data/lib/lono/bashify.rb +0 -41
  82. data/lib/lono/cli/help.rb +0 -37
  83. data/lib/lono/dsl.rb +0 -132
@@ -1,3 +1,3 @@
1
1
  module Lono
2
- VERSION = "1.1.3"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -1,4 +1,3 @@
1
1
  source "https://rubygems.org"
2
2
 
3
3
  gem 'lono'
4
- gem 'lono-cfn'
@@ -0,0 +1,20 @@
1
+ require "thor"
2
+
3
+ module Lono
4
+ class Param < Command
5
+ autoload :Help, 'lono/param/help'
6
+ autoload :Generator, 'lono/param/generator'
7
+
8
+ class_option :verbose, type: :boolean
9
+ class_option :noop, type: :boolean
10
+ class_option :mute, type: :boolean
11
+ class_option :project_root, desc: "project root to use", default: '.'
12
+
13
+ desc "generate NAME", "generate parameter json file for NAME"
14
+ long_desc Help.generate
15
+ option :path, desc: "Name of the source that maps to the params txt file. name -> params/NAME.txt. Use this to override the params/NAME.txt convention"
16
+ def generate
17
+ Generator.generate_all(options)
18
+ end
19
+ end
20
+ end
@@ -1,4 +1,3 @@
1
1
  source "https://rubygems.org"
2
2
 
3
3
  gem 'lono'
4
- gem 'lono-cfn'
@@ -0,0 +1,20 @@
1
+ require "thor"
2
+
3
+ module Lono
4
+ class Param < Command
5
+ autoload :Help, 'lono/param/help'
6
+ autoload :Generator, 'lono/param/generator'
7
+
8
+ class_option :verbose, type: :boolean
9
+ class_option :noop, type: :boolean
10
+ class_option :mute, type: :boolean
11
+ class_option :project_root, desc: "project root to use", default: '.'
12
+
13
+ desc "generate NAME", "generate parameter json file for NAME"
14
+ long_desc Help.generate
15
+ option :path, desc: "Name of the source that maps to the params txt file. name -> params/NAME.txt. Use this to override the params/NAME.txt convention"
16
+ def generate
17
+ Generator.generate_all(options)
18
+ end
19
+ end
20
+ end
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/lono/version', __FILE__)
2
+ require_relative "lib/lono/version"
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["Tung Nguyen"]
@@ -8,25 +8,30 @@ Gem::Specification.new do |gem|
8
8
  gem.summary = %q{Lono is a CloudFormation Template ruby generator. Lono generates CloudFormation templates based on ERB templates.}
9
9
  gem.homepage = "http://github.com/tongueroo/lono"
10
10
 
11
- gem.files = `git ls-files`.split($\)
11
+ gem.files = `git ls-files`.split($\) + Dir.glob("vendor/**/*")
12
12
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
14
  gem.name = "lono"
15
15
  gem.require_paths = ["lib"]
16
16
  gem.version = Lono::VERSION
17
- gem.license = 'MIT'
17
+ gem.license = "MIT"
18
18
 
19
- gem.add_dependency "rake"
20
19
  gem.add_dependency "json"
21
20
  gem.add_dependency "thor"
22
- gem.add_dependency 'guard'
23
- gem.add_dependency 'rb-fsevent'
21
+ gem.add_dependency "guard"
22
+ gem.add_dependency "rb-fsevent"
24
23
  gem.add_dependency "guard-cloudformation"
25
24
  gem.add_dependency "guard-lono"
26
25
  gem.add_dependency "colorize"
26
+ gem.add_dependency "hashie"
27
+ gem.add_dependency "aws-sdk"
28
+ # gem.add_dependency "plissken" # dependency for vendor/lono-params
29
+ # using the vendor fork version: https://github.com/tongueroo/plissken
30
+ # until https://github.com/futurechimp/plissken/pull/6 gets merged
27
31
 
28
- gem.add_development_dependency 'rspec'
29
- gem.add_development_dependency 'guard-rspec'
30
- gem.add_development_dependency 'guard-bundler'
31
- gem.add_development_dependency 'byebug'
32
+ gem.add_development_dependency "byebug"
33
+ gem.add_development_dependency "guard-bundler"
34
+ gem.add_development_dependency "guard-rspec"
35
+ gem.add_development_dependency "rake"
36
+ gem.add_development_dependency "rspec"
32
37
  end
@@ -0,0 +1 @@
1
+ # this file is just in here to get the lono-cfn spec to pass
@@ -0,0 +1,3 @@
1
+ Param1=1
2
+ Param2=1
3
+
@@ -0,0 +1,35 @@
1
+ require_relative "../../spec_helper"
2
+
3
+ describe Lono::Cfn do
4
+ before(:all) do
5
+ @args = "--noop --project-root spec/fixtures/my_project"
6
+ end
7
+
8
+ describe "lono cfn" do
9
+ it "create stack" do
10
+ out = execute("bin/lono cfn create my-stack #{@args}")
11
+ expect(out).to include("Creating")
12
+ end
13
+
14
+ it "update stack" do
15
+ out = execute("bin/lono cfn update my-stack #{@args}")
16
+ expect(out).to include("Updating")
17
+ end
18
+
19
+ it "delete stack" do
20
+ out = execute("bin/lono cfn delete my-stack #{@args}")
21
+ expect(out).to include("Deleted")
22
+ end
23
+
24
+ it "preview stack" do
25
+ out = execute("bin/lono cfn preview my-stack #{@args}")
26
+ expect(out).to include("CloudFormation preview")
27
+ end
28
+
29
+ it "diff stack" do
30
+ out = execute("bin/lono cfn diff my-stack #{@args}")
31
+ expect(out).to include("diff")
32
+ end
33
+ end
34
+ end
35
+
@@ -1,4 +1,4 @@
1
- require File.expand_path("../../../spec_helper", __FILE__)
1
+ require_relative "../../spec_helper"
2
2
 
3
3
  describe Lono::New do
4
4
  before(:each) do
@@ -20,7 +20,7 @@ describe Lono::New do
20
20
  end
21
21
 
22
22
  it "should be able to lono generate" do
23
- dsl = Lono::DSL.new(
23
+ dsl = Lono::Template::DSL.new(
24
24
  project_root: @project_root,
25
25
  quiet: true
26
26
  )
@@ -42,7 +42,7 @@ describe Lono::New do
42
42
  end
43
43
 
44
44
  it "should be able to lono generate" do
45
- dsl = Lono::DSL.new(
45
+ dsl = Lono::Template::DSL.new(
46
46
  project_root: @project_root,
47
47
  quiet: true
48
48
  )
@@ -0,0 +1,15 @@
1
+ require_relative "../../spec_helper"
2
+
3
+ describe Lono::Param do
4
+ before(:all) do
5
+ @args = "--project-root spec/fixtures/my_project"
6
+ end
7
+
8
+ describe "lono param" do
9
+ it "generate" do
10
+ out = execute("bin/lono param generate #{@args}")
11
+ expect(out).to include("Generating")
12
+ end
13
+ end
14
+ end
15
+
@@ -1,6 +1,6 @@
1
- require File.expand_path("../../../spec_helper", __FILE__)
1
+ require_relative "../../../spec_helper"
2
2
 
3
- describe Lono::DSL do
3
+ describe Lono::Template::DSL do
4
4
  before(:each) do
5
5
  @project_root = File.expand_path("../../../../tmp/lono_project", __FILE__)
6
6
  end
@@ -20,11 +20,11 @@ describe Lono::DSL do
20
20
  end
21
21
 
22
22
  it "json" do
23
- dsl = Lono::DSL.new(
23
+ dsl = Lono::Template::DSL.new(
24
24
  project_root: @project_root,
25
25
  quiet: true
26
26
  )
27
- dsl.evaluate # run the dependent instance_eval and load_subfoler so @templates is assigned
27
+ dsl.evaluate_templates # run the dependent instance_eval and load_subfoler so @templates is assigned
28
28
  detected_format = dsl.detect_format
29
29
  expect(detected_format).to eq 'json'
30
30
  end
@@ -42,11 +42,11 @@ describe Lono::DSL do
42
42
  end
43
43
 
44
44
  it "yaml" do
45
- dsl = Lono::DSL.new(
45
+ dsl = Lono::Template::DSL.new(
46
46
  project_root: @project_root,
47
47
  quiet: true
48
48
  )
49
- dsl.evaluate # run the dependent instance_eval and load_subfoler so @templates is assigned
49
+ dsl.evaluate_templates # run the dependent instance_eval and load_subfoler so @templates is assigned
50
50
  detected_format = dsl.detect_format
51
51
  expect(detected_format).to eq 'yaml'
52
52
  end
@@ -54,7 +54,7 @@ describe Lono::DSL do
54
54
 
55
55
  context "multiple format starter project" do
56
56
  # it "yaml" do
57
- # dsl = Lono::DSL.new(
57
+ # dsl = Lono::Template::DSL.new(
58
58
  # project_root: @project,
59
59
  # quiet: true
60
60
  # )
@@ -73,7 +73,7 @@ describe Lono::DSL do
73
73
  )
74
74
  new_project.run
75
75
 
76
- dsl = Lono::DSL.new(
76
+ dsl = Lono::Template::DSL.new(
77
77
  project_root: @project_root,
78
78
  quiet: true
79
79
  )
@@ -141,7 +141,7 @@ describe Lono::DSL do
141
141
 
142
142
  it "should transform bash script to CF template user_data" do
143
143
  block = Proc.new { }
144
- template = Lono::Template.new("foo", block)
144
+ template = Lono::Template::Template.new("foo", block)
145
145
 
146
146
  line = 'echo {"Ref"=>"AWS::StackName"} > /tmp/stack_name ; {"Ref"=>"Ami"}'
147
147
  data = template.transform(line)
@@ -0,0 +1,104 @@
1
+ require_relative "../../../spec_helper"
2
+
3
+ describe Lono::Template do
4
+ let(:template) do
5
+ block = Proc.new {}
6
+ template = Lono::Template::Template.new("output_name.yml", block)
7
+
8
+ # override the puts and printf methods within the test
9
+ def template.messages
10
+ @messages
11
+ end
12
+
13
+ def template.puts(msg)
14
+ @messages ||= []
15
+ @messages << msg
16
+ nil
17
+ end
18
+
19
+ def template.printf(*args)
20
+ @messages ||= []
21
+ @messages << args
22
+ end
23
+
24
+ template
25
+ end
26
+
27
+ context "valid erb template" do
28
+ it "should be able to lono generate" do
29
+ template.erb_result("path", "template")
30
+ end
31
+ end
32
+
33
+ context "invalid erb template" do
34
+ it "should print out useful error message about undefined variable" do
35
+ template.erb_result("path", "variable does not exist\n<% variable %>\nanother line")
36
+ errors = template.messages.grep(/Error evaluating ERB template on line/)
37
+ expect(errors).not_to be_empty
38
+ end
39
+
40
+ it "should print out useful error message about syntax error" do
41
+ template.erb_result("path", "<%s dsfds ?%>\nanother line")
42
+ errors = template.messages.grep(/Error evaluating ERB template on line/)
43
+ expect(errors).not_to be_empty
44
+ end
45
+ end
46
+
47
+ describe "parsing" do
48
+ it "should transform bash script into json array with cloudformation objects" do
49
+ block = Proc.new { }
50
+ template = Lono::Template::Template.new("foo", block)
51
+
52
+ line = '0{2345}7'
53
+ expect(template.bracket_positions(line)).to eq [[0,0],[1,6],[7,7]]
54
+ line = '0{2}4{6}' # more than one bracket
55
+ expect(template.bracket_positions(line)).to eq [[0,0],[1,3],[4,4],[5,7]]
56
+ line = '0{2}4{6{8}0}2' # nested brackets
57
+ expect(template.bracket_positions(line)).to eq [[0,0],[1,3],[4,4],[5,11],[12,12]]
58
+
59
+ line = '{'
60
+ expect(template.decompose(line)).to eq ['{']
61
+
62
+ ##########################
63
+ line = '1{"Ref"=>"A"}{"Ref"=>"B"}'
64
+ expect(template.decompose(line)).to eq ['1','{"Ref"=>"A"}','{"Ref"=>"B"}']
65
+
66
+ line = '{"Ref"=>"A"}{"Ref"=>"B"}2'
67
+ expect(template.decompose(line)).to eq ['{"Ref"=>"A"}','{"Ref"=>"B"}','2']
68
+
69
+ line = '1{"Ref"=>"A"}{"Ref"=>"B"}2'
70
+ expect(template.decompose(line)).to eq ['1','{"Ref"=>"A"}','{"Ref"=>"B"}','2']
71
+
72
+ line = '{"Ref"=>"A"}{"Ref"=>"B"}'
73
+ expect(template.decompose(line)).to eq ['{"Ref"=>"A"}','{"Ref"=>"B"}']
74
+
75
+ line = 'Ref{"Ref"=>"B"}'
76
+ expect(template.decompose(line)).to eq ['Ref','{"Ref"=>"B"}']
77
+ ##############################
78
+
79
+ # only allow whitelist
80
+ line = 'a{b}{"foo"=>"bar"}h'
81
+ expect(template.decompose(line)).to eq ['a{b}{"foo"=>"bar"}h']
82
+
83
+ line = 'a{b}{"Ref"=>"bar"}h'
84
+ expect(template.decompose(line)).to eq ['a{b}','{"Ref"=>"bar"}','h']
85
+ line = 'a{"Ref"=>"bar"}c{"Ref"=>{"cat"=>"mouse"}}e' # nested brackets
86
+ expect(template.decompose(line)).to eq ['a','{"Ref"=>"bar"}','c','{"Ref"=>{"cat"=>"mouse"}}','e']
87
+
88
+ line = 'test{"Ref"=>"world"}me' # nested brackets
89
+ decomposition = template.decompose(line)
90
+ result = template.recompose(decomposition)
91
+ expect(result).to eq ["test", {"Ref" => "world"}, "me"]
92
+
93
+ line = 'test{"Ref"=>"world"}me'
94
+ expect(template.transform(line)).to eq ["test", {"Ref" => "world"}, "me\n"]
95
+ line = '{"Ref"=>"world"}'
96
+ expect(template.transform(line)).to eq [{"Ref" => "world"}, "\n"]
97
+ line = '{'
98
+ expect(template.transform(line)).to eq ["{\n"]
99
+ line = 'Ref{"Ref"=>"B"}'
100
+ expect(template.transform(line)).to eq ['Ref',{"Ref"=>"B"}, "\n"]
101
+ end
102
+ end
103
+
104
+ end
@@ -1,46 +1,31 @@
1
- require File.expand_path("../../../spec_helper", __FILE__)
2
-
3
- describe Lono::Template do
4
- let(:template) do
5
- block = Proc.new {}
6
- template = Lono::Template.new("output_name.yml", block)
7
-
8
- # override the puts and printf methods within the test
9
- def template.messages
10
- @messages
11
- end
12
-
13
- def template.puts(msg)
14
- @messages ||= []
15
- @messages << msg
16
- nil
17
- end
18
-
19
- def template.printf(*args)
20
- @messages ||= []
21
- @messages << args
22
- end
23
-
24
- template
1
+ require_relative "../../spec_helper"
2
+
3
+ describe Lono do
4
+ before(:each) do
5
+ lono_bin = File.expand_path("../../../../bin/lono", __FILE__)
6
+ @project_root = File.expand_path("../../../../tmp/lono_project", __FILE__)
7
+ dir = File.dirname(@project_root)
8
+ name = File.basename(@project_root)
9
+ FileUtils.mkdir(dir) unless File.exist?(dir)
10
+ execute("cd #{dir} && #{lono_bin} new #{name} -f -q --format json")
25
11
  end
26
12
 
27
- context "valid erb template" do
28
- it "should be able to lono generate" do
29
- template.erb_result("path", "template")
30
- end
13
+ after(:each) do
14
+ FileUtils.rm_rf(@project_root) unless ENV['KEEP_TMP_PROJECT']
31
15
  end
32
16
 
33
- context "invalid erb template" do
34
- it "should print out useful error message about undefined variable" do
35
- template.erb_result("path", "variable does not exist\n<% variable %>\nanother line")
36
- errors = template.messages.grep(/Error evaluating ERB template on line/)
37
- expect(errors).not_to be_empty
17
+ describe "bashify" do
18
+ it "should convert cfn user_data to bash script" do
19
+ path = "#{$root}/spec/fixtures/cfn.json"
20
+ out = execute("./bin/lono template bashify #{path}")
21
+ expect(out).to match /bash -lexv/
38
22
  end
23
+ end
39
24
 
40
- it "should print out useful error message about syntax error" do
41
- template.erb_result("path", "<%s dsfds ?%>\nanother line")
42
- errors = template.messages.grep(/Error evaluating ERB template on line/)
43
- expect(errors).not_to be_empty
25
+ describe "cli specs" do
26
+ it "should generate templates" do
27
+ out = execute("./bin/lono template generate -c --project-root #{@project_root}")
28
+ expect(out).to match /Generating CloudFormation templates/
44
29
  end
45
30
  end
46
31
  end