jets 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/Gemfile.lock +3 -1
  4. data/jets.gemspec +2 -0
  5. data/lib/jets/application.rb +1 -1
  6. data/lib/jets/cfn.rb +1 -2
  7. data/lib/jets/cfn/builders.rb +19 -0
  8. data/lib/jets/cfn/builders/api_deployment_builder.rb +32 -0
  9. data/lib/jets/cfn/{template_builders → builders}/api_gateway_builder.rb +10 -21
  10. data/lib/jets/cfn/builders/base_child_builder.rb +49 -0
  11. data/lib/jets/cfn/{template_builders → builders}/controller_builder.rb +7 -7
  12. data/lib/jets/cfn/{template_builders → builders}/function_builder.rb +1 -2
  13. data/lib/jets/cfn/builders/interface.rb +128 -0
  14. data/lib/jets/cfn/{template_builders → builders}/job_builder.rb +2 -2
  15. data/lib/jets/cfn/builders/parent_builder.rb +84 -0
  16. data/lib/jets/cfn/{template_builders → builders}/rule_builder.rb +4 -5
  17. data/lib/jets/commands/base.rb +1 -1
  18. data/lib/jets/commands/build.rb +11 -15
  19. data/lib/jets/commands/delete.rb +12 -0
  20. data/lib/jets/commands/templates/skeleton/Gemfile.tt +1 -0
  21. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +1 -1
  22. data/lib/jets/commands/url.rb +10 -12
  23. data/lib/jets/controller/base.rb +2 -2
  24. data/lib/jets/core.rb +1 -1
  25. data/lib/jets/core_ext/kernel.rb +11 -1
  26. data/lib/jets/internal/app/controllers/jets/public_controller.rb +11 -8
  27. data/lib/jets/lambda/dsl.rb +1 -1
  28. data/lib/jets/lambda/task.rb +9 -1
  29. data/lib/jets/naming.rb +2 -2
  30. data/lib/jets/pascalize.rb +9 -1
  31. data/lib/jets/poly_fun/base_executor.rb +2 -2
  32. data/lib/jets/preheat.rb +2 -2
  33. data/lib/jets/rails_overrides/common_methods.rb +1 -1
  34. data/lib/jets/resource.rb +55 -5
  35. data/lib/jets/resource/api_gateway.rb +7 -0
  36. data/lib/jets/resource/{route → api_gateway}/cors.rb +11 -10
  37. data/lib/jets/resource/api_gateway/deployment.rb +75 -0
  38. data/lib/jets/resource/{route.rb → api_gateway/method.rb} +26 -22
  39. data/lib/jets/{cfn/template_mappers/gateway_resource_mapper.rb → resource/api_gateway/resource.rb} +41 -27
  40. data/lib/jets/resource/api_gateway/rest_api.rb +23 -0
  41. data/lib/jets/resource/base.rb +17 -0
  42. data/lib/jets/resource/child_stack.rb +5 -0
  43. data/lib/jets/resource/child_stack/api_deployment.rb +58 -0
  44. data/lib/jets/resource/child_stack/api_gateway.rb +29 -0
  45. data/lib/jets/resource/child_stack/app_class.rb +81 -0
  46. data/lib/jets/resource/function.rb +184 -0
  47. data/lib/jets/resource/iam.rb +8 -0
  48. data/lib/jets/resource/iam/application_role.rb +27 -0
  49. data/lib/jets/resource/iam/base_role_definition.rb +44 -0
  50. data/lib/jets/resource/iam/class_role.rb +25 -0
  51. data/lib/jets/resource/iam/function_role.rb +25 -0
  52. data/lib/jets/{cfn/template_builders/managed_iam_policy/base_policy.rb → resource/iam/managed_policy.rb} +6 -6
  53. data/lib/jets/resource/iam/policy_document.rb +43 -0
  54. data/lib/jets/resource/permission.rb +38 -21
  55. data/lib/jets/resource/replacer.rb +50 -17
  56. data/lib/jets/resource/s3.rb +17 -0
  57. data/lib/jets/route.rb +3 -1
  58. data/lib/jets/rule/dsl.rb +7 -1
  59. data/lib/jets/server/route_matcher.rb +2 -1
  60. data/lib/jets/version.rb +1 -1
  61. metadata +46 -52
  62. data/lib/jets/cfn/template_builders.rb +0 -25
  63. data/lib/jets/cfn/template_builders/api_gateway_deployment_builder.rb +0 -38
  64. data/lib/jets/cfn/template_builders/base_child_builder.rb +0 -72
  65. data/lib/jets/cfn/template_builders/function_properties.rb +0 -6
  66. data/lib/jets/cfn/template_builders/function_properties/base_builder.rb +0 -128
  67. data/lib/jets/cfn/template_builders/function_properties/node_builder.rb +0 -12
  68. data/lib/jets/cfn/template_builders/function_properties/python_builder.rb +0 -12
  69. data/lib/jets/cfn/template_builders/function_properties/ruby_builder.rb +0 -13
  70. data/lib/jets/cfn/template_builders/iam_policy.rb +0 -6
  71. data/lib/jets/cfn/template_builders/iam_policy/application_policy.rb +0 -19
  72. data/lib/jets/cfn/template_builders/iam_policy/base_policy.rb +0 -57
  73. data/lib/jets/cfn/template_builders/iam_policy/class_policy.rb +0 -20
  74. data/lib/jets/cfn/template_builders/iam_policy/function_policy.rb +0 -21
  75. data/lib/jets/cfn/template_builders/interface.rb +0 -97
  76. data/lib/jets/cfn/template_builders/managed_iam_policy.rb +0 -6
  77. data/lib/jets/cfn/template_builders/managed_iam_policy/application_policy.rb +0 -11
  78. data/lib/jets/cfn/template_builders/managed_iam_policy/class_policy.rb +0 -10
  79. data/lib/jets/cfn/template_builders/managed_iam_policy/function_policy.rb +0 -10
  80. data/lib/jets/cfn/template_builders/parent_builder.rb +0 -95
  81. data/lib/jets/cfn/template_builders/templates/minimal-stack.yml +0 -9
  82. data/lib/jets/cfn/template_mappers.rb +0 -22
  83. data/lib/jets/cfn/template_mappers/api_gateway_deployment_mapper.rb +0 -48
  84. data/lib/jets/cfn/template_mappers/api_gateway_mapper.rb +0 -4
  85. data/lib/jets/cfn/template_mappers/child_mapper.rb +0 -41
  86. data/lib/jets/cfn/template_mappers/controller_mapper.rb +0 -36
  87. data/lib/jets/cfn/template_mappers/function_mapper.rb +0 -4
  88. data/lib/jets/cfn/template_mappers/iam_policy.rb +0 -6
  89. data/lib/jets/cfn/template_mappers/iam_policy/application_policy_mapper.rb +0 -37
  90. data/lib/jets/cfn/template_mappers/iam_policy/base_policy_mapper.rb +0 -49
  91. data/lib/jets/cfn/template_mappers/iam_policy/class_policy_mapper.rb +0 -42
  92. data/lib/jets/cfn/template_mappers/iam_policy/function_policy_mapper.rb +0 -42
  93. data/lib/jets/cfn/template_mappers/job_mapper.rb +0 -4
  94. data/lib/jets/cfn/template_mappers/lambda_function_mapper.rb +0 -52
  95. data/lib/jets/cfn/template_mappers/rule_mapper.rb +0 -5
  96. data/lib/jets/resource/attributes.rb +0 -46
  97. data/lib/jets/resource/creator.rb +0 -17
  98. data/lib/jets/resource/replacer/base.rb +0 -98
  99. data/lib/jets/resource/replacer/config_rule.rb +0 -18
  100. data/lib/jets/resource/route/attributes.rb +0 -8
