jets 0.8.18 → 0.9.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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +0 -3
  3. data/CHANGELOG.md +20 -1
  4. data/Gemfile.lock +6 -2
  5. data/README/prerelease.md +6 -0
  6. data/README/testing.md +41 -0
  7. data/Rakefile +9 -1
  8. data/jets.gemspec +1 -0
  9. data/lib/jets.rb +17 -18
  10. data/lib/jets/application.rb +26 -3
  11. data/lib/jets/aws_services.rb +26 -59
  12. data/lib/jets/aws_services/stack_status.rb +52 -0
  13. data/lib/jets/builders.rb +3 -2
  14. data/lib/jets/builders/handler_generator.rb +38 -2
  15. data/lib/jets/builders/shared_deducer.rb +32 -0
  16. data/lib/jets/cfn/builders.rb +3 -1
  17. data/lib/jets/cfn/builders/api_deployment_builder.rb +1 -1
  18. data/lib/jets/cfn/builders/api_gateway_builder.rb +1 -1
  19. data/lib/jets/cfn/builders/base_child_builder.rb +37 -7
  20. data/lib/jets/cfn/builders/controller_builder.rb +6 -1
  21. data/lib/jets/cfn/builders/function_builder.rb +5 -0
  22. data/lib/jets/cfn/builders/interface.rb +5 -6
  23. data/lib/jets/cfn/builders/job_builder.rb +5 -0
  24. data/lib/jets/cfn/builders/parent_builder.rb +17 -16
  25. data/lib/jets/cfn/builders/rule_builder.rb +6 -1
  26. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  27. data/lib/jets/commands.rb +9 -8
  28. data/lib/jets/commands/build.rb +36 -14
  29. data/lib/jets/commands/console.rb +1 -0
  30. data/lib/jets/commands/help/runner.md +17 -0
  31. data/lib/jets/commands/main.rb +7 -0
  32. data/lib/jets/commands/new.rb +39 -19
  33. data/lib/jets/commands/runner.rb +18 -0
  34. data/lib/jets/commands/sequence.rb +27 -1
  35. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  36. data/lib/jets/commands/templates/skeleton/Gemfile.tt +0 -1
  37. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +2 -0
  38. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +2 -1
  39. data/lib/jets/commands/templates/skeleton/config/routes.rb +5 -1
  40. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +5 -4
  41. data/lib/jets/core.rb +8 -6
  42. data/lib/jets/default/application.rb +1 -0
  43. data/lib/jets/generator.rb +1 -1
  44. data/lib/jets/inflections.rb +23 -0
  45. data/lib/jets/job/dsl.rb +69 -47
  46. data/lib/jets/klass.rb +6 -1
  47. data/lib/jets/lambda/dsl.rb +102 -34
  48. data/lib/jets/lambda/function_constructor.rb +2 -2
  49. data/lib/jets/lambda/task.rb +10 -5
  50. data/lib/jets/naming.rb +13 -2
  51. data/lib/jets/processors/deducer.rb +13 -2
  52. data/lib/jets/processors/main_processor.rb +1 -1
  53. data/lib/jets/rails_overrides.rb +1 -1
  54. data/lib/jets/resource.rb +20 -5
  55. data/lib/jets/resource/api_gateway/deployment.rb +0 -1
  56. data/lib/jets/resource/associated.rb +26 -0
  57. data/lib/jets/resource/base.rb +12 -0
  58. data/lib/jets/resource/child_stack.rb +2 -0
  59. data/lib/jets/resource/child_stack/api_deployment.rb +9 -15
  60. data/lib/jets/resource/child_stack/api_gateway.rb +8 -8
  61. data/lib/jets/resource/child_stack/app_class.rb +41 -16
  62. data/lib/jets/resource/child_stack/base.rb +24 -0
  63. data/lib/jets/resource/child_stack/shared.rb +90 -0
  64. data/lib/jets/resource/config.rb +4 -0
  65. data/lib/jets/resource/config/config_rule.rb +66 -0
  66. data/lib/jets/resource/config/managed_rule.rb +15 -0
  67. data/lib/jets/resource/events.rb +3 -0
  68. data/lib/jets/resource/events/rule.rb +31 -0
  69. data/lib/jets/resource/iam/application_role.rb +2 -2
  70. data/lib/jets/resource/iam/base_role_definition.rb +4 -2
  71. data/lib/jets/resource/iam/class_role.rb +50 -2
  72. data/lib/jets/resource/iam/function_role.rb +28 -0
  73. data/lib/jets/resource/iam/policy_document.rb +0 -4
  74. data/lib/jets/resource/permission.rb +12 -6
  75. data/lib/jets/resource/replacer.rb +4 -0
  76. data/lib/jets/resource/sns.rb +3 -0
  77. data/lib/jets/resource/standardizer.rb +42 -0
  78. data/lib/jets/router.rb +9 -1
  79. data/lib/jets/rule/dsl.rb +51 -78
  80. data/lib/jets/stack.rb +105 -0
  81. data/lib/jets/stack/builder.rb +38 -0
  82. data/lib/jets/stack/definition.rb +50 -0
  83. data/lib/jets/stack/function.rb +60 -0
  84. data/lib/jets/stack/main.rb +5 -0
  85. data/lib/jets/stack/main/dsl.rb +33 -0
  86. data/lib/jets/stack/main/extensions/base.rb +45 -0
  87. data/lib/jets/stack/main/extensions/cloudwatch.rb +19 -0
  88. data/lib/jets/stack/main/extensions/lambda.rb +69 -0
  89. data/lib/jets/stack/main/extensions/sns.rb +12 -0
  90. data/lib/jets/stack/main/extensions/sqs.rb +8 -0
  91. data/lib/jets/stack/output.rb +38 -0
  92. data/lib/jets/stack/output/dsl.rb +19 -0
  93. data/lib/jets/stack/output/lookup.rb +36 -0
  94. data/lib/jets/stack/parameter.rb +38 -0
  95. data/lib/jets/stack/parameter/dsl.rb +42 -0
  96. data/lib/jets/stack/resource.rb +30 -0
  97. data/lib/jets/stack/resource/dsl.rb +19 -0
  98. data/lib/jets/version.rb +1 -1
  99. metadata +53 -4
  100. data/support/clean +0 -3
  101. data/support/console +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23fe5d6d20d288bc4f2b791da60476662930ab3047a55d9e1904d168a875743c
