jets 2.3.19 → 3.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.
- checksums.yaml +4 -4
- data/.gitmodules +0 -3
- data/.python-version +1 -1
- data/.ruby-version +1 -1
- data/CHANGELOG.md +28 -2
- data/README.md +2 -2
- data/backers.md +1 -0
- data/jets.gemspec +11 -10
- data/lib/jets.rb +9 -13
- data/lib/jets/application.rb +9 -2
- data/lib/jets/application/defaults.rb +17 -15
- data/lib/jets/autoloaders.rb +15 -1
- data/lib/jets/booter.rb +3 -3
- data/lib/jets/builders/code_builder.rb +16 -15
- data/lib/jets/builders/gem_replacer.rb +3 -16
- data/lib/jets/builders/lambda_layer.rb +4 -5
- data/lib/jets/builders/ruby_packager.rb +18 -42
- data/lib/jets/builders/tidy.rb +1 -2
- data/lib/jets/bundle.rb +6 -0
- data/lib/jets/cfn/builders/api_gateway_builder.rb +61 -7
- data/lib/jets/cfn/ship.rb +2 -1
- data/lib/jets/cli.rb +6 -1
- data/lib/jets/commands/base.rb +1 -1
- data/lib/jets/commands/call.rb +14 -1
- data/lib/jets/commands/clean.rb +1 -1
- data/lib/jets/commands/clean/base.rb +1 -1
- data/lib/jets/commands/configure.rb +51 -0
- data/lib/jets/commands/delete.rb +2 -2
- data/lib/jets/commands/gems.rb +2 -10
- data/lib/jets/commands/help/call.md +8 -0
- data/lib/jets/commands/help/gems/check.md +3 -5
- data/lib/jets/commands/main.rb +9 -1
- data/lib/jets/commands/new.rb +9 -1
- data/lib/jets/commands/sequence.rb +6 -0
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +1 -1
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +1 -1
- data/lib/jets/commands/templates/skeleton/public/index.html.tt +1 -1
- data/lib/jets/commands/url.rb +1 -0
- data/lib/jets/controller/base.rb +14 -4
- data/lib/jets/controller/middleware/main.rb +2 -1
- data/lib/jets/controller/params.rb +26 -4
- data/lib/jets/controller/rack/env.rb +18 -1
- data/lib/jets/controller/rendering.rb +5 -2
- data/lib/jets/controller/rendering/rack_renderer.rb +7 -1
- data/lib/jets/core.rb +12 -4
- data/lib/jets/dotenv/ssm.rb +18 -4
- data/lib/jets/generator.rb +2 -3
- data/lib/jets/internal/app/functions/jets/base_path.rb +10 -149
- data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +81 -0
- data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +14 -24
- data/lib/jets/resource/api_gateway/base_path/function.rb +6 -1
- data/lib/jets/resource/api_gateway/deployment.rb +2 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +34 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +49 -0
- data/lib/jets/resource/child_stack/api_deployment.rb +2 -0
- data/lib/jets/resource/lambda/function.rb +1 -1
- data/lib/jets/router/dsl.rb +7 -1
- data/lib/jets/router/method_creator/code.rb +1 -1
- data/lib/jets/router/scope.rb +7 -3
- data/lib/jets/spec_helpers/controllers.rb +10 -3
- data/lib/jets/spec_helpers/controllers/request.rb +12 -5
- data/lib/jets/stack/main/dsl/lambda.rb +1 -1
- data/lib/jets/turbo.rb +1 -0
- data/lib/jets/version.rb +1 -1
- metadata +51 -58
- data/vendor/cfn-status/CHANGELOG.md +0 -14
- data/vendor/cfn-status/Gemfile +0 -4
- data/vendor/cfn-status/LICENSE.txt +0 -21
- data/vendor/cfn-status/README.md +0 -56
- data/vendor/cfn-status/Rakefile +0 -6
- data/vendor/cfn-status/bin/console +0 -14
- data/vendor/cfn-status/bin/setup +0 -8
- data/vendor/cfn-status/cfn-status.gemspec +0 -30
- data/vendor/cfn-status/lib/cfn-status.rb +0 -1
- data/vendor/cfn-status/lib/cfn_status.rb +0 -245
- data/vendor/cfn-status/lib/cfn_status/aws_service.rb +0 -51
- data/vendor/cfn-status/lib/cfn_status/version.rb +0 -3
- data/vendor/cfn-status/spec/fixtures/cfn/pages/fresh/describe_stack_events-1.json +0 -1103
- data/vendor/cfn-status/spec/fixtures/cfn/pages/fresh/describe_stack_events-2.json +0 -1104
- data/vendor/cfn-status/spec/fixtures/cfn/pages/fresh/describe_stack_events-3.json +0 -1103
- data/vendor/cfn-status/spec/fixtures/cfn/pages/updating/describe_stack_events-1.json +0 -1103
- data/vendor/cfn-status/spec/fixtures/cfn/pages/updating/describe_stack_events-2.json +0 -1104
- data/vendor/cfn-status/spec/fixtures/cfn/pages/updating/describe_stack_events-3.json +0 -1103
- data/vendor/cfn-status/spec/fixtures/cfn/stack-events-complete.json +0 -1080
- data/vendor/cfn-status/spec/fixtures/cfn/stack-events-in-progress.json +0 -1080
- data/vendor/cfn-status/spec/fixtures/cfn/stack-events-update-rollback-complete.json +0 -1086
- data/vendor/cfn-status/spec/lib/cfn_status_spec.rb +0 -153
- data/vendor/cfn-status/spec/spec_helper.rb +0 -14
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
require 'aws-sdk-apigateway'
|
|
2
|
+
require 'aws-sdk-cloudformation'
|
|
3
|
+
|
|
4
|
+
class BasePathMapping
|
|
5
|
+
def initialize(event, stage_name)
|
|
6
|
+
@event, @stage_name = event, stage_name
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Cannot use update_base_path_mapping to update the base_mapping because it doesnt
|
|
10
|
+
# allow us to change the rest_api_id. So we delete and create.
|
|
11
|
+
def update
|
|
12
|
+
delete(true)
|
|
13
|
+
create
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Dont delete the newly created base path mapping unless this is an operation
|
|
17
|
+
# where we're fully deleting the stack
|
|
18
|
+
def should_delete?
|
|
19
|
+
deleting_parent?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def delete(fail_silently=false)
|
|
23
|
+
apigateway.delete_base_path_mapping(
|
|
24
|
+
domain_name: domain_name, # required
|
|
25
|
+
base_path: base_path.empty? ? '(none)' : base_path,
|
|
26
|
+
)
|
|
27
|
+
# https://github.com/tongueroo/jets/issues/255
|
|
28
|
+
# Used to return: Aws::APIGateway::Errors::NotFoundException
|
|
29
|
+
# Now returns: Aws::APIGateway::Errors::InternalFailure
|
|
30
|
+
# So we'll use a more generic error
|
|
31
|
+
rescue Aws::APIGateway::Errors::ServiceError => e
|
|
32
|
+
raise(e) unless fail_silently
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def create
|
|
36
|
+
apigateway.create_base_path_mapping(
|
|
37
|
+
domain_name: domain_name, # required
|
|
38
|
+
base_path: base_path,
|
|
39
|
+
rest_api_id: rest_api_id, # required
|
|
40
|
+
stage: @stage_name,
|
|
41
|
+
)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def deployment_stack
|
|
45
|
+
@deployment_stack ||= cfn.describe_stacks(stack_name: @event['StackId']).stacks.first
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def rest_api_id
|
|
49
|
+
@rest_api_id ||= parameter_value('RestApi')
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def domain_name
|
|
53
|
+
@domain_name ||= parameter_value('DomainName')
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def base_path
|
|
57
|
+
@base_path ||= parameter_value('BasePath') || ''
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def parameter_value(parameter_key)
|
|
61
|
+
param = deployment_stack[:parameters].find { |p| p.parameter_key == parameter_key }
|
|
62
|
+
param&.parameter_value # possible for this to be nil when removing the config: IE: config.domain.name = nil
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def deleting_parent?
|
|
66
|
+
stack = cfn.describe_stacks(stack_name: parent_stack_name).stacks.first
|
|
67
|
+
stack.stack_status == 'DELETE_IN_PROGRESS'
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def parent_stack_name
|
|
71
|
+
deployment_stack[:root_id]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def apigateway
|
|
75
|
+
@apigateway ||= Aws::APIGateway::Client.new
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def cfn
|
|
79
|
+
@cfn ||= Aws::CloudFormation::Client.new
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -1,33 +1,23 @@
|
|
|
1
|
-
require
|
|
2
|
-
require
|
|
3
|
-
require
|
|
4
|
-
include Cfnresponse
|
|
1
|
+
require 'bundler/setup'
|
|
2
|
+
require 'active_support/core_ext/hash'
|
|
3
|
+
require 'cfn_response'
|
|
5
4
|
|
|
6
5
|
def lambda_handler(event:, context:)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
6
|
+
cfn = CfnResponse.new(event, context)
|
|
7
|
+
cfn.response do
|
|
8
|
+
case event['RequestType']
|
|
9
|
+
when "Create", "Update"
|
|
10
|
+
properties = event["ResourceProperties"].dup
|
|
11
|
+
# After deleting ServiceToken, the rest of the values are the bucket configuration properties.
|
|
12
|
+
properties.delete("ServiceToken")
|
|
13
|
+
configurator = BucketConfigurator.new
|
|
14
|
+
configurator.put(properties)
|
|
15
|
+
end
|
|
17
16
|
end
|
|
18
|
-
|
|
19
|
-
send_response(event, context, "SUCCESS")
|
|
20
|
-
|
|
21
|
-
# We rescue all exceptions and send an message to CloudFormation so we dont have to
|
|
22
|
-
# wait for over an hour for the stack operation to timeout and rollback.
|
|
23
|
-
rescue Exception => e
|
|
24
|
-
puts e.message
|
|
25
|
-
puts e.backtrace
|
|
26
|
-
sleep 10 # a little time for logs to be sent to CloudWatch
|
|
27
|
-
send_response(event, context, "FAILED")
|
|
28
17
|
end
|
|
29
18
|
|
|
30
19
|
########################################################
|
|
20
|
+
require "aws-sdk-s3"
|
|
31
21
|
|
|
32
22
|
class BucketConfigurator
|
|
33
23
|
def put(props={})
|
|
@@ -14,15 +14,20 @@ module Jets::Resource::ApiGateway::BasePath
|
|
|
14
14
|
},
|
|
15
15
|
role: "!GetAtt BasePathRole.Arn",
|
|
16
16
|
handler: handler,
|
|
17
|
-
runtime:
|
|
17
|
+
runtime: Jets.ruby_runtime,
|
|
18
18
|
timeout: 60,
|
|
19
19
|
memory_size: 1536,
|
|
20
20
|
environment: env_properties[:environment],
|
|
21
|
+
layers: layers,
|
|
21
22
|
}
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
25
|
end
|
|
25
26
|
|
|
27
|
+
def layers
|
|
28
|
+
["!Ref GemLayer"]
|
|
29
|
+
end
|
|
30
|
+
|
|
26
31
|
def function_name
|
|
27
32
|
method = "jets-base-path"
|
|
28
33
|
# need to add the deployment timestamp because or else function name collides between deploys
|
|
@@ -15,11 +15,13 @@ module Jets::Resource::ApiGateway
|
|
|
15
15
|
|
|
16
16
|
def parameters
|
|
17
17
|
p = {
|
|
18
|
+
"GemLayer" => "GemLayer",
|
|
18
19
|
"IamRole" => "IamRole",
|
|
19
20
|
"RestApi" => "RestApi",
|
|
20
21
|
"S3Bucket" => "S3Bucket",
|
|
21
22
|
}
|
|
22
23
|
p[:DomainName] = "DomainName" if Jets.custom_domain?
|
|
24
|
+
p[:BasePath] = "BasePath" unless Jets.config.domain.base_path.nil?
|
|
23
25
|
p
|
|
24
26
|
end
|
|
25
27
|
|
|
@@ -8,12 +8,46 @@ class Jets::Resource::ApiGateway::RestApi
|
|
|
8
8
|
return default unless stack_exists?(parent_stack_name) && api_gateway_exists?
|
|
9
9
|
|
|
10
10
|
if changed?
|
|
11
|
+
auto_replace_prompt
|
|
11
12
|
new_id
|
|
12
13
|
else
|
|
13
14
|
current
|
|
14
15
|
end
|
|
15
16
|
end
|
|
16
17
|
|
|
18
|
+
def auto_replace_prompt
|
|
19
|
+
return if ENV['JETS_API_AUTO_REPLACE']
|
|
20
|
+
return unless ARGV[0] == "deploy"
|
|
21
|
+
case Jets.config.api.auto_replace
|
|
22
|
+
when nil
|
|
23
|
+
puts message.routes_changed
|
|
24
|
+
puts message.custom_domain
|
|
25
|
+
print "Would you like to continue the deployment? (y/N) "
|
|
26
|
+
answer = get_answer
|
|
27
|
+
exit 1 unless answer =~ /^y/
|
|
28
|
+
when false
|
|
29
|
+
puts message.routes_changed
|
|
30
|
+
puts message.auto_replace_disabled
|
|
31
|
+
exit 1
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def message
|
|
36
|
+
Message.new
|
|
37
|
+
end
|
|
38
|
+
memoize :message
|
|
39
|
+
|
|
40
|
+
TIMEOUT_PERIOD = 120
|
|
41
|
+
def get_answer
|
|
42
|
+
Timeout::timeout(TIMEOUT_PERIOD) do
|
|
43
|
+
$stdin.gets
|
|
44
|
+
end
|
|
45
|
+
rescue Timeout::Error => e
|
|
46
|
+
puts "#{e.class}: #{e.message}".color(:red)
|
|
47
|
+
puts "Deployment timeout after #{TIMEOUT_PERIOD}s. Waited too long answer. Exiting."
|
|
48
|
+
exit 1
|
|
49
|
+
end
|
|
50
|
+
|
|
17
51
|
def changed?
|
|
18
52
|
change_detection = ChangeDetection.new
|
|
19
53
|
change_detection.changed?
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
class Jets::Resource::ApiGateway::RestApi::LogicalId
|
|
2
|
+
class Message
|
|
3
|
+
def routes_changed
|
|
4
|
+
<<~EOL
|
|
5
|
+
Routes Change Detection: Jets has detected that a new brand API Gateway is required to be deployed.
|
|
6
|
+
IMPORTANT: This will result in the API Gateway endpoint changing.
|
|
7
|
+
EOL
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def custom_domain
|
|
11
|
+
api = Jets::Resource::ApiGateway::DomainName.new
|
|
12
|
+
domain_name = api.domain_name
|
|
13
|
+
if domain_name
|
|
14
|
+
<<~EOL
|
|
15
|
+
It looks like you have already set up a custom domain.
|
|
16
|
+
The domain name: #{domain_name}
|
|
17
|
+
|
|
18
|
+
So you should be good to go as the custom domain will be updated with the new API Gateway endpoint.
|
|
19
|
+
To avoid this prompt in the future, you can configure:
|
|
20
|
+
|
|
21
|
+
config/application.rb
|
|
22
|
+
|
|
23
|
+
config.api.auto_replace = true
|
|
24
|
+
|
|
25
|
+
More info: custom domain docs: https://rubyonjets.com/docs/routing/custom-domain/
|
|
26
|
+
EOL
|
|
27
|
+
else
|
|
28
|
+
"Please set up a custom domain https://rubyonjets.com/docs/routing/custom-domain/"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def auto_replace_disabled
|
|
33
|
+
<<~EOL
|
|
34
|
+
It looks like `config.api.auto_replace = false`. IE:
|
|
35
|
+
|
|
36
|
+
config/application.rb
|
|
37
|
+
|
|
38
|
+
config.api.auto_replace = false
|
|
39
|
+
|
|
40
|
+
The deploy will not continue. See:
|
|
41
|
+
|
|
42
|
+
* https://rubyonjets.com/docs/app-config/reference/
|
|
43
|
+
* https://rubyonjets.com/docs/routing/custom-domain/
|
|
44
|
+
|
|
45
|
+
EOL
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
@@ -20,11 +20,13 @@ module Jets::Resource::ChildStack
|
|
|
20
20
|
|
|
21
21
|
def parameters
|
|
22
22
|
p = {
|
|
23
|
+
GemLayer: "!Ref GemLayer",
|
|
23
24
|
IamRole: "!GetAtt IamRole.Arn",
|
|
24
25
|
RestApi: "!GetAtt ApiGateway.Outputs.RestApi",
|
|
25
26
|
S3Bucket: "!Ref S3Bucket",
|
|
26
27
|
}
|
|
27
28
|
p[:DomainName] = "!GetAtt ApiGateway.Outputs.DomainName" if Jets.custom_domain?
|
|
29
|
+
p[:BasePath] = Jets.config.domain.base_path unless Jets.config.domain.base_path.nil?
|
|
28
30
|
p
|
|
29
31
|
end
|
|
30
32
|
|
data/lib/jets/router/dsl.rb
CHANGED
|
@@ -5,7 +5,7 @@ class Jets::Router
|
|
|
5
5
|
# Methods supported by API Gateway
|
|
6
6
|
%w[any delete get head options patch post put].each do |method_name|
|
|
7
7
|
define_method method_name do |path, options={}|
|
|
8
|
-
create_route(options.merge(path: path, method: __method__))
|
|
8
|
+
create_route(options.merge(path: escape_path(path), method: __method__))
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
|
|
@@ -62,6 +62,7 @@ class Jets::Router
|
|
|
62
62
|
{
|
|
63
63
|
as: options.delete(:as) || item, # delete as or it messes with create_route
|
|
64
64
|
prefix: prefix,
|
|
65
|
+
param: options[:param],
|
|
65
66
|
# module: options.delete(:module) || item, # NOTE: resources does not automatically set module, but namespace does
|
|
66
67
|
}
|
|
67
68
|
end
|
|
@@ -134,5 +135,10 @@ class Jets::Router
|
|
|
134
135
|
MethodCreator.new(options, @scope).create_root_helper
|
|
135
136
|
@routes << Route.new(options, @scope)
|
|
136
137
|
end
|
|
138
|
+
private
|
|
139
|
+
|
|
140
|
+
def escape_path(path)
|
|
141
|
+
path.to_s.split('/').map { |s| s =~ /\A[:\*]/ ? s : CGI.escape(s) }.join('/')
|
|
142
|
+
end
|
|
137
143
|
end
|
|
138
144
|
end
|
|
@@ -67,7 +67,7 @@ class Jets::Router::MethodCreator
|
|
|
67
67
|
return if @as == :disabled
|
|
68
68
|
path_method_call = "#{full_meth_name(:path)}#{meth_args}"
|
|
69
69
|
# Note: It is important lazily get the value of ENV['JETS_HOST'] within the method.
|
|
70
|
-
# Since it is not set until the
|
|
70
|
+
# Since it is not set until the request goes through the main middleware.
|
|
71
71
|
<<~EOL
|
|
72
72
|
def #{full_meth_name(:url)}#{meth_args}
|
|
73
73
|
"\#{ENV['JETS_HOST']}\#{#{path_method_call}}"
|
data/lib/jets/router/scope.rb
CHANGED
|
@@ -35,9 +35,13 @@ module Jets
|
|
|
35
35
|
|
|
36
36
|
case current.from
|
|
37
37
|
when :resources
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
path_param = if current.options[:param]
|
|
39
|
+
":#{current.options[:param]}"
|
|
40
|
+
else
|
|
41
|
+
resource_name = prefix.to_s.split('/').last
|
|
42
|
+
resource_name = ":#{resource_name.singularize}_id"
|
|
43
|
+
end
|
|
44
|
+
result.unshift(path_param)
|
|
41
45
|
result.unshift(prefix)
|
|
42
46
|
else # resource, namespace or general scope
|
|
43
47
|
result.unshift(prefix)
|
|
@@ -25,10 +25,17 @@ module Jets::SpecHelpers
|
|
|
25
25
|
request.path = path
|
|
26
26
|
request.headers.deep_merge!(params.delete(:headers) || {})
|
|
27
27
|
|
|
28
|
-
request.params.body_params = params.delete(:params) || params || {}
|
|
29
|
-
|
|
30
28
|
request.params.query_params = params.delete(:query)
|
|
31
|
-
|
|
29
|
+
|
|
30
|
+
if request.method == :get
|
|
31
|
+
request.params.body_params = {}
|
|
32
|
+
request.params.query_params ||= params.delete(:params)
|
|
33
|
+
request.params.query_params ||= params
|
|
34
|
+
else
|
|
35
|
+
request.params.body_params = params.delete(:params)
|
|
36
|
+
request.params.body_params ||= params
|
|
37
|
+
end
|
|
38
|
+
|
|
32
39
|
request.params.query_params ||= {}
|
|
33
40
|
|
|
34
41
|
request.params.path_params = params
|
|
@@ -10,7 +10,7 @@ module Jets::SpecHelpers::Controllers
|
|
|
10
10
|
def event
|
|
11
11
|
json = {}
|
|
12
12
|
id_params = route.path.scan(%r{:([^/]+)}).flatten
|
|
13
|
-
expanded_path = path
|
|
13
|
+
expanded_path = escape_path(path)
|
|
14
14
|
path_parameters = {}
|
|
15
15
|
|
|
16
16
|
id_params.each do |id_param|
|
|
@@ -19,11 +19,12 @@ module Jets::SpecHelpers::Controllers
|
|
|
19
19
|
path_param_value = path_params[id_param.to_sym]
|
|
20
20
|
raise "Path param :#{id_param} value cannot be blank" if path_param_value.blank?
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
escaped_path_param_value = CGI.escape(path_param_value.to_s)
|
|
23
|
+
expanded_path.gsub!(":#{id_param}", escaped_path_param_value)
|
|
24
|
+
path_parameters.deep_merge!(id_param => escaped_path_param_value)
|
|
24
25
|
end
|
|
25
26
|
|
|
26
|
-
json['resource'] = path
|
|
27
|
+
json['resource'] = escape_path(path)
|
|
27
28
|
json['path'] = expanded_path
|
|
28
29
|
json['httpMethod'] = method.to_s.upcase
|
|
29
30
|
json['pathParameters'] = path_parameters
|
|
@@ -46,7 +47,7 @@ module Jets::SpecHelpers::Controllers
|
|
|
46
47
|
|
|
47
48
|
params.query_params.each do |key, value|
|
|
48
49
|
json['queryStringParameters'] ||= {}
|
|
49
|
-
json['queryStringParameters'][key.to_s] = value
|
|
50
|
+
json['queryStringParameters'][key.to_s] = value.deep_dup
|
|
50
51
|
end
|
|
51
52
|
|
|
52
53
|
json
|
|
@@ -84,5 +85,11 @@ module Jets::SpecHelpers::Controllers
|
|
|
84
85
|
|
|
85
86
|
Response.new(response) # converts APIGW hash to prettier object
|
|
86
87
|
end
|
|
88
|
+
|
|
89
|
+
private
|
|
90
|
+
|
|
91
|
+
def escape_path(path)
|
|
92
|
+
path.to_s.split('/').map { |s| s =~ /\A[:\*]/ ? s : CGI.escape(s) }.join('/')
|
|
93
|
+
end
|
|
87
94
|
end
|
|
88
95
|
end
|
|
@@ -41,7 +41,7 @@ module Jets::Stack::Main::Dsl
|
|
|
41
41
|
defaults[:function_name] = function_name if function_name
|
|
42
42
|
|
|
43
43
|
props = defaults.merge(props)
|
|
44
|
-
props[:runtime] =
|
|
44
|
+
props[:runtime] = Jets.ruby_runtime if props[:runtime].to_s == "ruby"
|
|
45
45
|
props[:handler] = handler(props[:handler])
|
|
46
46
|
|
|
47
47
|
logical_id = id.to_s.gsub('/','_')
|
data/lib/jets/turbo.rb
CHANGED
data/lib/jets/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: jets
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 3.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Tung Nguyen
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-01-
|
|
11
|
+
date: 2021-01-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: actionmailer
|
|
@@ -16,70 +16,70 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 6.
|
|
19
|
+
version: 6.1.0
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - "~>"
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 6.
|
|
26
|
+
version: 6.1.0
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: actionpack
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: 6.
|
|
33
|
+
version: 6.1.0
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: 6.
|
|
40
|
+
version: 6.1.0
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: actionview
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: 6.
|
|
47
|
+
version: 6.1.0
|
|
48
48
|
type: :runtime
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 6.
|
|
54
|
+
version: 6.1.0
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: activerecord
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
58
58
|
requirements:
|
|
59
59
|
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 6.
|
|
61
|
+
version: 6.1.0
|
|
62
62
|
type: :runtime
|
|
63
63
|
prerelease: false
|
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
65
|
requirements:
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: 6.
|
|
68
|
+
version: 6.1.0
|
|
69
69
|
- !ruby/object:Gem::Dependency
|
|
70
70
|
name: activesupport
|
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements:
|
|
73
73
|
- - "~>"
|
|
74
74
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: 6.
|
|
75
|
+
version: 6.1.0
|
|
76
76
|
type: :runtime
|
|
77
77
|
prerelease: false
|
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
|
79
79
|
requirements:
|
|
80
80
|
- - "~>"
|
|
81
81
|
- !ruby/object:Gem::Version
|
|
82
|
-
version: 6.
|
|
82
|
+
version: 6.1.0
|
|
83
83
|
- !ruby/object:Gem::Dependency
|
|
84
84
|
name: aws-mfa-secure
|
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -234,6 +234,20 @@ dependencies:
|
|
|
234
234
|
- - ">="
|
|
235
235
|
- !ruby/object:Gem::Version
|
|
236
236
|
version: '0'
|
|
237
|
+
- !ruby/object:Gem::Dependency
|
|
238
|
+
name: cfn-status
|
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
|
240
|
+
requirements:
|
|
241
|
+
- - ">="
|
|
242
|
+
- !ruby/object:Gem::Version
|
|
243
|
+
version: '0'
|
|
244
|
+
type: :runtime
|
|
245
|
+
prerelease: false
|
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
247
|
+
requirements:
|
|
248
|
+
- - ">="
|
|
249
|
+
- !ruby/object:Gem::Version
|
|
250
|
+
version: '0'
|
|
237
251
|
- !ruby/object:Gem::Dependency
|
|
238
252
|
name: cfn_camelizer
|
|
239
253
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -249,7 +263,7 @@ dependencies:
|
|
|
249
263
|
- !ruby/object:Gem::Version
|
|
250
264
|
version: 0.4.6
|
|
251
265
|
- !ruby/object:Gem::Dependency
|
|
252
|
-
name:
|
|
266
|
+
name: cfn_response
|
|
253
267
|
requirement: !ruby/object:Gem::Requirement
|
|
254
268
|
requirements:
|
|
255
269
|
- - ">="
|
|
@@ -304,20 +318,6 @@ dependencies:
|
|
|
304
318
|
- - ">="
|
|
305
319
|
- !ruby/object:Gem::Version
|
|
306
320
|
version: '0'
|
|
307
|
-
- !ruby/object:Gem::Dependency
|
|
308
|
-
name: jets-gems
|
|
309
|
-
requirement: !ruby/object:Gem::Requirement
|
|
310
|
-
requirements:
|
|
311
|
-
- - "~>"
|
|
312
|
-
- !ruby/object:Gem::Version
|
|
313
|
-
version: 0.2.3
|
|
314
|
-
type: :runtime
|
|
315
|
-
prerelease: false
|
|
316
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
317
|
-
requirements:
|
|
318
|
-
- - "~>"
|
|
319
|
-
- !ruby/object:Gem::Version
|
|
320
|
-
version: 0.2.3
|
|
321
321
|
- !ruby/object:Gem::Dependency
|
|
322
322
|
name: jets-html-sanitizer
|
|
323
323
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -394,14 +394,14 @@ dependencies:
|
|
|
394
394
|
requirements:
|
|
395
395
|
- - "~>"
|
|
396
396
|
- !ruby/object:Gem::Version
|
|
397
|
-
version: 6.
|
|
397
|
+
version: 6.1.0
|
|
398
398
|
type: :runtime
|
|
399
399
|
prerelease: false
|
|
400
400
|
version_requirements: !ruby/object:Gem::Requirement
|
|
401
401
|
requirements:
|
|
402
402
|
- - "~>"
|
|
403
403
|
- !ruby/object:Gem::Version
|
|
404
|
-
version: 6.
|
|
404
|
+
version: 6.1.0
|
|
405
405
|
- !ruby/object:Gem::Dependency
|
|
406
406
|
name: rainbow
|
|
407
407
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -430,6 +430,20 @@ dependencies:
|
|
|
430
430
|
- - ">="
|
|
431
431
|
- !ruby/object:Gem::Version
|
|
432
432
|
version: '0'
|
|
433
|
+
- !ruby/object:Gem::Dependency
|
|
434
|
+
name: serverlessgems
|
|
435
|
+
requirement: !ruby/object:Gem::Requirement
|
|
436
|
+
requirements:
|
|
437
|
+
- - ">="
|
|
438
|
+
- !ruby/object:Gem::Version
|
|
439
|
+
version: '0'
|
|
440
|
+
type: :runtime
|
|
441
|
+
prerelease: false
|
|
442
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
443
|
+
requirements:
|
|
444
|
+
- - ">="
|
|
445
|
+
- !ruby/object:Gem::Version
|
|
446
|
+
version: '0'
|
|
433
447
|
- !ruby/object:Gem::Dependency
|
|
434
448
|
name: shotgun
|
|
435
449
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -487,7 +501,7 @@ dependencies:
|
|
|
487
501
|
- !ruby/object:Gem::Version
|
|
488
502
|
version: '0'
|
|
489
503
|
- !ruby/object:Gem::Dependency
|
|
490
|
-
name:
|
|
504
|
+
name: bundler
|
|
491
505
|
requirement: !ruby/object:Gem::Requirement
|
|
492
506
|
requirements:
|
|
493
507
|
- - ">="
|
|
@@ -501,7 +515,7 @@ dependencies:
|
|
|
501
515
|
- !ruby/object:Gem::Version
|
|
502
516
|
version: '0'
|
|
503
517
|
- !ruby/object:Gem::Dependency
|
|
504
|
-
name:
|
|
518
|
+
name: byebug
|
|
505
519
|
requirement: !ruby/object:Gem::Requirement
|
|
506
520
|
requirements:
|
|
507
521
|
- - ">="
|
|
@@ -529,7 +543,7 @@ dependencies:
|
|
|
529
543
|
- !ruby/object:Gem::Version
|
|
530
544
|
version: '0'
|
|
531
545
|
- !ruby/object:Gem::Dependency
|
|
532
|
-
name:
|
|
546
|
+
name: render_me_pretty
|
|
533
547
|
requirement: !ruby/object:Gem::Requirement
|
|
534
548
|
requirements:
|
|
535
549
|
- - ">="
|
|
@@ -543,7 +557,7 @@ dependencies:
|
|
|
543
557
|
- !ruby/object:Gem::Version
|
|
544
558
|
version: '0'
|
|
545
559
|
- !ruby/object:Gem::Dependency
|
|
546
|
-
name:
|
|
560
|
+
name: rspec
|
|
547
561
|
requirement: !ruby/object:Gem::Requirement
|
|
548
562
|
requirements:
|
|
549
563
|
- - ">="
|
|
@@ -668,6 +682,7 @@ files:
|
|
|
668
682
|
- lib/jets/commands/clean/base.rb
|
|
669
683
|
- lib/jets/commands/clean/build.rb
|
|
670
684
|
- lib/jets/commands/clean/log.rb
|
|
685
|
+
- lib/jets/commands/configure.rb
|
|
671
686
|
- lib/jets/commands/console.rb
|
|
672
687
|
- lib/jets/commands/db.rb
|
|
673
688
|
- lib/jets/commands/db/environment-task.rake
|
|
@@ -827,6 +842,7 @@ files:
|
|
|
827
842
|
- lib/jets/internal/app/controllers/jets/public_controller.rb
|
|
828
843
|
- lib/jets/internal/app/controllers/jets/rack_controller.rb
|
|
829
844
|
- lib/jets/internal/app/functions/jets/base_path.rb
|
|
845
|
+
- lib/jets/internal/app/functions/jets/base_path_mapping.rb
|
|
830
846
|
- lib/jets/internal/app/helpers/jets/mailers_helper.rb
|
|
831
847
|
- lib/jets/internal/app/jobs/jets/preheat_job.rb
|
|
832
848
|
- lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb
|
|
@@ -899,6 +915,7 @@ files:
|
|
|
899
915
|
- lib/jets/resource/api_gateway/rest_api.rb
|
|
900
916
|
- lib/jets/resource/api_gateway/rest_api/change_detection.rb
|
|
901
917
|
- lib/jets/resource/api_gateway/rest_api/logical_id.rb
|
|
918
|
+
- lib/jets/resource/api_gateway/rest_api/logical_id/message.rb
|
|
902
919
|
- lib/jets/resource/api_gateway/rest_api/routes.rb
|
|
903
920
|
- lib/jets/resource/api_gateway/rest_api/routes/change.rb
|
|
904
921
|
- lib/jets/resource/api_gateway/rest_api/routes/change/base.rb
|
|
@@ -1020,30 +1037,6 @@ files:
|
|
|
1020
1037
|
- lib/jets/version.rb
|
|
1021
1038
|
- readme/prerelease.md
|
|
1022
1039
|
- readme/testing.md
|
|
1023
|
-
- vendor/cfn-status/CHANGELOG.md
|
|
1024
|
-
- vendor/cfn-status/Gemfile
|
|
1025
|
-
- vendor/cfn-status/Gemfile.lock
|
|
1026
|
-
- vendor/cfn-status/LICENSE.txt
|
|
1027
|
-
- vendor/cfn-status/README.md
|
|
1028
|
-
- vendor/cfn-status/Rakefile
|
|
1029
|
-
- vendor/cfn-status/bin/console
|
|
1030
|
-
- vendor/cfn-status/bin/setup
|
|
1031
|
-
- vendor/cfn-status/cfn-status.gemspec
|
|
1032
|
-
- vendor/cfn-status/lib/cfn-status.rb
|
|
1033
|
-
- vendor/cfn-status/lib/cfn_status.rb
|
|
1034
|
-
- vendor/cfn-status/lib/cfn_status/aws_service.rb
|
|
1035
|
-
- vendor/cfn-status/lib/cfn_status/version.rb
|
|
1036
|
-
- vendor/cfn-status/spec/fixtures/cfn/pages/fresh/describe_stack_events-1.json
|
|
1037
|
-
- vendor/cfn-status/spec/fixtures/cfn/pages/fresh/describe_stack_events-2.json
|
|
1038
|
-
- vendor/cfn-status/spec/fixtures/cfn/pages/fresh/describe_stack_events-3.json
|
|
1039
|
-
- vendor/cfn-status/spec/fixtures/cfn/pages/updating/describe_stack_events-1.json
|
|
1040
|
-
- vendor/cfn-status/spec/fixtures/cfn/pages/updating/describe_stack_events-2.json
|
|
1041
|
-
- vendor/cfn-status/spec/fixtures/cfn/pages/updating/describe_stack_events-3.json
|
|
1042
|
-
- vendor/cfn-status/spec/fixtures/cfn/stack-events-complete.json
|
|
1043
|
-
- vendor/cfn-status/spec/fixtures/cfn/stack-events-in-progress.json
|
|
1044
|
-
- vendor/cfn-status/spec/fixtures/cfn/stack-events-update-rollback-complete.json
|
|
1045
|
-
- vendor/cfn-status/spec/lib/cfn_status_spec.rb
|
|
1046
|
-
- vendor/cfn-status/spec/spec_helper.rb
|
|
1047
1040
|
homepage: https://rubyonjets.com
|
|
1048
1041
|
licenses:
|
|
1049
1042
|
- MIT
|
|
@@ -1103,7 +1096,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
1103
1096
|
- !ruby/object:Gem::Version
|
|
1104
1097
|
version: '0'
|
|
1105
1098
|
requirements: []
|
|
1106
|
-
rubygems_version: 3.
|
|
1099
|
+
rubygems_version: 3.1.4
|
|
1107
1100
|
signing_key:
|
|
1108
1101
|
specification_version: 4
|
|
1109
1102
|
summary: Ruby Serverless Framework
|