jets 3.2.2 → 4.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -0
- data/jets.gemspec +1 -1
- data/lib/jets/application/defaults.rb +2 -0
- data/lib/jets/application.rb +6 -7
- data/lib/jets/aws_info.rb +2 -2
- data/lib/jets/booter.rb +48 -1
- data/lib/jets/builders/code_builder.rb +2 -21
- data/lib/jets/builders/gem_replacer.rb +2 -7
- data/lib/jets/builders/ruby_packager.rb +37 -4
- data/lib/jets/cfn/builders/api_deployment_builder.rb +1 -1
- data/lib/jets/cfn/builders/api_gateway_builder.rb +25 -22
- data/lib/jets/cfn/builders/api_resources_builder.rb +1 -1
- data/lib/jets/cfn/builders/authorizer_builder.rb +1 -1
- data/lib/jets/cfn/builders/base_child_builder.rb +20 -1
- data/lib/jets/cfn/builders/interface.rb +19 -0
- data/lib/jets/cfn/builders/parent_builder.rb +3 -3
- data/lib/jets/cfn/builders/shared_builder.rb +1 -1
- data/lib/jets/cfn/built_template.rb +1 -1
- data/lib/jets/cfn/ship.rb +2 -2
- data/lib/jets/cfn/status.rb +1 -1
- data/lib/jets/cfn/upload.rb +2 -2
- data/lib/jets/cli.rb +10 -4
- data/lib/jets/commands/call/base_guesser.rb +1 -1
- data/lib/jets/commands/clean/log.rb +3 -3
- data/lib/jets/commands/configure.rb +1 -1
- data/lib/jets/commands/delete.rb +1 -1
- data/lib/jets/commands/deploy.rb +2 -2
- data/lib/jets/commands/stack_info.rb +1 -1
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +1 -1
- data/lib/jets/commands/url.rb +1 -1
- data/lib/jets/core.rb +14 -2
- data/lib/jets/core_ext/file.rb +9 -0
- data/lib/jets/dotenv.rb +2 -2
- data/lib/jets/erb.rb +1 -1
- data/lib/jets/inflections.rb +1 -1
- data/lib/jets/internal/app/controllers/jets/bare_controller.rb +1 -1
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +9 -5
- data/lib/jets/lambda/dsl.rb +9 -2
- data/lib/jets/{naming.rb → names.rb} +3 -3
- data/lib/jets/preheat.rb +9 -6
- data/lib/jets/resource/api_gateway/base_path/role.rb +1 -1
- data/lib/jets/resource/api_gateway/cors.rb +1 -1
- data/lib/jets/resource/api_gateway/deployment.rb +2 -2
- data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +1 -1
- data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +1 -1
- data/lib/jets/resource/api_gateway/rest_api/routes/change/media_types.rb +1 -1
- data/lib/jets/resource/api_gateway/rest_api/routes/change/page.rb +2 -2
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +1 -1
- data/lib/jets/resource/api_gateway/rest_api.rb +1 -1
- data/lib/jets/resource/child_stack/api_deployment.rb +1 -1
- data/lib/jets/resource/child_stack/api_resource/page.rb +1 -1
- data/lib/jets/resource/child_stack/api_resource.rb +1 -1
- data/lib/jets/resource/child_stack/app_class.rb +1 -1
- data/lib/jets/resource/child_stack/shared.rb +1 -1
- data/lib/jets/resource/iam/base_role_definition.rb +0 -5
- data/lib/jets/resource/iam/policy.rb +31 -0
- data/lib/jets/resource/lambda/function/environment.rb +2 -1
- data/lib/jets/resource/lambda/function.rb +3 -3
- data/lib/jets/router/route.rb +16 -4
- data/lib/jets/tmp_loader.rb +1 -1
- data/lib/jets/turbo/database_yaml.rb +1 -1
- data/lib/jets/util/yamler.rb +16 -0
- data/lib/jets/version.rb +1 -1
- data/lib/jets.rb +1 -0
- metadata +7 -9
- data/.python-version +0 -1
- data/.ruby-version +0 -1
data/lib/jets/commands/delete.rb
CHANGED
data/lib/jets/commands/deploy.rb
CHANGED
@@ -81,7 +81,7 @@ module Jets::Commands
|
|
81
81
|
memoize :status
|
82
82
|
|
83
83
|
def stack_name
|
84
|
-
Jets::
|
84
|
+
Jets::Names.parent_stack_name
|
85
85
|
end
|
86
86
|
|
87
87
|
# Checks for a few things before deciding to delete the parent stack
|
@@ -117,7 +117,7 @@ module Jets::Commands
|
|
117
117
|
def exit_unless_updateable!
|
118
118
|
return if ENV['JETS_FORCE_UPDATEABLE'] # useful for debugging if stack stack updating
|
119
119
|
|
120
|
-
stack_name = Jets::
|
120
|
+
stack_name = Jets::Names.parent_stack_name
|
121
121
|
exists = stack_exists?(stack_name)
|
122
122
|
return unless exists # continue because stack could be updating
|
123
123
|
|
@@ -11,7 +11,7 @@ Jets.application.configure do
|
|
11
11
|
# config.prewarm.public_ratio = 3 # default is 3
|
12
12
|
<% end -%>
|
13
13
|
|
14
|
-
# config.
|
14
|
+
# config.extra = 2 # can also set this with JETS_EXTRA
|
15
15
|
# config.autoload_paths = []
|
16
16
|
|
17
17
|
# config.asset_base_url = 'https://cloudfront.domain.com/assets' # example
|
data/lib/jets/commands/url.rb
CHANGED
@@ -7,7 +7,7 @@ module Jets::Commands
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def display
|
10
|
-
stack_name = Jets::
|
10
|
+
stack_name = Jets::Names.parent_stack_name
|
11
11
|
unless stack_exists?(stack_name)
|
12
12
|
puts "Stack for #{Jets.config.project_name.color(:green)} project for environment #{Jets.env.color(:green)}. Couldn't find #{stack_name.color(:green)} stack."
|
13
13
|
exit
|
data/lib/jets/core.rb
CHANGED
@@ -32,7 +32,19 @@ module Jets::Core
|
|
32
32
|
end
|
33
33
|
memoize :env
|
34
34
|
|
35
|
-
|
35
|
+
@@extra_warning_shown = false
|
36
|
+
def extra
|
37
|
+
# Keep for backwards compatibility
|
38
|
+
unless ENV['JETS_ENV_EXTRA'].blank?
|
39
|
+
puts "DEPRECATION WARNING: JETS_ENV_EXTRA is deprecated. Use JETS_EXTRA instead.".color(:yellow) unless @@extra_warning_shown
|
40
|
+
@@extra_warning_shown = true
|
41
|
+
extra = ENV['JETS_ENV_EXTRA']
|
42
|
+
end
|
43
|
+
extra = ENV['JETS_EXTRA'] unless ENV['JETS_EXTRA'].blank?
|
44
|
+
extra
|
45
|
+
end
|
46
|
+
|
47
|
+
def build_root
|
36
48
|
"/tmp/jets/#{config.project_name}".freeze
|
37
49
|
end
|
38
50
|
memoize :build_root
|
@@ -76,7 +88,7 @@ module Jets::Core
|
|
76
88
|
end
|
77
89
|
|
78
90
|
def project_namespace
|
79
|
-
[config.project_name, config.short_env, config.
|
91
|
+
[config.project_name, config.short_env, config.extra].compact.join('-').gsub('_','-')
|
80
92
|
end
|
81
93
|
|
82
94
|
def rack?
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class File
|
2
|
+
class << self
|
3
|
+
# Ruby 3.2 removed File.exists?
|
4
|
+
# aws_config/store.rb uses it
|
5
|
+
# https://github.com/a2ikm/aws_config/blob/ef9cdd0eda116577f7d358bc421afd8e2f1eb1d3/lib/aws_config/store.rb#L6
|
6
|
+
# Probably a bunch of other libraries still use File.exists? also
|
7
|
+
alias_method :exists?, :exist?
|
8
|
+
end
|
9
|
+
end
|
data/lib/jets/dotenv.rb
CHANGED
@@ -36,8 +36,8 @@ class Jets::Dotenv
|
|
36
36
|
(root.join(".env.#{Jets.env}.local") unless @remote),
|
37
37
|
]
|
38
38
|
files << root.join(".env.#{Jets.env}.remote") if @remote
|
39
|
-
if
|
40
|
-
files << root.join(".env.#{Jets.env}.#{
|
39
|
+
if Jets.extra
|
40
|
+
files << root.join(".env.#{Jets.env}.#{Jets.extra}")
|
41
41
|
end
|
42
42
|
files.compact
|
43
43
|
end
|
data/lib/jets/erb.rb
CHANGED
@@ -12,7 +12,7 @@ class Jets::Erb
|
|
12
12
|
set_template_variables(variables)
|
13
13
|
template = IO.read(path)
|
14
14
|
begin
|
15
|
-
ERB.new(template,
|
15
|
+
ERB.new(template, trim_mode: '-').result(binding)
|
16
16
|
rescue Exception => e
|
17
17
|
puts e
|
18
18
|
puts e.backtrace if ENV['JETS_DEBUG']
|
data/lib/jets/inflections.rb
CHANGED
@@ -10,7 +10,7 @@ private
|
|
10
10
|
def process!
|
11
11
|
status, headers, body = dispatch!
|
12
12
|
# Use the adapter only to convert the Rack triplet to a API Gateway hash structure
|
13
|
-
adapter = Jets::Controller::Rack::Adapter.new(event, context
|
13
|
+
adapter = Jets::Controller::Rack::Adapter.new(event, context)
|
14
14
|
adapter.convert_to_api_gateway(status, headers, body)
|
15
15
|
end
|
16
16
|
end
|
@@ -12,13 +12,17 @@ class Jets::PreheatJob < ApplicationJob
|
|
12
12
|
sid: "Statement1",
|
13
13
|
action: ["logs:*"],
|
14
14
|
effect: "Allow",
|
15
|
-
resource:
|
15
|
+
resource: [
|
16
|
+
sub("arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${WarmLambdaFunction}"),
|
17
|
+
]
|
16
18
|
},
|
17
19
|
{
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
Sid: "Statement2",
|
21
|
+
Action: ["lambda:InvokeFunction", "lambda:InvokeAsync"],
|
22
|
+
Effect: "Allow",
|
23
|
+
Resource: [
|
24
|
+
sub("arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:#{Jets.project_namespace}-*")
|
25
|
+
]
|
22
26
|
}
|
23
27
|
)
|
24
28
|
|
data/lib/jets/lambda/dsl.rb
CHANGED
@@ -234,7 +234,13 @@ module Jets::Lambda::Dsl
|
|
234
234
|
end
|
235
235
|
|
236
236
|
def ref(name)
|
237
|
-
|
237
|
+
name = name.is_a?(Symbol) ? name.to_s.camelize : name
|
238
|
+
"!Ref #{name}"
|
239
|
+
end
|
240
|
+
|
241
|
+
def sub(value)
|
242
|
+
value = value.is_a?(Symbol) ? value.to_s.camelize : value
|
243
|
+
"!Sub #{value}"
|
238
244
|
end
|
239
245
|
|
240
246
|
# meth is a Symbol
|
@@ -317,7 +323,8 @@ module Jets::Lambda::Dsl
|
|
317
323
|
#
|
318
324
|
# Do not include tasks from the direct subclasses of Jets::Lambda::Functions
|
319
325
|
# because those classes are abstract. Dont want those methods to be included.
|
320
|
-
def find_all_tasks(
|
326
|
+
def find_all_tasks(options={})
|
327
|
+
public = options[:public].nil? ? true : options[:public]
|
321
328
|
klass = self
|
322
329
|
direct_subclasses = Jets::Lambda::Functions.subclasses
|
323
330
|
lookup = []
|
@@ -1,7 +1,7 @@
|
|
1
|
-
# This class groups the
|
2
|
-
# Some
|
1
|
+
# This class groups the names in one place.
|
2
|
+
# Some names are for CloudFormation
|
3
3
|
# Some are for the Build process
|
4
|
-
class Jets::
|
4
|
+
class Jets::Names
|
5
5
|
# Mainly used by build.rb
|
6
6
|
class << self
|
7
7
|
extend Memoist
|
data/lib/jets/preheat.rb
CHANGED
@@ -91,12 +91,15 @@ module Jets
|
|
91
91
|
# ...
|
92
92
|
# ]
|
93
93
|
def all_functions
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
94
|
+
parent_stack = cfn.describe_stack_resources(stack_name: Jets::Names.parent_stack_name)
|
95
|
+
parent_resources = parent_stack.stack_resources.select do |resource|
|
96
|
+
resource.logical_resource_id =~ /Controller$/ # only controller functions
|
97
|
+
end
|
98
|
+
physical_resource_ids = parent_resources.map(&:physical_resource_id)
|
99
|
+
resources = physical_resource_ids.inject([]) do |acc, physical_resource_id|
|
100
|
+
stack_resources = cfn.describe_stack_resources(stack_name: physical_resource_id).stack_resources
|
101
|
+
stack_resources.each do |stack_resource|
|
102
|
+
acc << stack_resource if stack_resource.logical_resource_id.ends_with?('LambdaFunction') # only functions
|
100
103
|
end
|
101
104
|
end.flatten.uniq.compact
|
102
105
|
end
|
@@ -54,7 +54,7 @@ module Jets::Resource::ApiGateway::BasePath
|
|
54
54
|
|
55
55
|
# Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb
|
56
56
|
def rest_api_id
|
57
|
-
stack_name = Jets::
|
57
|
+
stack_name = Jets::Names.parent_stack_name
|
58
58
|
return "RestApi" unless stack_exists?(stack_name)
|
59
59
|
|
60
60
|
stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
|
@@ -33,7 +33,7 @@ module Jets::Resource::ApiGateway
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def depends_on
|
36
|
-
expression = "#{Jets::
|
36
|
+
expression = "#{Jets::Names.template_path_prefix}-*_controller*"
|
37
37
|
controller_logical_ids = []
|
38
38
|
Dir.glob(expression).each do |path|
|
39
39
|
next unless File.file?(path)
|
@@ -57,7 +57,7 @@ module Jets::Resource::ApiGateway
|
|
57
57
|
|
58
58
|
def self.stage_name
|
59
59
|
# Stage name only allows a-zA-Z0-9_
|
60
|
-
[Jets.config.short_env, Jets.config.
|
60
|
+
[Jets.config.short_env, Jets.config.extra].compact.join('_').gsub('-','_')
|
61
61
|
end
|
62
62
|
|
63
63
|
def timestamp
|
@@ -86,7 +86,7 @@ class Jets::Resource::ApiGateway::RestApi::Routes::Change
|
|
86
86
|
|
87
87
|
# Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb
|
88
88
|
def rest_api_id
|
89
|
-
stack_name = Jets::
|
89
|
+
stack_name = Jets::Names.parent_stack_name
|
90
90
|
return "RestApi" unless stack_exists?(stack_name)
|
91
91
|
|
92
92
|
stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
|
@@ -33,7 +33,7 @@ class Jets::Resource::ApiGateway::RestApi::Routes::Change
|
|
33
33
|
# logical id to page map
|
34
34
|
# Important: In Cfn::Builders::ApiGatewayBuilder, the add_gateway_routes and ApiResourcesBuilder needs to run
|
35
35
|
# before the parent add_gateway_rest_api method.
|
36
|
-
def local_logical_ids_map(path_expression="#{Jets::
|
36
|
+
def local_logical_ids_map(path_expression="#{Jets::Names.template_path_prefix}-api-resources-*.yml")
|
37
37
|
logical_ids = {} # logical id => page number
|
38
38
|
|
39
39
|
Dir.glob(path_expression).each do |path|
|
@@ -85,7 +85,7 @@ class Jets::Resource::ApiGateway::RestApi::Routes::Change
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def parent_resources
|
88
|
-
resp = cfn.describe_stack_resources(stack_name: Jets::
|
88
|
+
resp = cfn.describe_stack_resources(stack_name: Jets::Names.parent_stack_name)
|
89
89
|
resp.stack_resources
|
90
90
|
end
|
91
91
|
memoize :parent_resources
|
@@ -2,7 +2,7 @@ module Jets::Resource::ApiGateway
|
|
2
2
|
class RestApi < Jets::Resource::Base
|
3
3
|
def definition
|
4
4
|
properties = {
|
5
|
-
name: Jets::
|
5
|
+
name: Jets::Names.gateway_api_name,
|
6
6
|
endpoint_configuration: { types: endpoint_types }
|
7
7
|
}
|
8
8
|
properties[:endpoint_configuration][:vpc_endpoint_ids] = vpce_ids if vpce_ids
|
@@ -31,7 +31,7 @@ module Jets::Resource::ChildStack
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def depends_on
|
34
|
-
expression = "#{Jets::
|
34
|
+
expression = "#{Jets::Names.template_path_prefix}-*_controller*"
|
35
35
|
controller_logical_ids = []
|
36
36
|
Dir.glob(expression).each do |path|
|
37
37
|
next unless File.file?(path)
|
@@ -3,7 +3,7 @@ class Jets::Resource::ChildStack::ApiResource
|
|
3
3
|
# Returns: logical id of ApiResource Page
|
4
4
|
class Page
|
5
5
|
def self.logical_id(parameter)
|
6
|
-
expression = "#{Jets::
|
6
|
+
expression = "#{Jets::Names.template_path_prefix}-api-resources-*"
|
7
7
|
# IE: path: #{Jets.build_root}/templates/demo-dev-2-api-resources-1.yml"
|
8
8
|
template_paths = Dir.glob(expression).sort.to_a
|
9
9
|
found_template = template_paths.detect do |path|
|
@@ -28,7 +28,7 @@ module Jets::Resource::ChildStack
|
|
28
28
|
# Since dont have all the info required.
|
29
29
|
# Read the template back to find the parameters required.
|
30
30
|
# Actually might be easier to rationalize this approach.
|
31
|
-
template_path = Jets::
|
31
|
+
template_path = Jets::Names.api_resources_template_path(@page)
|
32
32
|
template = Jets::Cfn::BuiltTemplate.get(template_path)
|
33
33
|
template['Parameters'].keys.each do |p|
|
34
34
|
case p
|
@@ -125,7 +125,7 @@ module Jets::Resource::ChildStack
|
|
125
125
|
end
|
126
126
|
|
127
127
|
def current_app_class
|
128
|
-
templates_prefix = "#{Jets::
|
128
|
+
templates_prefix = "#{Jets::Names.template_path_prefix}-app-"
|
129
129
|
@path.sub(templates_prefix, '')
|
130
130
|
.sub(/\.yml$/,'')
|
131
131
|
.gsub('-','/')
|
@@ -63,7 +63,7 @@ module Jets::Resource::ChildStack
|
|
63
63
|
# IE: app/resource.rb => Resource
|
64
64
|
# Returns Resource class object in the example
|
65
65
|
def current_shared_class
|
66
|
-
templates_prefix = "#{Jets::
|
66
|
+
templates_prefix = "#{Jets::Names.template_path_prefix}-shared-"
|
67
67
|
@path.sub(templates_prefix, '')
|
68
68
|
.sub(/\.yml$/,'')
|
69
69
|
.gsub('-','/')
|
@@ -24,11 +24,6 @@ module Jets::Resource::Iam
|
|
24
24
|
}
|
25
25
|
}
|
26
26
|
|
27
|
-
definition[logical_id][:properties][:policies] = [
|
28
|
-
policy_name: "#{policy_name[0..127]}", # required, limited to 128-chars
|
29
|
-
policy_document: policy_document,
|
30
|
-
] unless policy_document['Statement'].empty?
|
31
|
-
|
32
27
|
unless managed_policy_arns.empty?
|
33
28
|
definition[logical_id][:properties][:managed_policy_arns] = managed_policy_arns
|
34
29
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Jets::Resource::Iam
|
2
|
+
class Policy < Jets::Resource::Base
|
3
|
+
def initialize(role)
|
4
|
+
@role = role
|
5
|
+
end
|
6
|
+
delegate :policy_document, :policy_name, :role_logical_id, :replacements, to: :@role
|
7
|
+
|
8
|
+
def policy_logical_id
|
9
|
+
role_logical_id.sub(/role$/, "policy")
|
10
|
+
end
|
11
|
+
|
12
|
+
def definition
|
13
|
+
logical_id = policy_logical_id
|
14
|
+
|
15
|
+
# Do not assign pretty role_name because long controller names might hit the 64-char
|
16
|
+
# limit. Also, IAM roles are global, so assigning role names prevents cross region deploys.
|
17
|
+
definition = {
|
18
|
+
logical_id => {
|
19
|
+
type: "AWS::IAM::Policy",
|
20
|
+
properties: {
|
21
|
+
roles: [Ref: role_logical_id.camelize],
|
22
|
+
policy_name: "#{policy_name[0..127]}", # required, limited to 128-chars
|
23
|
+
policy_document: policy_document,
|
24
|
+
}
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
definition
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -16,7 +16,8 @@ class Jets::Resource::Lambda::Function
|
|
16
16
|
def jets_env
|
17
17
|
env = {}
|
18
18
|
env[:JETS_ENV] = Jets.env.to_s
|
19
|
-
env[:JETS_ENV_EXTRA] = Jets.
|
19
|
+
env[:JETS_ENV_EXTRA] = Jets.extra if Jets.extra # keep JETS_ENV_EXTRA for backwards compatibility
|
20
|
+
env[:JETS_EXTRA] = Jets.extra if Jets.extra
|
20
21
|
env[:JETS_PROJECT_NAME] = ENV['JETS_PROJECT_NAME'] if ENV['JETS_PROJECT_NAME']
|
21
22
|
env[:JETS_STAGE] = Jets::Resource::ApiGateway::Deployment.stage_name
|
22
23
|
env[:JETS_AWS_ACCOUNT] = Jets.aws.account
|
@@ -136,9 +136,9 @@ module Jets::Resource::Lambda
|
|
136
136
|
end
|
137
137
|
|
138
138
|
def get_layers(runtime)
|
139
|
-
return nil unless runtime =~ /^ruby/
|
139
|
+
return nil unless runtime =~ /^ruby/ || runtime =~ /^provided/
|
140
140
|
return Jets.config.lambda.layers if Jets.config.gems.disable
|
141
|
-
|
141
|
+
|
142
142
|
["!Ref GemLayer"] + Jets.config.lambda.layers
|
143
143
|
end
|
144
144
|
|
@@ -208,7 +208,7 @@ module Jets::Resource::Lambda
|
|
208
208
|
def get_descripton(props)
|
209
209
|
props[:description] || default_description
|
210
210
|
end
|
211
|
-
|
211
|
+
|
212
212
|
def default_description
|
213
213
|
# Example values:
|
214
214
|
# @app_class: Admin/PagesController
|
data/lib/jets/router/route.rb
CHANGED
@@ -16,6 +16,22 @@ class Jets::Router
|
|
16
16
|
@path = compute_path
|
17
17
|
@to = compute_to
|
18
18
|
@as = compute_as
|
19
|
+
# Pretty tricky. The @options[:mount_class] is a class that is mounted.
|
20
|
+
# For Grape apps, calling ActiveSupport to_json on a Grape class causes an infinite loop.
|
21
|
+
# Can reproduce with `GrapeApp.to_json`
|
22
|
+
# There's some type of collision between Grape and ActiveSupport to_json.
|
23
|
+
# Coerce mount_class option into a string so that when the route is serialized to JSON
|
24
|
+
# it is a string it won't cause an infinite loop. This allows the apigw routes to be
|
25
|
+
# saved to s3 and loaded back up at the end of a deploy.
|
26
|
+
# Related PR: smarter apigw routes paging calculation #635
|
27
|
+
# https://github.com/boltops-tools/jets/pull/635
|
28
|
+
# Debugging notes: https://gist.github.com/tongueroo/c9baa7e98d5ad68bbdd770fde4651963
|
29
|
+
@options[:mount_class] = @options[:mount_class].to_s if @options[:mount_class]
|
30
|
+
end
|
31
|
+
|
32
|
+
# Constantize back to the original class
|
33
|
+
def mount_class
|
34
|
+
@options[:mount_class].constantize
|
19
35
|
end
|
20
36
|
|
21
37
|
def compute_path
|
@@ -187,10 +203,6 @@ class Jets::Router
|
|
187
203
|
end.to_h
|
188
204
|
end
|
189
205
|
|
190
|
-
def mount_class
|
191
|
-
@options[:mount_class]
|
192
|
-
end
|
193
|
-
|
194
206
|
def to_h
|
195
207
|
JSON.load(to_json)
|
196
208
|
end
|
data/lib/jets/tmp_loader.rb
CHANGED
@@ -9,7 +9,7 @@ module Jets
|
|
9
9
|
def initialize(yaml_path=nil)
|
10
10
|
yaml_path ||= "#{Jets.root}/handlers/data.yml"
|
11
11
|
return unless File.exist?(yaml_path)
|
12
|
-
@data =
|
12
|
+
@data = Jets::Util::Yamler.load_file(yaml_path)
|
13
13
|
@s3_bucket = @data['s3_bucket']
|
14
14
|
@rack_zip = @data['rack_zip']
|
15
15
|
end
|
@@ -5,7 +5,7 @@ class Jets::Turbo
|
|
5
5
|
return unless File.exist?(current_yaml)
|
6
6
|
|
7
7
|
vars = {}
|
8
|
-
current_database =
|
8
|
+
current_database = Jets::Util::Yamler.load_file(current_yaml)
|
9
9
|
database_names = infer_database_name(current_database)
|
10
10
|
vars.merge!(database_names)
|
11
11
|
vars['adapter'] = current_database['development']['adapter']
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Named Yamler to make it clear it's not the YAML class.
|
2
|
+
class Jets::Util
|
3
|
+
class Yamler
|
4
|
+
class << self
|
5
|
+
def load(text)
|
6
|
+
options = RUBY_VERSION =~ /^3/ ? {aliases: true} : {} # Ruby 3.0.0 deprecates aliases: true
|
7
|
+
YAML.load(text, **options)
|
8
|
+
end
|
9
|
+
|
10
|
+
def load_file(path)
|
11
|
+
options = RUBY_VERSION =~ /^3/ ? {aliases: true} : {} # Ruby 3.0.0 deprecates aliases: true
|
12
|
+
YAML.load_file(path, **options)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/jets/version.rb
CHANGED
data/lib/jets.rb
CHANGED
@@ -3,6 +3,7 @@ $stdout.sync = true unless ENV["JETS_STDOUT_SYNC"] == "0"
|
|
3
3
|
$:.unshift(File.expand_path("../", __FILE__))
|
4
4
|
|
5
5
|
require "jets/core_ext/bundler"
|
6
|
+
require "jets/core_ext/file"
|
6
7
|
require "jets/autoloaders"
|
7
8
|
Jets::Autoloaders.log! if ENV["JETS_AUTOLOAD_LOG"]
|
8
9
|
Jets::Autoloaders.once.setup # must be called before cli.setup
|
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: 4.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionmailer
|
@@ -599,9 +599,7 @@ files:
|
|
599
599
|
- ".github/PULL_REQUEST_TEMPLATE.md"
|
600
600
|
- ".gitignore"
|
601
601
|
- ".gitmodules"
|
602
|
-
- ".python-version"
|
603
602
|
- ".rspec"
|
604
|
-
- ".ruby-version"
|
605
603
|
- CHANGELOG.md
|
606
604
|
- CONDUCT.md
|
607
605
|
- CONTRIBUTING.md
|
@@ -814,6 +812,7 @@ files:
|
|
814
812
|
- lib/jets/controller/stage.rb
|
815
813
|
- lib/jets/core.rb
|
816
814
|
- lib/jets/core_ext/bundler.rb
|
815
|
+
- lib/jets/core_ext/file.rb
|
817
816
|
- lib/jets/core_ext/kernel.rb
|
818
817
|
- lib/jets/db.rb
|
819
818
|
- lib/jets/dotenv.rb
|
@@ -882,7 +881,7 @@ files:
|
|
882
881
|
- lib/jets/middleware/default_stack.rb
|
883
882
|
- lib/jets/middleware/layer.rb
|
884
883
|
- lib/jets/middleware/stack.rb
|
885
|
-
- lib/jets/
|
884
|
+
- lib/jets/names.rb
|
886
885
|
- lib/jets/overrides/lambda.rb
|
887
886
|
- lib/jets/overrides/lambda/marshaller.rb
|
888
887
|
- lib/jets/overrides/rails.rb
|
@@ -947,6 +946,7 @@ files:
|
|
947
946
|
- lib/jets/resource/iam/class_role.rb
|
948
947
|
- lib/jets/resource/iam/function_role.rb
|
949
948
|
- lib/jets/resource/iam/managed_policy.rb
|
949
|
+
- lib/jets/resource/iam/policy.rb
|
950
950
|
- lib/jets/resource/iam/policy_document.rb
|
951
951
|
- lib/jets/resource/iot/topic_rule.rb
|
952
952
|
- lib/jets/resource/lambda/event_source_mapping.rb
|
@@ -1038,6 +1038,7 @@ files:
|
|
1038
1038
|
- lib/jets/turbo/rails.rb
|
1039
1039
|
- lib/jets/turbo/templates/config/database.yml
|
1040
1040
|
- lib/jets/util.rb
|
1041
|
+
- lib/jets/util/yamler.rb
|
1041
1042
|
- lib/jets/version.rb
|
1042
1043
|
- readme/prerelease.md
|
1043
1044
|
- readme/testing.md
|
@@ -1094,16 +1095,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
1094
1095
|
- - ">="
|
1095
1096
|
- !ruby/object:Gem::Version
|
1096
1097
|
version: 2.5.0
|
1097
|
-
- - "<"
|
1098
|
-
- !ruby/object:Gem::Version
|
1099
|
-
version: 3.0.0
|
1100
1098
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
1101
1099
|
requirements:
|
1102
1100
|
- - ">="
|
1103
1101
|
- !ruby/object:Gem::Version
|
1104
1102
|
version: '0'
|
1105
1103
|
requirements: []
|
1106
|
-
rubygems_version: 3.4.
|
1104
|
+
rubygems_version: 3.4.10
|
1107
1105
|
signing_key:
|
1108
1106
|
specification_version: 4
|
1109
1107
|
summary: Ruby Serverless Framework
|
data/.python-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
3.8.6
|
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
2.7.7
|