4
- data.tar.gz: 0f1c04626989dbb8bb9393f3c67e94aedc7da3605102715df25b2ad282bcba35
3
+ metadata.gz: a34b4cffc9a96f0d4ce4821f38be3fef03a84a5dfa779a0ce4574b7c41fd8212
4
+ data.tar.gz: 77e840eb549a58d91c9899b79b0104f9d33e903fa4c1d53b171a168b0416fc64
5
5
  SHA512:
6
- metadata.gz: dd410110fe51ea01517dbe324b274f4ec883ab99640603c340f000ca5a6d2b1e6e2c7dedfd0710ebc9a10611398d21d4072634a16a627dd6fa4cdb1aede4f2fc
7
- data.tar.gz: 3c5e482eff4de95d39ac0bd70a6aab3316b938d4b2f0c62e9ee695d5b899c4d18d0df7505bc544367092ae98899234d0e904b88ca79069dc9bd9af2587301b35
6
+ metadata.gz: 0bbf43c980eef26615b9eb8c4167c578da79c3cdf5af17d866e1fd7276618c593997f51e7a31316c96d1f561a27fb3d829ad1ea4e2b5a5f77fd2f6b7cbf906f5
7
+ data.tar.gz: 9cca888aaca0c205722c93858aad544ace8d8fe71255806a373d18461744070e5105ef055e63e1d27a4d3683a2d509063ac78403cb33ef54b869e44d0c5ec112
@@ -1,6 +1,3 @@
1
- [submodule "spec/fixtures/apps/demo"]
2
- path = spec/fixtures/apps/demo
3
- url = https://github.com/tongueroo/demo.git
4
1
  [submodule "vendor/lambdagem"]
5
2
  path = vendor/lambdagem
6
3
  url = https://github.com/tongueroo/lambdagem.git
@@ -3,8 +3,27 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
5
5
 
