jets 3.1.0 → 4.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/.github/FUNDING.yml +1 -0
- data/CHANGELOG.md +55 -0
- data/README.md +1 -5
- data/backers.md +0 -5
- data/jets.gemspec +4 -4
- data/lib/jets/application/defaults.rb +7 -2
- data/lib/jets/application.rb +6 -7
- data/lib/jets/aws_info.rb +2 -2
- data/lib/jets/aws_services.rb +8 -0
- data/lib/jets/booter.rb +64 -5
- data/lib/jets/builders/code_builder.rb +35 -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 +31 -27
- 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/page_builder.rb +80 -0
- data/lib/jets/cfn/builders/parent_builder.rb +22 -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 +9 -2
- data/lib/jets/cfn/status.rb +1 -1
- data/lib/jets/cfn/upload.rb +2 -2
- data/lib/jets/cli.rb +12 -5
- 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/console.rb +7 -1
- data/lib/jets/commands/delete.rb +1 -1
- data/lib/jets/commands/deploy.rb +2 -2
- data/lib/jets/commands/main.rb +6 -3
- data/lib/jets/commands/stack_info.rb +1 -1
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +1 -1
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +2 -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/functions/jets/base_path.rb +93 -3
- data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +79 -8
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +6 -2
- data/lib/jets/job/base.rb +2 -0
- data/lib/jets/job/helpers/sns_event_helper.rb +8 -0
- data/lib/jets/job/helpers/sqs_event_helper.rb +8 -0
- data/lib/jets/lambda/dsl.rb +7 -1
- 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/deployment.rb +2 -2
- data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +13 -3
- 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 +11 -40
- 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 +12 -2
- 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 +6 -3
- data/lib/jets/resource/lambda/function.rb +3 -3
- data/lib/jets/router/route.rb +18 -2
- data/lib/jets/router/state.rb +47 -0
- data/lib/jets/router.rb +12 -0
- data/lib/jets/stack/main/dsl/lambda.rb +1 -0
- 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 +2 -0
- metadata +26 -20
- data/.python-version +0 -1
- data/.ruby-version +0 -1
@@ -18,7 +18,7 @@ module Jets::Cfn::Builders
|
|
18
18
|
|
19
19
|
# template_path is an interface method for Interface module
|
20
20
|
def template_path
|
21
|
-
Jets::
|
21
|
+
Jets::Names.app_template_path(@app_class)
|
22
22
|
end
|
23
23
|
|
24
24
|
def add_common_parameters
|
@@ -40,6 +40,7 @@ module Jets::Cfn::Builders
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def add_functions
|
43
|
+
validate_function_names!
|
43
44
|
add_class_iam_policy
|
44
45
|
@app_class.tasks.each do |task|
|
45
46
|
add_function(task)
|
@@ -65,5 +66,23 @@ module Jets::Cfn::Builders
|
|
65
66
|
resource = Jets::Resource::Iam::FunctionRole.new(task)
|
66
67
|
add_resource(resource)
|
67
68
|
end
|
69
|
+
|
70
|
+
def validate_function_names!
|
71
|
+
invalids = @app_class.tasks.reject do |task|
|
72
|
+
task.meth.to_s =~ /^[a-zA-Z][a-zA-Z0-9_]/
|
73
|
+
end
|
74
|
+
return if invalids.empty?
|
75
|
+
list = invalids.map do |task|
|
76
|
+
" #{task.class_name}##{task.meth}" # IE: PostsController#index
|
77
|
+
end.join("\n")
|
78
|
+
puts "ERROR: Detected invalid AWS Lambda function names".color(:red)
|
79
|
+
puts <<~EOL
|
80
|
+
Lambda function names must start with a letter and can only contain letters, numbers, and underscores.
|
81
|
+
Invalid function names:
|
82
|
+
|
83
|
+
#{list}
|
84
|
+
EOL
|
85
|
+
exit 1
|
86
|
+
end
|
68
87
|
end
|
69
88
|
end
|
@@ -88,8 +88,27 @@ module Jets::Cfn::Builders
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
+
# Note: Jets::Resource::Iam classes are special treated. They are the only resources that result
|
92
|
+
# in creating 2 CloudFormation resources: Iam::Policy and Iam::Role.
|
93
|
+
# This allows the user to refer to the Lambda Function name in the IAM Policy itself.
|
94
|
+
# We need separate resources to avoid CloudFormation erroring with a circular dependency.
|
95
|
+
# Using separate IAM::Policy and IAM::Role resources allows us avoid the circular dependency error.
|
96
|
+
#
|
97
|
+
# Handling logic here also centralizes code for this special behavior.
|
98
|
+
# Also important to note, this does not change the user-facing interface.
|
99
|
+
# IE: Users still uses code like:
|
100
|
+
#
|
101
|
+
# iam_policy("s3", "sns")
|
102
|
+
#
|
103
|
+
# and be none-the-wiser about the special behavior.
|
91
104
|
def add_resource(resource)
|
92
105
|
add_template_resource(resource.logical_id, resource.type, resource.attributes)
|
106
|
+
|
107
|
+
if resource.class.to_s.include?("Jets::Resource::Iam")
|
108
|
+
role = resource # for clarity: resource is a Iam::*Role class
|
109
|
+
iam_policy = Jets::Resource::Iam::Policy.new(role)
|
110
|
+
add_template_resource(iam_policy.logical_id, iam_policy.type, iam_policy.attributes)
|
111
|
+
end
|
93
112
|
end
|
94
113
|
|
95
114
|
# The add_resource method can take an options Hash with both with either
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Jets::Cfn::Builders
|
2
|
+
class PageBuilder
|
3
|
+
extend Memoist
|
4
|
+
cattr_reader :pages
|
5
|
+
|
6
|
+
# Build page slices
|
7
|
+
def build
|
8
|
+
map = build_map
|
9
|
+
pages = []
|
10
|
+
map.each do |path, existing_page|
|
11
|
+
if existing_page
|
12
|
+
pages[existing_page] ||= []
|
13
|
+
pages[existing_page] << path
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Remove existing paths from map. Leave behind new paths
|
18
|
+
pages.each do |page|
|
19
|
+
page.each do |i|
|
20
|
+
map.delete(i)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Fill up available space in each page so all existing pages are full
|
25
|
+
keys = map.keys
|
26
|
+
pages.each do |page|
|
27
|
+
break if keys.empty?
|
28
|
+
while page.size < page_limit
|
29
|
+
path = keys.shift
|
30
|
+
break if path.nil?
|
31
|
+
page << path
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Add remaining slices to new additional pages
|
36
|
+
pages += keys.each_slice(page_limit).to_a
|
37
|
+
|
38
|
+
@@pages = pages
|
39
|
+
|
40
|
+
pages
|
41
|
+
end
|
42
|
+
|
43
|
+
# Build map that has paths as keys and page number as value
|
44
|
+
# Example: {"a1"=>0, "a2"=>0, "b1"=>1, "b2"=>1, "c1"=>2, "c2"=>2}
|
45
|
+
def build_map
|
46
|
+
map = {}
|
47
|
+
new_paths.each do |path|
|
48
|
+
map[path] = find_page_index(path)
|
49
|
+
end
|
50
|
+
map
|
51
|
+
end
|
52
|
+
|
53
|
+
def find_page_index(new_path)
|
54
|
+
pages = old_pages || []
|
55
|
+
pages.each_with_index do |slice, i|
|
56
|
+
slice.find do |old_path|
|
57
|
+
return i if old_path == new_path
|
58
|
+
end
|
59
|
+
end
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
|
63
|
+
def old_pages
|
64
|
+
state = Jets::Router::State.new
|
65
|
+
state.load("pages")
|
66
|
+
end
|
67
|
+
memoize :old_pages
|
68
|
+
|
69
|
+
def new_paths
|
70
|
+
Jets::Router.all_paths.reject { |p| p == '' }
|
71
|
+
end
|
72
|
+
|
73
|
+
# Relevant is CloudFormation Outputs limit is 200
|
74
|
+
# JETS_APIGW_PAGE_LIMIT is based on that
|
75
|
+
# https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html
|
76
|
+
def page_limit
|
77
|
+
Integer(ENV['JETS_APIGW_PAGE_LIMIT'] || 200)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -19,14 +19,33 @@ module Jets::Cfn::Builders
|
|
19
19
|
|
20
20
|
# template_path is an interface method
|
21
21
|
def template_path
|
22
|
-
Jets::
|
22
|
+
Jets::Names.parent_template_path
|
23
23
|
end
|
24
24
|
|
25
25
|
def build_minimal_resources
|
26
26
|
add_description("Jets: #{Jets.version} Code: #{Util::Source.version}")
|
27
27
|
|
28
28
|
# Initial s3 bucket, used to store code zipfile and templates Jets generates
|
29
|
+
#
|
30
|
+
# AWS changed the default behavior of s3 buckets to block public access
|
31
|
+
# https://aws.amazon.com/blogs/aws/amazon-s3-block-public-access-another-layer-of-protection-for-your-accounts-and-buckets/
|
32
|
+
# https://github.com/aws-amplify/amplify-cli/issues/12503
|
33
|
+
#
|
34
|
+
# Jets uploads assets to s3 bucket with acl: "public-read" here
|
35
|
+
# https://github.com/boltops-tools/jets/blob/c5858ec2706a606665a92c3ada3f16ae4c753372/lib/jets/cfn/upload.rb#L97
|
36
|
+
#
|
37
|
+
# Use minimal s3 bucket policy to allow public read access to assets.
|
38
|
+
# Leave the other options as comments to help document the default behavior.
|
29
39
|
resource = Jets::Resource::S3::Bucket.new(logical_id: "s3_bucket",
|
40
|
+
PublicAccessBlockConfiguration: {
|
41
|
+
BlockPublicAcls: false,
|
42
|
+
# BlockPublicPolicy: false,
|
43
|
+
# IgnorePublicAcls: false,
|
44
|
+
# RestrictPublicBuckets: false
|
45
|
+
},
|
46
|
+
OwnershipControls: {
|
47
|
+
Rules: [{ObjectOwnership: "ObjectWriter"}]
|
48
|
+
},
|
30
49
|
bucket_encryption: {
|
31
50
|
server_side_encryption_configuration: [
|
32
51
|
server_side_encryption_by_default: {
|
@@ -71,7 +90,7 @@ module Jets::Cfn::Builders
|
|
71
90
|
# #{Jets.build_root}/templates/demo-dev-2-app-comments_controller.yml
|
72
91
|
# #{Jets.build_root}/templates/demo-dev-2-authorizers-main_authorizer.yml
|
73
92
|
def for_each_path(type)
|
74
|
-
expression = "#{Jets::
|
93
|
+
expression = "#{Jets::Names.template_path_prefix}-#{type}-*"
|
75
94
|
Dir.glob(expression).each do |path|
|
76
95
|
next unless File.file?(path)
|
77
96
|
yield(path)
|
@@ -104,7 +123,7 @@ module Jets::Cfn::Builders
|
|
104
123
|
end
|
105
124
|
|
106
125
|
def add_api_resources
|
107
|
-
expression = "#{Jets::
|
126
|
+
expression = "#{Jets::Names.template_path_prefix}-api-resources-*"
|
108
127
|
# IE: path: #{Jets.build_root}/templates/demo-dev-2-api-resources-1.yml"
|
109
128
|
Dir.glob(expression).sort.each do |path|
|
110
129
|
next unless File.file?(path)
|
data/lib/jets/cfn/ship.rb
CHANGED
@@ -5,7 +5,7 @@ module Jets::Cfn
|
|
5
5
|
|
6
6
|
def initialize(options)
|
7
7
|
@options = options
|
8
|
-
@parent_stack_name = Jets::
|
8
|
+
@parent_stack_name = Jets::Names.parent_stack_name
|
9
9
|
end
|
10
10
|
|
11
11
|
def run
|
@@ -42,6 +42,7 @@ module Jets::Cfn
|
|
42
42
|
exit 1
|
43
43
|
end
|
44
44
|
|
45
|
+
save_apigw_state
|
45
46
|
prewarm
|
46
47
|
clean_deploy_logs
|
47
48
|
show_api_endpoint
|
@@ -80,7 +81,7 @@ module Jets::Cfn
|
|
80
81
|
end
|
81
82
|
|
82
83
|
def template
|
83
|
-
@template ||= TemplateSource.new(Jets::
|
84
|
+
@template ||= TemplateSource.new(Jets::Names.parent_template_path, @options)
|
84
85
|
end
|
85
86
|
|
86
87
|
# check for /(_COMPLETE|_FAILED)$/ status
|
@@ -88,6 +89,12 @@ module Jets::Cfn
|
|
88
89
|
Jets::Cfn::Status.new(@options).wait
|
89
90
|
end
|
90
91
|
|
92
|
+
def save_apigw_state
|
93
|
+
state = Jets::Router::State.new
|
94
|
+
state.save("pages", Jets::Cfn::Builders::PageBuilder.pages)
|
95
|
+
state.save("routes", Jets::Router.routes)
|
96
|
+
end
|
97
|
+
|
91
98
|
def prewarm
|
92
99
|
if ENV['SKIP_PREWARMING']
|
93
100
|
puts "Skipping prewarming" # useful for testing
|
data/lib/jets/cfn/status.rb
CHANGED
data/lib/jets/cfn/upload.rb
CHANGED
@@ -21,7 +21,7 @@ module Jets::Cfn
|
|
21
21
|
|
22
22
|
def upload_cfn_templates
|
23
23
|
puts "Uploading CloudFormation templates to S3."
|
24
|
-
expression = "#{Jets::
|
24
|
+
expression = "#{Jets::Names.template_path_prefix}-*"
|
25
25
|
Dir.glob(expression).each do |path|
|
26
26
|
next unless File.file?(path)
|
27
27
|
|
@@ -93,7 +93,7 @@ module Jets::Cfn
|
|
93
93
|
key = s3_key(full_path)
|
94
94
|
obj = s3_resource.bucket(bucket_name).object(key)
|
95
95
|
content_type = content_type_headers(full_path)
|
96
|
-
|
96
|
+
Jets.logger.debug "Uploading and setting content type for s3://#{bucket_name}/#{key} content_type #{content_type[:content_type].inspect}"
|
97
97
|
obj.upload_file(full_path, { acl: "public-read", cache_control: cache_control }.merge(content_type))
|
98
98
|
end
|
99
99
|
|
data/lib/jets/cli.rb
CHANGED
@@ -63,7 +63,8 @@ class Jets::CLI
|
|
63
63
|
# Pretty tricky, we need to use the raw @given_args as thor_args eventually calls Commands::Base#eager_load!
|
64
64
|
# which uses Jets.env before we get a chance to override ENV['JETS_ENV']
|
65
65
|
command, env = @given_args[0..1]
|
66
|
-
|
66
|
+
|
67
|
+
return unless %w[deploy delete console c].include?(command)
|
67
68
|
env = nil if env&.starts_with?('-')
|
68
69
|
return unless env
|
69
70
|
ENV['JETS_ENV'] = env ? env : 'development'
|
@@ -136,10 +137,16 @@ class Jets::CLI
|
|
136
137
|
end
|
137
138
|
|
138
139
|
return unless jets_project?
|
139
|
-
|
140
|
-
if rake_task_found
|
141
|
-
|
142
|
-
|
140
|
+
|
141
|
+
Jets::Commands::RakeCommand if rake_task_found
|
142
|
+
end
|
143
|
+
|
144
|
+
def rake_task_found
|
145
|
+
return false unless full_command # can be nil for subcommands and would break jets help without this check
|
146
|
+
bracket_regex = /\[.*/ # matches everything after the first [
|
147
|
+
command = full_command.sub(bracket_regex, '') # remove everything after the first [
|
148
|
+
namespaced_commands = Jets::Commands::RakeCommand.namespaced_commands.map {|x| x.sub(bracket_regex, '') }
|
149
|
+
namespaced_commands.include?(command)
|
143
150
|
end
|
144
151
|
|
145
152
|
def jets_project?
|
@@ -56,7 +56,7 @@ class Jets::Commands::Call
|
|
56
56
|
|
57
57
|
@@parent_stack = nil
|
58
58
|
def parent_stack
|
59
|
-
@@parent_stack ||= cfn.describe_stacks(stack_name: Jets::
|
59
|
+
@@parent_stack ||= cfn.describe_stacks(stack_name: Jets::Names.parent_stack_name).stacks.first
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
# /aws/lambda/demo-dev-2-jets-preheat_job-warm
|
5
5
|
# /aws/lambda/demo-dev-2-jets-public_controller-show
|
6
6
|
#
|
7
|
-
# We're doing this because
|
7
|
+
# We're doing this because Jets.extra environments can create additional matching
|
8
8
|
# log groups and we don't want to overly-aggressively delete them.
|
9
9
|
#
|
10
10
|
# The `keep_prefixes(log_group_names)` method calcuates the log groups to keep.
|
@@ -49,7 +49,7 @@ class Jets::Commands::Clean
|
|
49
49
|
|
50
50
|
private
|
51
51
|
def prefix_guess
|
52
|
-
Jets::
|
52
|
+
Jets::Names.parent_stack_name
|
53
53
|
end
|
54
54
|
|
55
55
|
def log_groups
|
@@ -78,7 +78,7 @@ class Jets::Commands::Clean
|
|
78
78
|
|
79
79
|
# Check for the prefixes to keep. The slightly tricky thing to watch for is
|
80
80
|
# for the prefix matching addiitonal log groups that belong to other
|
81
|
-
#
|
81
|
+
# JETS_EXTRA=xxx created environments.
|
82
82
|
#
|
83
83
|
# We find and store the prefixes to keep so we don't over aggressively delete
|
84
84
|
# log groups.
|
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
|
|
data/lib/jets/commands/main.rb
CHANGED
@@ -61,10 +61,13 @@ module Jets::Commands
|
|
61
61
|
Jets::Router.validate_routes!
|
62
62
|
end
|
63
63
|
|
64
|
-
desc "console", "REPL console with Jets environment loaded"
|
64
|
+
desc "console [environment]", "REPL console with Jets environment loaded"
|
65
65
|
long_desc Help.text(:console)
|
66
|
-
|
67
|
-
|
66
|
+
# Note the environment is here to trick the Thor parser to allowing an
|
67
|
+
# environment parameter. It is not actually set here. It is set earlier
|
68
|
+
# in cli.rb: set_jets_env_from_cli_arg!
|
69
|
+
def console(environment=nil)
|
70
|
+
Console.new(options).run
|
68
71
|
end
|
69
72
|
|
70
73
|
desc "runner", "Run Ruby code in the context of Jets app non-interactively"
|
@@ -18,7 +18,7 @@ gem "mysql2", "~> 0.5.3"
|
|
18
18
|
<% unless options[:mode] == 'job' -%>
|
19
19
|
gem "dynomite"
|
20
20
|
<% end -%>
|
21
|
-
gem "zeitwerk", "
|
21
|
+
gem "zeitwerk", ">= 2.5.0"
|
22
22
|
|
23
23
|
# development and test groups are not bundled as part of the deployment
|
24
24
|
group :development, :test do
|
@@ -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
|
@@ -35,6 +35,7 @@ Jets.application.configure do
|
|
35
35
|
# security_group_ids: %w[sg-1 sg-2],
|
36
36
|
# subnet_ids: %w[subnet-1 subnet-2],
|
37
37
|
# }
|
38
|
+
# config.function.ephemeral_storage = { size: 1536 }
|
38
39
|
# The config.function settings to the CloudFormation Lambda Function properties.
|
39
40
|
# http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html
|
40
41
|
# Underscored format can be used for keys to make it look more ruby-ish.
|
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
|