@@ -1,9 +1,9 @@
1
- class Jets::Cfn::TemplateBuilders
1
+ class Jets::Cfn::Builders
2
2
  class RuleBuilder < BaseChildBuilder
3
3
  def compose
4
4
  add_common_parameters
5
5
  add_functions
6
- add_associated_resources
6
+ add_resources
7
7
  add_managed_rules
8
8
  end
9
9
 
@@ -11,10 +11,9 @@ class Jets::Cfn::TemplateBuilders
11
11
  # List of AWS Config Managed Rules: https://amzn.to/2BOt9KN
12
12
  def add_managed_rules
13
13
  @app_klass.managed_rules.each do |rule|
14
- creator = Jets::Resource::Creator.new(rule[:definition], rule[:task])
15
- add_associated_resource(creator.resource)
14
+ resource = Jets::Resource.new(rule[:definition], rule[:replacements])
15
+ add_resource(resource)
16
16
  end
17
17
  end
18
18
  end
19
19
  end
20
-
@@ -64,7 +64,7 @@ class Jets::Commands::Base < Thor
64
64
  class_name.sub!(/Task$/, "Tasks") # special rule here for Tasks class
65
65
  # NOTE: Weird thing where Jets::Commands::Db::Task => Thor::Command
66
66
  # because Task is a class available to Thor I believe.