6
+ ## [0.9.0]
7
+ - Remove class name from the namespace. So namespace only has method name now. NOTE: This means upgrading from 0.8.x to 0.9.x requires a blue-green update.
8
+ - Add upgrading docs.
9
+ - Stack DSL: To support the concept of Custom Shared Resources. Supports extensions and simple functions also.
10
+ - Stack DSL: Allow for control of DependsOn attribute.
11
+ - Stack DSL: `MyStack.lookup` method
12
+ - Associated resource extensions support
13
+ - Associated resources multiple form support: long, medium, short
14
+ - Add `jets new --mode`: 3 modes: html, api, job. Remove the `--api`
15
+ - IAM policies inherit from higher precedence and superclasses.
16
+ - Add `jets runner` command
17
+ - Fix AWS Config Rules support
18
+ - Rename event_rule to events_rule
19
+ - Remove submodule project demo fixture in favor of spec/fixtures/apps/franky
20
+ - Add spec/bin/integration.sh - Simpler than the CI one and more immediately useful
21
+ - Improve AWS Config Rules docs
22
+ - Add config rules namespace setting
23
+ - Custom inflections support
24
+
6
25
  ## [0.8.18]
7
- - improve performance of Jets.aws.region
26
+ - improve performance of Jets.aws.region, pull request #40 from tongueroo/dir-glob
8
27
 
9
28
  ## [0.8.17]
10
29
  - fix Jets.eager_load
@@ -11,7 +11,7 @@ GIT
11
11
  PATH
12
12
  remote: .
13
13
  specs:
14
- jets (0.8.18)
14
+ jets (0.9.0)
15
15
  actionpack (>= 5.2.1)
16
16
  actionview (>= 5.2.1)
17
17
  activerecord (>= 5.2.1)
@@ -21,6 +21,7 @@ PATH
21
21
  aws-sdk-dynamodb
22
22
  aws-sdk-lambda
23
23
  aws-sdk-s3
24
+ aws-sdk-sns
24
25
  colorize
25
26
  dotenv
26
27
  gems
@@ -89,6 +90,9 @@ GEM
89
90
  aws-sdk-core (~> 3, >= 3.26.0)
90
91
  aws-sdk-kms (~> 1)
91
92
  aws-sigv4 (~> 1.0)
93
+ aws-sdk-sns (1.5.0)
94
+ aws-sdk-core (~> 3, >= 3.26.0)
95
+ aws-sigv4 (~> 1.0)
92
96
  aws-sigv4 (1.0.3)
93
97
  builder (3.2.3)
94
98
  byebug (10.0.2)
@@ -170,4 +174,4 @@ DEPENDENCIES
170
174
  webpacker!
171
175
 
172
176
  BUNDLED WITH
