lono 4.2.7 → 5.0.1
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/.cody/README.md +6 -0
- data/.cody/acceptance.sh +30 -0
- data/.cody/buildspec.yml +21 -0
- data/.cody/demo.rb +38 -0
- data/.cody/project.rb +12 -0
- data/.cody/role.rb +1 -0
- data/.gitignore +2 -0
- data/.gitmodules +6 -3
- data/.travis.yml +7 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile +0 -1
- data/LICENSE.txt +1 -22
- data/README.md +46 -55
- data/lib/lono.rb +20 -27
- data/lib/lono/app_file.rb +5 -0
- data/lib/lono/app_file/base.rb +19 -0
- data/lib/lono/app_file/build.rb +78 -0
- data/lib/lono/app_file/registry.rb +14 -0
- data/lib/lono/app_file/registry/item.rb +46 -0
- data/lib/lono/app_file/upload.rb +39 -0
- data/lib/lono/autoloader.rb +22 -0
- data/lib/lono/aws_services.rb +46 -0
- data/lib/lono/aws_services/util.rb +49 -0
- data/lib/lono/blueprint.rb +113 -0
- data/lib/lono/blueprint/find.rb +90 -0
- data/lib/lono/blueprint/helper.rb +18 -0
- data/lib/lono/blueprint/info.rb +10 -0
- data/lib/lono/blueprint/list.rb +14 -0
- data/lib/lono/blueprint/root.rb +43 -0
- data/lib/lono/cfn.rb +31 -19
- data/lib/lono/cfn/aws_service.rb +16 -0
- data/lib/lono/cfn/base.rb +244 -261
- data/lib/lono/cfn/create.rb +36 -32
- data/lib/lono/cfn/current.rb +1 -1
- data/lib/lono/cfn/delete.rb +2 -2
- data/lib/lono/cfn/deploy.rb +11 -0
- data/lib/lono/cfn/diff.rb +1 -1
- data/lib/lono/cfn/preview.rb +3 -3
- data/lib/lono/cfn/rollback.rb +26 -0
- data/lib/lono/cfn/status.rb +2 -203
- data/lib/lono/cfn/suffix.rb +67 -0
- data/lib/lono/cfn/update.rb +61 -53
- data/lib/lono/cli.rb +42 -23
- data/lib/lono/completer.rb +0 -2
- data/lib/lono/configure.rb +37 -0
- data/lib/lono/configure/aws_services.rb +18 -0
- data/lib/lono/configure/base.rb +94 -0
- data/lib/lono/configure/helpers.rb +128 -0
- data/lib/lono/conventions.rb +11 -0
- data/lib/lono/core.rb +42 -12
- data/lib/lono/core/config.rb +5 -4
- data/lib/lono/default/settings.yml +0 -11
- data/lib/lono/file_uploader.rb +9 -4
- data/lib/lono/help.rb +1 -2
- data/lib/lono/help/blueprint.md +46 -0
- data/lib/lono/help/cfn.md +5 -4
- data/lib/lono/help/cfn/create.md +14 -9
- data/lib/lono/help/cfn/deploy.md +92 -0
- data/lib/lono/help/cfn/diff.md +0 -1
- data/lib/lono/help/cfn/update.md +16 -15
- data/lib/lono/help/completion.md +3 -3
- data/lib/lono/help/generate.md +0 -1
- data/lib/lono/help/new.md +40 -34
- data/lib/lono/help/param.md +1 -1
- data/lib/lono/help/param/generate.md +1 -1
- data/lib/lono/help/template.md +2 -2
- data/lib/lono/help/xgraph.md +1 -1
- data/lib/lono/inspector.rb +1 -1
- data/lib/lono/inspector/base.rb +26 -10
- data/lib/lono/inspector/graph.rb +7 -3
- data/lib/lono/inspector/summary.rb +15 -3
- data/lib/lono/md5.rb +46 -0
- data/lib/lono/new.rb +40 -28
- data/lib/lono/new/helper.rb +2 -3
- data/lib/lono/param.rb +12 -11
- data/lib/lono/param/generator.rb +96 -42
- data/lib/lono/project_checker.rb +27 -8
- data/lib/lono/s3.rb +23 -0
- data/lib/lono/s3/bucket.rb +123 -0
- data/lib/lono/script.rb +4 -8
- data/lib/lono/script/base.rb +7 -2
- data/lib/lono/script/build.rb +7 -8
- data/lib/lono/script/upload.rb +4 -20
- data/lib/lono/sequence.rb +19 -16
- data/lib/lono/setting.rb +19 -27
- data/lib/lono/template.rb +22 -26
- data/lib/lono/template/base.rb +13 -0
- data/lib/lono/template/context.rb +4 -56
- data/lib/lono/template/context/loader.rb +70 -0
- data/lib/lono/template/dsl.rb +15 -151
- data/lib/lono/template/dsl/builder.rb +60 -0
- data/lib/lono/template/dsl/builder/base.rb +14 -0
- data/lib/lono/template/dsl/builder/condition.rb +26 -0
- data/lib/lono/template/dsl/builder/fn.rb +114 -0
- data/lib/lono/template/dsl/builder/helper.rb +64 -0
- data/lib/lono/template/dsl/builder/mapping.rb +24 -0
- data/lib/lono/template/dsl/builder/output.rb +37 -0
- data/lib/lono/template/dsl/builder/parameter.rb +39 -0
- data/lib/lono/template/dsl/builder/resource.rb +38 -0
- data/lib/lono/template/dsl/builder/section.rb +12 -0
- data/lib/lono/template/dsl/builder/syntax.rb +58 -0
- data/lib/lono/template/erb.rb +82 -0
- data/lib/lono/template/evaluate.rb +39 -0
- data/lib/lono/template/generator.rb +29 -0
- data/lib/lono/template/helper.rb +7 -29
- data/lib/lono/template/post_processor.rb +69 -0
- data/lib/lono/template/template.rb +4 -9
- data/lib/lono/template/upload.rb +103 -133
- data/lib/lono/template/util.rb +48 -0
- data/lib/lono/upgrade.rb +5 -3
- data/lib/lono/upgrade/upgrade5.rb +55 -0
- data/lib/lono/user_data.rb +4 -4
- data/lib/lono/version.rb +1 -1
- data/lib/templates/blueprint/%blueprint_name%.gemspec.tt +44 -0
- data/lib/templates/blueprint/.gitignore +14 -0
- data/lib/templates/blueprint/.lono/config.yml.tt +3 -0
- data/lib/templates/blueprint/.meta/config.yml.tt +3 -0
- data/lib/templates/blueprint/CHANGELOG.md +7 -0
- data/lib/templates/blueprint/Gemfile +4 -0
- data/lib/templates/blueprint/README.md +37 -0
- data/lib/templates/blueprint/Rakefile +6 -0
- data/lib/templates/blueprint/setup/configs.rb +54 -0
- data/lib/templates/blueprint_configs/configs/%blueprint_name%/params/base.txt +2 -0
- data/lib/{starter_projects/skeleton/app/definitions/base.rb → templates/blueprint_configs/configs/%blueprint_name%/params/development.txt} +0 -0
- data/lib/templates/blueprint_configs/configs/%blueprint_name%/variables/base.rb +2 -0
- data/lib/templates/blueprint_configs/configs/%blueprint_name%/variables/development.rb +0 -0
- data/lib/templates/blueprint_types/dsl/app/templates/%blueprint_name%.rb +37 -0
- data/lib/templates/blueprint_types/dsl/app/user_data/bootstrap.sh +2 -0
- data/lib/templates/blueprint_types/erb/app/definitions/base.rb.tt +1 -0
- data/lib/templates/blueprint_types/erb/app/templates/%blueprint_name%.yml +8 -0
- data/lib/{starter_projects/autoscaling → templates/skeleton}/.gitignore +1 -0
- data/lib/templates/skeleton/Gemfile +3 -0
- data/lib/{starter_projects/autoscaling → templates/skeleton}/Guardfile +2 -2
- data/lib/templates/skeleton/README.md +58 -0
- data/lib/templates/skeleton/configs/settings.yml +17 -0
- data/lib/templates/upgrade5/blueprints/main/.lono/config.yml +3 -0
- data/lib/templates/upgrade5/blueprints/main/.meta/config.yml +3 -0
- data/lono.gemspec +12 -8
- data/vendor/cfn-status/CHANGELOG.md +10 -0
- data/vendor/cfn-status/Gemfile +4 -0
- data/vendor/cfn-status/LICENSE.txt +21 -0
- data/vendor/cfn-status/README.md +56 -0
- data/vendor/cfn-status/Rakefile +6 -0
- data/vendor/cfn-status/bin/console +14 -0
- data/vendor/cfn-status/bin/setup +8 -0
- data/vendor/cfn-status/cfn-status.gemspec +30 -0
- data/vendor/cfn-status/lib/cfn-status.rb +1 -0
- data/vendor/cfn-status/lib/cfn/aws_service.rb +51 -0
- data/vendor/cfn-status/lib/cfn/status.rb +219 -0
- data/vendor/cfn-status/lib/cfn/status/version.rb +5 -0
- data/vendor/cfn-status/spec/cfn/status_spec.rb +81 -0
- data/vendor/cfn-status/spec/fixtures/cfn/stack-events-complete.json +1080 -0
- data/vendor/cfn-status/spec/fixtures/cfn/stack-events-in-progress.json +1080 -0
- data/vendor/cfn-status/spec/fixtures/cfn/stack-events-update-rollback-complete.json +1086 -0
- data/vendor/cfn-status/spec/spec_helper.rb +14 -0
- data/vendor/cfn_camelizer/CHANGELOG.md +20 -0
- data/vendor/cfn_camelizer/Gemfile +4 -0
- data/vendor/cfn_camelizer/LICENSE.txt +21 -0
- data/vendor/cfn_camelizer/README.md +40 -0
- data/vendor/cfn_camelizer/Rakefile +6 -0
- data/vendor/cfn_camelizer/bin/console +14 -0
- data/vendor/cfn_camelizer/bin/setup +8 -0
- data/vendor/cfn_camelizer/cfn_camelizer.gemspec +32 -0
- data/vendor/cfn_camelizer/lib/camelizer.yml +37 -0
- data/vendor/cfn_camelizer/lib/cfn_camelizer.rb +94 -0
- data/vendor/cfn_camelizer/lib/cfn_camelizer/version.rb +3 -0
- data/vendor/cfn_camelizer/spec/cfn_camelizer_spec.rb +86 -0
- data/vendor/cfn_camelizer/spec/spec_helper.rb +14 -0
- metadata +189 -62
- data/.circleci/bin/commit_docs.sh +0 -26
- data/.circleci/config.yml +0 -72
- data/bin/release +0 -9
- data/lib/lono/help/import.md +0 -54
- data/lib/lono/importer.rb +0 -134
- data/lib/lono/new/message.rb +0 -35
- data/lib/starter_projects/autoscaling/Gemfile +0 -3
- data/lib/starter_projects/autoscaling/README.md +0 -118
- data/lib/starter_projects/autoscaling/app/definitions/base.rb +0 -2
- data/lib/starter_projects/autoscaling/app/templates/autoscaling.yml +0 -682
- data/lib/starter_projects/autoscaling/config/params/base/autoscaling.txt +0 -6
- data/lib/starter_projects/autoscaling/config/settings.yml +0 -33
- data/lib/starter_projects/ec2/.gitignore +0 -2
- data/lib/starter_projects/ec2/Gemfile +0 -3
- data/lib/starter_projects/ec2/Guardfile +0 -12
- data/lib/starter_projects/ec2/README.md +0 -86
- data/lib/starter_projects/ec2/app/definitions/base.rb +0 -2
- data/lib/starter_projects/ec2/app/definitions/development.rb +0 -1
- data/lib/starter_projects/ec2/app/definitions/production.rb +0 -1
- data/lib/starter_projects/ec2/app/helpers/my_custom_helper.rb +0 -17
- data/lib/starter_projects/ec2/app/partials/user_data/bootstrap.sh +0 -4
- data/lib/starter_projects/ec2/app/templates/example.yml +0 -430
- data/lib/starter_projects/ec2/config/params/base/example.txt +0 -2
- data/lib/starter_projects/ec2/config/params/development/example.txt +0 -3
- data/lib/starter_projects/ec2/config/params/production/example.txt +0 -2
- data/lib/starter_projects/ec2/config/settings.yml +0 -33
- data/lib/starter_projects/ec2/config/variables/base.rb +0 -3
- data/lib/starter_projects/ec2/config/variables/development.rb +0 -2
- data/lib/starter_projects/ec2/config/variables/production.rb +0 -2
- data/lib/starter_projects/ec2/welcome.txt +0 -8
- data/lib/starter_projects/skeleton/.gitignore +0 -2
- data/lib/starter_projects/skeleton/Gemfile +0 -3
- data/lib/starter_projects/skeleton/Guardfile +0 -12
- data/lib/starter_projects/skeleton/README.md +0 -53
- data/lib/starter_projects/skeleton/config/settings.yml +0 -33
- data/lib/starter_projects/skeleton/welcome.txt +0 -7
- data/vendor/plissken/Gemfile +0 -14
- data/vendor/plissken/LICENSE.txt +0 -20
- data/vendor/plissken/README.md +0 -46
- data/vendor/plissken/Rakefile +0 -56
- data/vendor/plissken/VERSION +0 -1
- data/vendor/plissken/lib/plissken.rb +0 -1
- data/vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb +0 -45
- data/vendor/plissken/plissken.gemspec +0 -61
- data/vendor/plissken/spec/lib/to_snake_keys_spec.rb +0 -177
- data/vendor/plissken/spec/spec_helper.rb +0 -90
- data/vendor/plissken/test/helper.rb +0 -20
- data/vendor/plissken/test/plissken/ext/hash/to_snake_keys_test.rb +0 -184
- data/vendor/plissken/test/test_plissken.rb +0 -2
@@ -0,0 +1,14 @@
|
|
1
|
+
module Lono::AppFile
|
2
|
+
class Registry
|
3
|
+
@@items = []
|
4
|
+
class << self
|
5
|
+
def register(name, blueprint, options={})
|
6
|
+
@@items << Item.new(name, blueprint, options) unless @@items.detect { |i| i.name == name }
|
7
|
+
end
|
8
|
+
|
9
|
+
def items
|
10
|
+
@@items
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Lono::AppFile
|
2
|
+
class Registry
|
3
|
+
# Holds metadata about the item in the regsitry.
|
4
|
+
class Item
|
5
|
+
attr_reader :name, :options
|
6
|
+
def initialize(name, blueprint, options={})
|
7
|
+
@name, @blueprint, @options = name, blueprint, options
|
8
|
+
end
|
9
|
+
|
10
|
+
def path
|
11
|
+
"#{Lono.root}/output/#{@blueprint}/files/#{@name}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def directory?
|
15
|
+
File.directory?(path)
|
16
|
+
end
|
17
|
+
|
18
|
+
def file?
|
19
|
+
File.file?(path)
|
20
|
+
end
|
21
|
+
|
22
|
+
def s3_path
|
23
|
+
file_path = zip_file_path.sub(%r{.*/output/[\w_-]+/files/}, '') # dont use basename. there might be subfolders
|
24
|
+
"#{s3_prefix}/#{file_path}"
|
25
|
+
end
|
26
|
+
|
27
|
+
# full path
|
28
|
+
def zip_file_path
|
29
|
+
"#{File.dirname(path)}/#{zip_file_name}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def zip_file_name
|
33
|
+
"#{File.basename(path)}-#{Lono::Md5.sum(path)}.zip"
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def md5_path
|
38
|
+
Lono::Md5.name(path)
|
39
|
+
end
|
40
|
+
|
41
|
+
def s3_prefix
|
42
|
+
"#{Lono.env}/#{@blueprint}/files" # development/ecs-asg/files
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Lono::AppFile
|
2
|
+
class Upload < Base
|
3
|
+
include Lono::AwsServices
|
4
|
+
extend Memoist
|
5
|
+
|
6
|
+
def initialize(blueprint, options={})
|
7
|
+
@blueprint, @options = blueprint, options
|
8
|
+
end
|
9
|
+
|
10
|
+
def upload
|
11
|
+
puts "Uploading app/files..."
|
12
|
+
|
13
|
+
Registry.items.each do |item|
|
14
|
+
s3_upload(item)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# TODO: check md5sum and only upload if it changes
|
19
|
+
def s3_upload(item)
|
20
|
+
filepath = item.zip_file_path
|
21
|
+
s3_key = item.s3_path
|
22
|
+
s3_path = "s3://#{s3_bucket}/#{s3_key}"
|
23
|
+
message = "Uploading: #{filepath} to #{s3_path}".color(:green)
|
24
|
+
message = "NOOP: #{message}" if @options[:noop]
|
25
|
+
puts message
|
26
|
+
return if @options[:noop]
|
27
|
+
|
28
|
+
s3.put_object(
|
29
|
+
body: IO.read(filepath),
|
30
|
+
bucket: s3_bucket,
|
31
|
+
key: s3_key,
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
def s3_bucket
|
36
|
+
Lono::S3::Bucket.name
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "zeitwerk"
|
2
|
+
|
3
|
+
module Lono
|
4
|
+
class Autoloader
|
5
|
+
class Inflector < Zeitwerk::Inflector
|
6
|
+
def camelize(basename, _abspath)
|
7
|
+
map = { cli: "CLI", version: "VERSION" }
|
8
|
+
map[basename.to_sym] || super
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def setup
|
14
|
+
loader = Zeitwerk::Loader.new
|
15
|
+
loader.inflector = Inflector.new
|
16
|
+
loader.push_dir(File.dirname(__dir__)) # lib
|
17
|
+
# loader.log! # uncomment to debug
|
18
|
+
loader.setup
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "aws-sdk-cloudformation"
|
2
|
+
require "aws-sdk-ec2"
|
3
|
+
require "aws-sdk-iam"
|
4
|
+
require "aws-sdk-s3"
|
5
|
+
|
6
|
+
module Lono
|
7
|
+
module AwsServices
|
8
|
+
extend Memoist
|
9
|
+
include Util
|
10
|
+
|
11
|
+
def ec2
|
12
|
+
Aws::EC2::Client.new
|
13
|
+
end
|
14
|
+
memoize :ec2
|
15
|
+
|
16
|
+
def iam
|
17
|
+
Aws::IAM::Client.new
|
18
|
+
end
|
19
|
+
memoize :iam
|
20
|
+
|
21
|
+
def sts
|
22
|
+
Aws::STS::Client.new # part of aws-sdk-core
|
23
|
+
end
|
24
|
+
memoize :sts
|
25
|
+
|
26
|
+
def s3
|
27
|
+
Aws::S3::Client.new
|
28
|
+
end
|
29
|
+
memoize :s3
|
30
|
+
|
31
|
+
def s3_resource
|
32
|
+
Aws::S3::Resource.new
|
33
|
+
end
|
34
|
+
memoize :s3_resource
|
35
|
+
|
36
|
+
def s3_presigner
|
37
|
+
Aws::S3::Presigner.new(client: s3)
|
38
|
+
end
|
39
|
+
memoize :s3_presigner
|
40
|
+
|
41
|
+
def cfn
|
42
|
+
Aws::CloudFormation::Client.new
|
43
|
+
end
|
44
|
+
memoize :cfn
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Lono::AwsServices
|
2
|
+
module Util
|
3
|
+
def stack_exists?(stack_name)
|
4
|
+
return true if testing_update?
|
5
|
+
return false if @options[:noop]
|
6
|
+
|
7
|
+
exist = nil
|
8
|
+
begin
|
9
|
+
# When the stack does not exist an exception is raised. Example:
|
10
|
+
# Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
|
11
|
+
cfn.describe_stacks(stack_name: stack_name)
|
12
|
+
exist = true
|
13
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
14
|
+
if e.message =~ /does not exist/
|
15
|
+
exist = false
|
16
|
+
elsif e.message.include?("'stackName' failed to satisfy constraint")
|
17
|
+
# Example of e.message when describe_stack with invalid stack name
|
18
|
+
# "1 validation error detected: Value 'instance_and_route53' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*|arn:[-a-zA-Z0-9:/._+]*"
|
19
|
+
puts "Invalid stack name: #{stack_name}"
|
20
|
+
puts "Full error message: #{e.message}"
|
21
|
+
exit 1
|
22
|
+
else
|
23
|
+
raise # re-raise exception because unsure what other errors can happen
|
24
|
+
end
|
25
|
+
end
|
26
|
+
exist
|
27
|
+
end
|
28
|
+
|
29
|
+
def find_stack(stack_name)
|
30
|
+
resp = cfn.describe_stacks(stack_name: stack_name)
|
31
|
+
resp.stacks.first
|
32
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
33
|
+
# example: Stack with id demo-web does not exist
|
34
|
+
if e.message =~ /Stack with/ && e.message =~ /does not exist/
|
35
|
+
nil
|
36
|
+
else
|
37
|
+
raise
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def rollback_complete?(stack)
|
42
|
+
stack.stack_status == 'ROLLBACK_COMPLETE'
|
43
|
+
end
|
44
|
+
|
45
|
+
def testing_update?
|
46
|
+
ENV['TEST'] && self.class.name == "LonoCfn::Update"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
module Lono
|
2
|
+
class Blueprint < Sequence
|
3
|
+
include Helper
|
4
|
+
|
5
|
+
argument :blueprint_name
|
6
|
+
|
7
|
+
def self.source_root
|
8
|
+
templates = File.expand_path("../templates", File.dirname(__FILE__))
|
9
|
+
"#{templates}/blueprint"
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.cli_options
|
13
|
+
[
|
14
|
+
[:bundle, type: :boolean, default: true, desc: "Runs bundle install on the project"],
|
15
|
+
[:force, type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files."],
|
16
|
+
[:from_new, type: :boolean, desc: "Called from `lono new` command."],
|
17
|
+
[:project_name, default: '', desc: "Only used with from_new internally"],
|
18
|
+
[:type, default: "dsl", desc: "Blueprint type: dsl or erb"],
|
19
|
+
]
|
20
|
+
end
|
21
|
+
|
22
|
+
cli_options.each do |args|
|
23
|
+
class_option(*args)
|
24
|
+
end
|
25
|
+
|
26
|
+
# for specs
|
27
|
+
def set_cwd
|
28
|
+
@cwd = ENV['TEST'] ? File.dirname(Lono.root) : "#{Dir.pwd}/blueprints"
|
29
|
+
|
30
|
+
if options[:from_new]
|
31
|
+
# At this point @cwd will have the project_name from `lono new`
|
32
|
+
# Yup, it's confusing. Here's an example to explain:
|
33
|
+
#
|
34
|
+
# lono new my-infra - sets @cwd = my-infra
|
35
|
+
#
|
36
|
+
# Then within the new Thor::Group this is called
|
37
|
+
#
|
38
|
+
# Lono::Blueprint.start(["ec2", "--from-new"])
|
39
|
+
#
|
40
|
+
# So @cwd = my-infra/blueprints
|
41
|
+
@cwd = "#{options[:project_name]}/blueprints"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def create_project
|
46
|
+
puts "=> Creating new blueprint called #{blueprint_name}."
|
47
|
+
directory ".", "#{@cwd}/#{blueprint_name}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_app_folder
|
51
|
+
directory "../blueprint_types/#{@options[:type]}", "#{@cwd}/#{blueprint_name}"
|
52
|
+
end
|
53
|
+
|
54
|
+
def create_empty_directories
|
55
|
+
# Note: Not using Lono::Core::Config::PATHS.keys to create all of them because
|
56
|
+
# think it is more common to not have all the folders. Instead create them explicitly.
|
57
|
+
empty_directory "#{@cwd}/#{blueprint_name}/app/templates"
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_starter_configs
|
61
|
+
if options[:from_new] # lono new command
|
62
|
+
directory "../blueprint_configs", options[:project_name]
|
63
|
+
else # lono blueprint command
|
64
|
+
directory "../blueprint_configs", "."
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# After this commands are executed with the newly created project
|
69
|
+
def set_destination_root
|
70
|
+
destination_root = "#{@cwd}/#{blueprint_name}"
|
71
|
+
self.destination_root = destination_root
|
72
|
+
FileUtils.cd(self.destination_root)
|
73
|
+
end
|
74
|
+
|
75
|
+
def bundle_install
|
76
|
+
return if options[:from_new]
|
77
|
+
return unless options[:bundle]
|
78
|
+
|
79
|
+
puts "=> Installing dependencies with: bundle install"
|
80
|
+
Bundler.with_clean_env do
|
81
|
+
system("BUNDLE_IGNORE_CONFIG=1 bundle install")
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def welcome_message
|
86
|
+
return if options[:from_new]
|
87
|
+
puts <<~EOL
|
88
|
+
#{"="*64}
|
89
|
+
Congrats 🎉 You have successfully created a lono blueprint.
|
90
|
+
|
91
|
+
Cd into your blueprint and check things out.
|
92
|
+
|
93
|
+
cd #{blueprint_name}
|
94
|
+
|
95
|
+
More info: https://lono.cloud/docs/core/blueprints
|
96
|
+
|
97
|
+
EOL
|
98
|
+
end
|
99
|
+
|
100
|
+
def tree
|
101
|
+
return if options[:from_new]
|
102
|
+
tree_installed = system("type tree > /dev/null")
|
103
|
+
return unless tree_installed
|
104
|
+
|
105
|
+
structure = `tree .`
|
106
|
+
puts <<~EOL
|
107
|
+
Here's the structure of your blueprint:
|
108
|
+
|
109
|
+
#{structure}
|
110
|
+
EOL
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
class Lono::Blueprint
|
4
|
+
class Find
|
5
|
+
class << self
|
6
|
+
extend Memoist
|
7
|
+
|
8
|
+
def one_or_all(blueprint)
|
9
|
+
blueprint ? [blueprint] : all_blueprints
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns both project and gem blueprints
|
13
|
+
def all_blueprints
|
14
|
+
project_blueprints = all_project_blueprint_infos.map { |info| info.name }
|
15
|
+
|
16
|
+
gem_blueprints = specs.map do |spec|
|
17
|
+
dot_lono = dot_meta_path(spec)
|
18
|
+
config = YAML.load_file(dot_lono)
|
19
|
+
config["blueprint_name"]
|
20
|
+
end
|
21
|
+
|
22
|
+
all = project_blueprints + gem_blueprints
|
23
|
+
all.uniq
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns blueprint root full path. Can be:
|
27
|
+
#
|
28
|
+
# 1. projects blueprints/BLUEPRINT - higher precedence
|
29
|
+
# 2. full gem path
|
30
|
+
#
|
31
|
+
def find(blueprint)
|
32
|
+
# Check projects blueprints
|
33
|
+
info = all_project_blueprint_infos.find { |info| info.name == blueprint}
|
34
|
+
return info.path if info
|
35
|
+
|
36
|
+
# Check gem specs
|
37
|
+
result = specs.find do |spec|
|
38
|
+
dot_lono = dot_meta_path(spec)
|
39
|
+
config = YAML.load_file(dot_lono)
|
40
|
+
config["blueprint_name"] == blueprint
|
41
|
+
end
|
42
|
+
result.full_gem_path if result
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns: Array of Blueprint::Info. Example:
|
46
|
+
#
|
47
|
+
# [#<Lono::Blueprint::Info:0x0000561e620e0548
|
48
|
+
# @name="ecs-spot-fleet",
|
49
|
+
# @path="/full/path/to/blueprint/ecs-spot-demo">,
|
50
|
+
# #<Lono::Blueprint::Info:0x0000561e61e132c0
|
51
|
+
# @name="ec2",
|
52
|
+
# @path="/full/path/to/blueprint/ec2">]
|
53
|
+
def all_project_blueprint_infos
|
54
|
+
infos = []
|
55
|
+
Dir.glob("#{Lono.root}/blueprints/*").select do |p|
|
56
|
+
dot_lono = dot_meta_path(p)
|
57
|
+
next unless File.exist?(dot_lono)
|
58
|
+
config = YAML.load_file(dot_lono)
|
59
|
+
infos << Info.new(config["blueprint_name"], p)
|
60
|
+
end
|
61
|
+
infos
|
62
|
+
end
|
63
|
+
|
64
|
+
# Only the blueprint specs
|
65
|
+
def specs
|
66
|
+
specs = Bundler.load.specs
|
67
|
+
specs.select do |spec|
|
68
|
+
File.exist?(dot_meta_path(spec))
|
69
|
+
end
|
70
|
+
end
|
71
|
+
memoize :specs
|
72
|
+
|
73
|
+
def dot_meta_path(source)
|
74
|
+
if source.is_a?(String) # path to folder
|
75
|
+
"#{source}/.meta/config.yml"
|
76
|
+
else # spec
|
77
|
+
"#{source.full_gem_path}/.meta/config.yml"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def bundler_version_check!
|
82
|
+
return unless Bundler.bundler_major_version >= 1 # LockfileParser only works for Bundler version 2+
|
83
|
+
|
84
|
+
puts "ERROR: The bundler version detected is too old. Please use bundler 2+".color(:red)
|
85
|
+
puts "Current detected bundler version is #{Bundler.bundler_major_version}"
|
86
|
+
exit 1
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Lono::Blueprint
|
2
|
+
module Helper
|
3
|
+
extend Memoist
|
4
|
+
|
5
|
+
def user_info
|
6
|
+
git_author_name = git_installed? ? `git config user.name`.chomp : ""
|
7
|
+
git_user_email = git_installed? ? `git config user.email`.chomp : ""
|
8
|
+
github_username = git_installed? ? `git config github.user`.chomp : ""
|
9
|
+
|
10
|
+
{
|
11
|
+
:author => git_author_name.empty? ? "TODO: Write your name" : git_author_name,
|
12
|
+
:email => git_user_email.empty? ? "TODO: Write your email address" : git_user_email,
|
13
|
+
:github_username => github_username.empty? ? "[USERNAME]" : github_username,
|
14
|
+
}
|
15
|
+
end
|
16
|
+
memoize :user_info
|
17
|
+
end
|
18
|
+
end
|