67
- puts "eager_load! loading path: #{path} class_name: #{class_name}" if ENV['JETS_DEBUG']
67
+ # puts "eager_load! loading path: #{path} class_name: #{class_name}" if ENV['JETS_DEBUG']
68
68
  class_name.constantize # dont have to worry about order.
69
69
  end
70
70
  end
@@ -41,8 +41,7 @@ module Jets::Commands
41
41
 
42
42
  def build_all_templates
43
43
  clean_templates
44
- # TODO: Maybe move this tbuild.rb template related logic to cfn/builder.rb
45
- ## CloudFormation templates
44
+ # CloudFormation templates
46
45
  puts "Building Lambda functions as CloudFormation templates."
47
46
  # 1. Shared templates - child templates needs them
48
47
  build_api_gateway_templates
@@ -53,15 +52,12 @@ module Jets::Commands
53
52
  end
54
53
 
55
54
  def build_minimal_template
56
- parent = Jets::Cfn::TemplateBuilders::ParentBuilder.new(@options)
57
- parent.build
55
+ Jets::Cfn::Builders::ParentBuilder.new(@options).build
58
56
  end
59
57
 
60
58
  def build_api_gateway_templates
61
- gateway = Jets::Cfn::TemplateBuilders::ApiGatewayBuilder.new(@options)
62
- gateway.build
63
- deployment = Jets::Cfn::TemplateBuilders::ApiGatewayDeploymentBuilder.new(@options)
64
- deployment.build
59
+ Jets::Cfn::Builders::ApiGatewayBuilder.new(@options).build
60
+ Jets::Cfn::Builders::ApiDeploymentBuilder.new(@options).build
65
61
  end
66
62
 
67
63
  def build_child_templates
@@ -79,21 +75,21 @@ module Jets::Commands
79
75
 
80
76
  md = path.match(%r{app/(.*?)/}) # extract: controller, job or function
81
77
  process_class = md[1].classify
82
- builder_class = "Jets::Cfn::TemplateBuilders::#{process_class}Builder".constantize
78
+ builder_class = "Jets::Cfn::Builders::#{process_class}Builder".constantize
83
79
 
84
80
  # Examples:
85
- # Jets::Cfn::TemplateBuilders::JobBuilder.new(EasyJob)
86
- # Jets::Cfn::TemplateBuilders::ControllerBuilder.new(PostsController)
87
- # Jets::Cfn::TemplateBuilders::FunctionBuilder.new(Hello)
88
- # Jets::Cfn::TemplateBuilders::FunctionBuilder.new(HelloFunction)
81
+ # Jets::Cfn::Builders::ControllerBuilder.new(PostsController)
82
+ # Jets::Cfn::Builders::JobBuilder.new(EasyJob)
83
+ # Jets::Cfn::Builders::RuleBuilder.new(CheckRule)
84
+ # Jets::Cfn::Builders::FunctionBuilder.new(Hello)
85
+ # Jets::Cfn::Builders::FunctionBuilder.new(HelloFunction)
89
86
  app_klass = Jets::Klass.from_path(path)
90
87
  builder = builder_class.new(app_klass)
91
88
  builder.build
92
89
  end
93
90
 
94
91
  def build_parent_template
95
- parent = Jets::Cfn::TemplateBuilders::ParentBuilder.new(@options)
96
- parent.build
92
+ Jets::Cfn::Builders::ParentBuilder.new(@options).build
97
93
  end