173
- 1.16.4
177
+ 1.16.3
@@ -0,0 +1,6 @@
1
+ # Prerelease Checklist
2
+
3
+ This is a pre-release checklist for major and minor version bumps.
4
+
5
+ * Run Through tests in: [testing.md](testing.md)
6
+ * Deploy CRUD app to AWS Lambda and verify it works
@@ -0,0 +1,41 @@
1
+ # Testing
2
+
3
+ ## Unit
4
+
5
+ To run unit tests:
6
+
7
+ bundle exec rspec
8
+
9
+ ## Integration
10
+
11
+ ### Locally
12
+
13
+ To run the integration tests locally, you need to create a new Jets CRUD project and start the server:
14
+
15
+ jets new demo
16
+ cd demo
17
+ jets generate scaffold Post title:string
18
+ jets server
19
+
20
+ Then you can run the postman tests:
21
+
22
+ spec/integration/local.sh
23
+
24
+ The integration_local.sh script ensures that the necessary data exists for the postman integration test to pass. It ultimately calls:
25
+
26
+ newman run spec/integration/fixtures/postman/collection.json -e spec/integration/fixtures/postman/environment.json
27
+
28
+ The integration test results should look something like this:
29
+
30
+ * [Jets Integration Test Results](https://gist.github.com/tongueroo/fcea2b2f48342d1448d3f258fcd6536c)
31
+
32
+ ### Remotely
33
+
34
+ Then you can deploy the jets app and test it on real AWS Lambda.
35
+
36
+ cp ~/environment/.env.development.remote . # assumes you have a .env.development.remote
37
+ jets deploy
38
+
39
+ Run the remote integration script:
40
+
41
+ spec/integration/remote.sh
data/Rakefile CHANGED
@@ -5,6 +5,13 @@ task :default => :spec
5
5
 
6
6
  RSpec::Core::RakeTask.new
7
7
 
8
+ namespace :spec do
9
+ desc "Run integration test"
10
+ task :integration do
11
+ system("spec/bin/integration.sh")
12
+ end
13
+ end
14
+
8
15
  require_relative "lib/jets"
9
16
  desc "Generates cli reference docs as markdown"
10
17
  task :docs do
@@ -17,4 +24,5 @@ require 'jets/rdoc'
17
24
 
18
25
  RDoc::Task.new do |rdoc|
19
26
  rdoc.options += Jets::Rdoc.options
20
- end
27
+ end
28
+
@@ -36,6 +36,7 @@ Gem::Specification.new do |spec|
36
36
  spec.add_dependency "aws-sdk-dynamodb"
37
37
  spec.add_dependency "aws-sdk-lambda"
38
38
  spec.add_dependency "aws-sdk-s3"
39
+ spec.add_dependency "aws-sdk-sns"
39
40
  spec.add_dependency "colorize"
40
41
  spec.add_dependency "dotenv"
41
42
  spec.add_dependency "hashie"
@@ -11,43 +11,42 @@ module Jets
11
11
  # When we update Jets::RUBY_VERSION, need to update lambdagem/base.rb: def jets_ruby_version also
12
12
  RUBY_VERSION = "2.5.0"
13
13
 
14
- autoload :CLI, "jets/cli"
15
- autoload :Commands, "jets/commands"
16
-
14
+ autoload :Application, "jets/application"
17
15
  autoload :AwsInfo, "jets/aws_info"
18
16
  autoload :AwsServices, "jets/aws_services"
17
+ autoload :Booter, 'jets/booter'
19
18
  autoload :Builders, 'jets/builders'
20
19
  autoload :Call, "jets/call"
21
20
  autoload :Cfn, 'jets/cfn'
21
+ autoload :CLI, "jets/cli"
22
+ autoload :Commands, "jets/commands"
22
23
  autoload :Controller, 'jets/controller'
24
+ autoload :Core, "jets/core"
25
+ autoload :Dotenv, 'jets/dotenv'
23
26
  autoload :Erb, "jets/erb"
24
27
  autoload :Generator, "jets/generator"
28
+ autoload :IO, "jets/io"
25
29
  autoload :Job, 'jets/job'
30
+ autoload :Klass, 'jets/klass'
26
31
  autoload :Lambda, 'jets/lambda'
32
+ autoload :Logger, "jets/logger"
27
33
  autoload :Naming, 'jets/naming'
28
34
  autoload :PolyFun, 'jets/poly_fun'
35
+ autoload :Preheat, "jets/preheat"
29
36
  autoload :Processors, 'jets/processors'
37
+ autoload :Rdoc, "jets/rdoc"
38
+ autoload :Resource, "jets/resource"
30
39
  autoload :Route, "jets/route"
31
40
  autoload :Router, "jets/router"
41
+ autoload :RubyServer, "jets/ruby_server"
32
42
  autoload :Rule, 'jets/rule'
33
43
  autoload :Server, "jets/server"
34
-
35
- autoload :Application, "jets/application"
36
- autoload :Booter, 'jets/booter'
37
- autoload :Core, "jets/core"
38
- autoload :Dotenv, 'jets/dotenv'
39
- autoload :Klass, 'jets/klass'
40
- autoload :Util, "jets/util"
44
+ autoload :Stack, "jets/stack"
41
45
  autoload :Timing, "jets/timing"
42
- autoload :Preheat, "jets/preheat"
43
- extend Core # root, logger, etc
44
-
45
- autoload :RubyServer, "jets/ruby_server"
46
- autoload :IO, "jets/io"
47
- autoload :Logger, "jets/logger"
46
+ autoload :Util, "jets/util"
47
+ autoload :Inflections, "jets/inflections"
48
48
 
49
- autoload :Resource, "jets/resource"
50
- autoload :Rdoc, "jets/rdoc"
49
+ extend Core # root, logger, etc
51
50
  end
52
51
 
53
52
  require "jets/core_ext/kernel"
@@ -11,11 +11,16 @@ class Jets::Application
11
11
  end
12
12
 
13
13
  def setup!
14
+ load_inflections
14
15
  load_configs # load config object so following methods can use it
15
16
  setup_auto_load_paths
16
17
  load_routes
17
18
  end
18
19
 
20
+ def load_inflections
21
+ Jets::Inflections.load!
22
+ end
23
+
19
24
  def config
20
25
  config = ActiveSupport::OrderedOptions.new
21
26
 
@@ -30,6 +35,9 @@ class Jets::Application
30
35
  'https://gems.lambdagems.com'
31
36
  ]
