jets 0.8.18 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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