98
94
 
99
95
  def clean_templates
@@ -74,6 +74,7 @@ class Jets::Commands::Delete
74
74
 
75
75
  def s3_bucket_name
76
76
  return @s3_bucket_name if defined?(@s3_bucket_name)
77
+ return unless bucket_exists?
77
78
 
78
79
  resp = cfn.describe_stacks(stack_name: parent_stack_name)
79
80
  outputs = resp.stacks[0].outputs
@@ -84,6 +85,17 @@ class Jets::Commands::Delete
84
85
  end
85
86
  end
86
87
 
88
+ # Thanks: https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/s3-example-does-bucket-exist.html
89
+ def bucket_exists?
90
+ bucket_exists = false
91
+ begin
92
+ resp = s3.head_bucket(bucket: @s3_bucket_name, use_accelerate_endpoint: false)
93
+ bucket_exists = true
94
+ rescue
95
+ end
96
+ bucket_exists
97
+ end
98
+
87
99
  def parent_stack_name
88
100
  Jets::Naming.parent_stack_name
89
101
  end
@@ -12,6 +12,7 @@ gem "webpacker", git: "https://github.com/tongueroo/webpacker.git", branch: "jet
12
12
  <% end -%>
13
13
  # Include pg gem if you are using ActiveRecord
14
14
  gem "pg", "~> 0.21"
15
+ gem "mimemagic"
15
16
 
16
17
  group :development, :test do
17
18
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
@@ -9,7 +9,7 @@ Jets.application.configure do
9
9
  config.cors = true # for '*''
10
10
  # config.cors = '*.mydomain.com' # for specific domain
11
11
 
12
- config.function.timeout = 10
12
+ config.function.timeout = 20
13
13
  # config.function.role = "arn:aws:iam::#{Jets.aws.account}:role/service-role/pre-created"
14
14
  # config.function.memory_size= 1536
15
15
 
@@ -8,18 +8,18 @@ module Jets::Commands
8
8
 
9
9
  def display
10
10
  stack_name = Jets::Naming.parent_stack_name
11
- stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
12
-
13
- unless stack
14
- puts "Stack for '#{Jets.config.project_name} project for environment #{Jets.env}. Couldn't find '#{stack_name}' stack."
11
+ unless stack_exists?(stack_name)
12
+ puts "Stack for #{Jets.config.project_name.colorize(:green)} project for environment #{Jets.env.colorize(:green)}. Couldn't find #{stack_name.colorize(:green)} stack."
15
13
  exit
16
14
  end
17
15
 
16
+ stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
17
+
18
18
  api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
19
19
  if api_gateway_stack_arn
20
20
  STDOUT.puts get_url(api_gateway_stack_arn)
21
21
  else
22
- puts "API Gateway not found. This jets app does have an API Gateway associated with it. Please double check your config/routes.rb if you were expecting to see a url for the app."
22
+ puts "API Gateway not found. This jets app does have an API Gateway associated with it. Please double check your config/routes.rb if you were expecting to see a url for the app. Also check that #{stack_name.colorize(:green)} is a jets app."
23
23
  end
24
24
  end
25
25
 
@@ -27,19 +27,17 @@ module Jets::Commands
27
27
  stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
28
28
  rest_api = lookup(stack[:outputs], "RestApi")
29
29
  region_id = lookup(stack[:outputs], "Region")
30
- # Abusing ApiGatewayDeploymentMapper
31
- # set path=nil,s3_bucket=nil
32
- # not using any methods that rely on the initialization parameters
33
- map = Jets::Cfn::TemplateMappers::ApiGatewayDeploymentMapper.new(path=nil,s3_bucket=nil)
30
+ stage_name = Jets::Resource::ApiGateway::Deployment.stage_name
31
+
34
32
  # https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-call-api.html
35
33
  # https://my-api-id.execute-api.region-id.amazonaws.com/stage-name/{resourcePath}
36
- "https://#{rest_api}.execute-api.#{region_id}.amazonaws.com/#{map.stage_name}"
34
+ "https://#{rest_api}.execute-api.#{region_id}.amazonaws.com/#{stage_name}"
37
35
  end