32
37
 
38
+ config.inflections = ActiveSupport::OrderedOptions.new
39
+ config.inflections.irregular = {}
40
+
33
41
  config
34
42
  end
35
43
  memoize :config
@@ -91,12 +99,27 @@ class Jets::Application
91
99
 
92
100
  # Must set default iam_policy here instead of `def config` because we need access to
93
101
  # the project_namespace and if we call it from `def config` we get an infinit loop
94
- config.iam_policy ||= [{
95
- sid: "Statement1",
102
+ config.iam_policy ||= default_iam_policy(project_namespace)
103
+ config.managed_policy_definitions ||= [] # default empty
104
+ end
105
+
106
+ def default_iam_policy(project_namespace)
107
+ logs = {
96
108
  action: ["logs:*"],
97
109
  effect: "Allow",
98
110
  resource: "arn:aws:logs:#{Jets.aws.region}:#{Jets.aws.account}:log-group:/aws/lambda/#{project_namespace}-*",
99
- }]
111
+ }
112
+ policies = [logs]
113
+
114
+ if Jets::Stack.has_resources?
115
+ cloudformation = {
116
+ action: ["cloudformation:DescribeStacks"],
117
+ effect: "Allow",
118
+ resource: "arn:aws:cloudformation:#{Jets.aws.region}:#{Jets.aws.account}:stack/#{project_namespace}*",
119
+ }
120
+ policies << cloudformation
121
+ end
122
+ policies
100
123
  end
101
124
 
102
125
  # It is pretty easy to attempt to set environment variables without
@@ -1,81 +1,48 @@
1
- require "aws-sdk-s3"
2
1
  require "aws-sdk-cloudformation"
3
2
  require "aws-sdk-cloudwatchlogs"
4
3
  require "aws-sdk-lambda"
4
+ require "aws-sdk-s3"
5
5
  require "aws-sdk-sts"
6
+ # Not used in Jets internally but convenient for shared resources
7
+ require "aws-sdk-sns"
6
8
 
7
9
  module Jets::AwsServices
8
- def s3
9
- @s3 ||= Aws::S3::Client.new
10
- end
10
+ autoload :StackStatus, 'jets/aws_services/stack_status'
11
+ include StackStatus
12
+ extend Memoist
11
13
 
12
- def s3_resource
13
- @s3_resource ||= Aws::S3::Resource.new
14
+ def cfn
15
+ Aws::CloudFormation::Client.new
14
16
  end
17
+ memoize :cfn
15
18
 
16
- def cfn
17
- @cfn ||= Aws::CloudFormation::Client.new
19
+ def logs
20
+ Aws::CloudWatchLogs::Client.new
18
21
  end
22
+ memoize :logs
19
23
 
20
24
  def lambda
21
- @lambda ||= Aws::Lambda::Client.new
25
+ Aws::Lambda::Client.new
22
26
  end
27
+ memoize :lambda
23
28
 
24
- def sts
25
- @sts ||= Aws::STS::Client.new
29
+ def s3
30
+ Aws::S3::Client.new
26
31
  end
32
+ memoize :s3
27
33
 
28
- def logs
29
- @logs ||= Aws::CloudWatchLogs::Client.new
34
+ def s3_resource
35
+ Aws::S3::Resource.new
30
36
  end
37
+ memoize :s3_resource
31
38
 
32
- def stack_exists?(stack_name)
33
- return false if ENV['TEST']
34
-
35
- exist = nil
36
- begin
37
- # When the stack does not exist an exception is raised. Example:
38
- # Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
39
- resp = cfn.describe_stacks(stack_name: stack_name)
40
- exist = true
41
- rescue Aws::CloudFormation::Errors::ValidationError => e
42
- if e.message =~ /does not exist/
43
- exist = false
44
- elsif e.message.include?("'stackName' failed to satisfy constraint")
45
- # Example of e.message when describe_stack with invalid stack name
46
- # "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:/._+]*"
47
- puts "Invalid stack name: #{stack_name}"
48
- puts "Full error message: #{e.message}"
49
- exit 1
50
- else
51
- raise # re-raise exception because unsure what other errors can happen
52
- end
53
- end
54
- exist
39
+ def sts
40
+ Aws::STS::Client.new
55
41
  end