38
36
 
39
37
  # Lookup output value
40
38
  def lookup(outputs, key)
41
- o = outputs.find { |o| o.output_key == key }
42
- o.output_value
39
+ out = outputs.find { |o| o.output_key == key }
40
+ out&.output_value
43
41
  end
44
42
  end
45
43
  end
@@ -25,8 +25,8 @@ class Jets::Controller
25
25
  resp = controller.ensure_render
26
26
  controller.run_after_actions
27
27
 
28
- time = Time.now - t1
29
- Jets.logger.info "Completed Status Code #{resp["statusCode"]} in #{time}s"
28
+ took = Time.now - t1
29
+ Jets.logger.info "Completed Status Code #{resp["statusCode"]} in #{took}s"
30
30
 
31
31
  resp
32
32
  end
data/lib/jets/core.rb CHANGED
@@ -135,7 +135,7 @@ module Jets::Core
135
135
  .sub(/^\.\//,'') # remove ./
136
136
  .sub(/app\/\w+\//,'') # remove app/controllers or app/jobs etc
137
137
  .classify
138
- puts "eager_load! loading path: #{path} class_name: #{class_name}" if ENV['JETS_DEBUG']
138
+ # puts "eager_load! loading path: #{path} class_name: #{class_name}" if ENV['JETS_DEBUG']
139
139
  class_name.constantize # use constantize instead of require so dont have to worry about order.
140
140
  end
141
141
  end
@@ -16,8 +16,18 @@ module Kernel
16
16
  @@io_buffer
17
17
  end
18
18
 
19
+ # Note: Writing binary data to the log will crash the process with an error like this:
20
+ # jets/lib/jets/core_ext/kernel.rb:20:in `write': "\x89" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
21
+ # Rescue and discard it to keep the process alive.
19
22
  def io_flush
20
- IO.write("/tmp/jets-output.log", @@io_buffer.join("\n"))
23
+ chunk = @@io_buffer.join("\n")
24
+ begin
25
+ IO.write("/tmp/jets-output.log", chunk)
26
+ # Writing to log with binary content will crash the process so rescuing it and writing an info message.
27
+ rescue Encoding::UndefinedConversionError => e
28
+ error_message = "Encoding::UndefinedConversionError: Binary data was written to Jets::IO buffer. Writing binary data to the log will crash the process, so discarding it. This is an info message only. If you want to return binary data please base64 encode the data."
29
+ IO.write("/tmp/jets-output.log", error_message)
30
+ end
21
31
  @@io_buffer = []
22
32
  end
23
33
  end
@@ -1,26 +1,29 @@
1
1
  require "rack/mime"
2
+ require "mimemagic"
2
3
 
3
- # Works for utf8 text files.
4
- # TODO: Add support to public_controller for binary data like images.
5
- # Tricky because API Gateway is not respecting the Accept header the same way as browsers.
6
4
  class Jets::PublicController < Jets::Controller::Base
7
5
  layout false
8
6
  internal true
9
7
 
10
- # # Use python until ruby support is added.
11
- # python :show
12
-
13
8
  if Jets::Commands::Build.poly_only?
14
9
  # Use python if poly only so we don't have to upload rubuy
15
10
  python :show
16
11
  else
17
- # TODO: When ruby support is relesed, switch to it only.
18
12
  def show
19
13
  public_path = Jets.root + "public"
20
14
  catchall_path = "#{public_path}/#{params[:catchall]}"
21
15
  if File.exist?(catchall_path)
22
16
  content_type = Rack::Mime.mime_type(File.extname(catchall_path))
23
- render file: catchall_path, content_type: content_type
17
+ binary = !MimeMagic.by_path(catchall_path).text?
18
+ puts "content_type #{content_type.inspect}"
19
+ puts "binary #{binary}"
20
+
21
+ if binary
22
+ encoded_content = Base64.encode64(IO.read(catchall_path))
23
+ render plain: encoded_content, content_type: content_type, base64: true
24
+ else
25
+ render file: catchall_path, content_type: content_type
26
+ end
24
27
  else
25
28
  render file: "#{public_path}/404", status: 404
26
29
  end
@@ -218,7 +218,7 @@ module Jets::Lambda::Dsl
218
218
  all_tasks.values
219
219
  end
220
220
 
221
- # Used in Jets::Cfn::TemplateBuilders::Interface#build
221
+ # Used in Jets::Cfn::Builders::Interface#build
222
222
  # Overridden in rule/dsl.rb
223
223
  def build?
224
224
  !tasks.empty?
@@ -2,7 +2,7 @@ class Jets::Lambda::Task
2
2
  attr_accessor :class_name, :type
3
3
  attr_reader :meth, :resources, :properties, :iam_policy, :managed_iam_policy, :lang
4
4
  def initialize(class_name, meth, options={})
5
- @class_name = class_name.to_s # use at EventsRuleMapper#full_task_name
5
+ @class_name = class_name.to_s
6
6
  @meth = meth
7
7
  @options = options
8
8
  @type = options[:type] || get_type # controller, job, or function
@@ -81,4 +81,12 @@ class Jets::Lambda::Task
81
81
  def poly_src_path
82
82
  handler_path.sub("handlers/", "app/")
83
83
  end
84
+
85
+ ###
86
+ # Useful for Jets::Resource late building.
87
+ def replacements
88
+ {
89
+ namespace: "#{@class_name.gsub('::','')}#{@meth.to_s.camelize}", # camelized because used in not just keys but also values
90
+ }
91
+ end
84
92
  end
data/lib/jets/naming.rb CHANGED
@@ -23,8 +23,8 @@ class Jets::Naming
23
23
  "#{template_path_prefix}-api-gateway.yml"
24
24
  end
25
25
 
26
- def api_gateway_deployment_template_path
27
- "#{template_path_prefix}-api-gateway-deployment.yml"
26
+ def api_deployment_template_path
27
+ "#{template_path_prefix}-api-deployment.yml"
28
28
  end
29
29
 
30
30
  def parent_stack_name
@@ -43,7 +43,15 @@ module Jets
43
43
 
44
44
  def pascalize_string(s)
45
45
  s = s.to_s.camelize
46
- s.slice(0,1).capitalize + s.slice(1..-1) # capitalize first letter only
46
+ s = s.slice(0,1).capitalize + s.slice(1..-1) # capitalize first letter only
47
+ special_map[s] || s
48
+ end
49
+
50
+ # Some keys have special mappings
51
+ def special_map
52
+ {
53
+ "TemplateUrl" => "TemplateURL"
54
+ }
47
55
  end
48
56
  end
49
57
  end
@@ -118,8 +118,8 @@ class Jets::PolyFun
118
118
  # the mutiple sources of how the handler can get set.
119
119
  # puts "handler path #{@task.handler_path}"
120
120
  #
121
- # IE: Jets::Cfn::TemplateBuilders::FunctionProperties::PythonBuilder
122
- builder_class = "Jets::Cfn::TemplateBuilders::FunctionProperties::#{@task.lang.to_s.classify}Builder".constantize
121
+ # IE: Jets::Cfn::Builders::FunctionProperties::PythonBuilder
122
+ builder_class = "Jets::Cfn::Builders::FunctionProperties::#{@task.lang.to_s.classify}Builder".constantize
123
123
  builder = builder_class.new(@task)
124
124
  full_handler = builder.properties["Handler"] # full handler here
125
125
  File.extname(full_handler).sub(/^./,'') # the extension of the full handler is the handler
data/lib/jets/preheat.rb CHANGED
@@ -20,12 +20,12 @@ module Jets
20
20
  @options[:mute_output] = true if @options[:mute_output].nil?
21
21
  end
22
22
 
23
+ # Makes remote call to the Lambda function.
23
24
  def warm(function_name)
24
25
  Jets::Commands::Call.new(function_name, '{"_prewarm": "1"}', @options).run unless ENV['TEST']
25
26
  end
26
27
 
27
- # loop through all methods fo each class
28
- # make the special prewarm call to keep them warm
28
+ # Loop through all methods for each class and makes special prewarm call to each method.
29
29
  def warm_all
30
30
  threads = []
31
31
  all_functions.each do |function_name|
@@ -4,7 +4,7 @@ module Jets::CommonMethods
4
4
  if request.host.include?("amazonaws.com") &&
5
5
  url.starts_with?('/') &&
6
6
  !url.starts_with?('http')
7
- stage_name = Jets::Cfn::TemplateMappers::ApiGatewayDeploymentMapper.stage_name
7
+ stage_name = Jets::Resource::ApiGateway::Deployment.stage_name
8
8
  url = "/#{stage_name}#{url}"
9
9
  end
10
10
 
data/lib/jets/resource.rb CHANGED
@@ -1,7 +1,57 @@
1
- module Jets::Resource
2
- autoload :Attributes, 'jets/resource/attributes'
3
- autoload :Creator, 'jets/resource/creator'
4
- autoload :Permission, 'jets/resource/permission'
1
+ class Jets::Resource
2
+ extend Memoist
3
+
4
+ autoload :Base, 'jets/resource/base'
5
5
  autoload :Replacer, 'jets/resource/replacer'
6
- autoload :Route, 'jets/resource/route'
6
+ autoload :Permission, 'jets/resource/permission'
7
+ autoload :ApiGateway, 'jets/resource/api_gateway'
8
+ autoload :ChildStack, 'jets/resource/child_stack'
9
+ autoload :Function, 'jets/resource/function'
10
+ autoload :Iam, 'jets/resource/iam'
11
+ autoload :S3, 'jets/resource/s3'
12
+
13
+ attr_reader :definition, :replacements
14
+ def initialize(definition, replacements={})
15
+ @definition = definition
16
+ @replacements = replacements
17
+ end
18
+
19
+ def logical_id
20
+ id = definition.keys.first
21
+ # replace possible {namespace} in the logical id
22
+ id = replacer.replace_value(id)
23
+ Jets::Pascalize.pascalize_string(id)
24
+ end
25
+
26
+ def type
27
+ attributes['Type']
28
+ end
29
+
30
+ def properties
31
+ attributes['Properties']
32
+ end
33
+
34
+ def attributes
35
+ attributes = definition.values.first
36
+ attributes = replacer.replace_placeholders(attributes)
37
+ Jets::Pascalize.pascalize(attributes)
38
+ end
39
+
40
+ def parameters
41
+ {}
42
+ end
43
+
44
+ def outputs
45
+ {}
46
+ end
47
+
48
+ def replacer
49
+ Replacer.new(replacements)
50
+ end
51
+ memoize :replacer
52
+
53
+ def permission
54
+ Permission.new(replacements, self)
55
+ end
56
+ memoize :permission
7
57
  end
@@ -0,0 +1,7 @@
1
+ module Jets::Resource::ApiGateway
2
+ autoload :Resource, 'jets/resource/api_gateway/resource'
3
+ autoload :RestApi, 'jets/resource/api_gateway/rest_api'
4
+ autoload :Deployment, 'jets/resource/api_gateway/deployment'
5
+ autoload :Method, 'jets/resource/api_gateway/method'
6
+ autoload :Cors, 'jets/resource/api_gateway/cors'
7
+ end
@@ -1,8 +1,10 @@
1
- class Jets::Resource::Route
2
- class Cors < Jets::Resource::Route
3
- def attributes
4
- attributes = {
5
- "#{resource_logical_id}CorsApiMethod" => {
1
+ module Jets::Resource::ApiGateway
2
+ # Might be weird inheriting from Method because Method has Method#cors also
3
+ # but Cors is essentially a Method class.
4
+ class Cors < Method
5
+ def definition
6
+ {
7
+ cors_logical_id => {
6
8
  type: "AWS::ApiGateway::Method",
7
9
 
8
10
  properties: {
@@ -41,12 +43,11 @@ class Jets::Resource::Route
41
43
  } # closes integration
42
44
  } # closes properties
43
45
  } # closes logical id
44
- } # closes attributes
46
+ } # closes definition
47
+ end
45
48
 
46
- definitions = attributes # to emphasize that its the same thing
47
- task = Jets::Lambda::Task.new(@route.controller_name, @route.action_name,
48
- resources: definitions)
49
- Attributes.new(attributes, task)
49
+ def cors_logical_id
50
+ "#{resource_logical_id}_cors_api_method"
50
51
  end
51
52
 
52
53
  def allow_origin