42
+ memoize :sts
56
43
 
57
- # All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
58
- #
59
- # Returns resp so we can use it to grab data about the stack without calling api again.
60
- def stack_in_progress?(stack_name)
61
- return true if !stack_exists?(stack_name)
62
-
63
- # Assumes stack exists
64
- resp = cfn.describe_stacks(stack_name: stack_name)
65
- status = resp.stacks[0].stack_status
66
- if status =~ /_IN_PROGRESS$/
67
- puts "The '#{stack_name}' stack status is #{status}. " \
68
- "Please wait until the stack is ready and try again.".colorize(:red)
69
- exit 0
70
- elsif resp.stacks[0].outputs.empty? && status != 'ROLLBACK_COMPLETE'
71
- # This Happens when the miminal stack fails at the very beginning.
72
- # There is no s3 bucket at all. User should delete the stack.
73
- puts "The minimal stack failed to create. Please delete the stack first and try again. " \
74
- "You can delete the CloudFormation stack or use the `jets delete` command"
75
- exit 0
76
- else
77
- true
78
- end
44
+ def sns
45
+ Aws::SNS::Client.new
79
46
  end
80
-
47
+ memoize :sns
81
48
  end
@@ -0,0 +1,52 @@
1
+ module Jets::AwsServices
2
+ module StackStatus
3
+ def stack_exists?(stack_name)
4
+ return false if ENV['TEST']
5
+
6
+ exist = nil
7
+ begin
8
+ # When the stack does not exist an exception is raised. Example:
9
+ # Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
10
+ resp = cfn.describe_stacks(stack_name: stack_name)
11
+ exist = true
12
+ rescue Aws::CloudFormation::Errors::ValidationError => e
13
+ if e.message =~ /does not exist/
14
+ exist = false
15
+ elsif e.message.include?("'stackName' failed to satisfy constraint")
16
+ # Example of e.message when describe_stack with invalid stack name
17
+ # "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:/._+]*"
18
+ puts "Invalid stack name: #{stack_name}"
19
+ puts "Full error message: #{e.message}"
20
+ exit 1
21
+ else
22
+ raise # re-raise exception because unsure what other errors can happen
23
+ end
24
+ end
25
+ exist
26
+ end
27
+
28
+ # All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
29
+ #
30
+ # Returns resp so we can use it to grab data about the stack without calling api again.
31
+ def stack_in_progress?(stack_name)
32
+ return true if !stack_exists?(stack_name)
33
+
34
+ # Assumes stack exists
35
+ resp = cfn.describe_stacks(stack_name: stack_name)
36
+ status = resp.stacks[0].stack_status
37
+ if status =~ /_IN_PROGRESS$/
38
+ puts "The '#{stack_name}' stack status is #{status}. " \
39
+ "Please wait until the stack is ready and try again.".colorize(:red)
40
+ exit 0
41
+ elsif resp.stacks[0].outputs.empty? && status != 'ROLLBACK_COMPLETE'
42
+ # This Happens when the miminal stack fails at the very beginning.
43
+ # There is no s3 bucket at all. User should delete the stack.
44
+ puts "The minimal stack failed to create. Please delete the stack first and try again. " \
45
+ "You can delete the CloudFormation stack or use the `jets delete` command"
46
+ exit 0
47
+ else
48
+ true
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,6 +1,7 @@
1
1
  class Jets::Builders
2
- autoload :Deducer, "jets/builders/deducer"
3
- autoload :HandlerGenerator, "jets/builders/handler_generator"
4
2
  autoload :CodeBuilder, "jets/builders/code_builder"
3
+ autoload :Deducer, "jets/builders/deducer"
5
4
  autoload :GemReplacer, "jets/builders/gem_replacer"
5
+ autoload :HandlerGenerator, "jets/builders/handler_generator"
6
+ autoload :SharedDeducer, "jets/builders/shared_deducer"
6
7
  end