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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/CHANGELOG.md +55 -0
  4. data/README.md +1 -5
  5. data/backers.md +0 -5
  6. data/jets.gemspec +4 -4
  7. data/lib/jets/application/defaults.rb +7 -2
  8. data/lib/jets/application.rb +6 -7
  9. data/lib/jets/aws_info.rb +2 -2
  10. data/lib/jets/aws_services.rb +8 -0
  11. data/lib/jets/booter.rb +64 -5
  12. data/lib/jets/builders/code_builder.rb +35 -21
  13. data/lib/jets/builders/gem_replacer.rb +2 -7
  14. data/lib/jets/builders/ruby_packager.rb +37 -4
  15. data/lib/jets/cfn/builders/api_deployment_builder.rb +1 -1
  16. data/lib/jets/cfn/builders/api_gateway_builder.rb +31 -27
  17. data/lib/jets/cfn/builders/api_resources_builder.rb +1 -1
  18. data/lib/jets/cfn/builders/authorizer_builder.rb +1 -1
  19. data/lib/jets/cfn/builders/base_child_builder.rb +20 -1
  20. data/lib/jets/cfn/builders/interface.rb +19 -0
  21. data/lib/jets/cfn/builders/page_builder.rb +80 -0
  22. data/lib/jets/cfn/builders/parent_builder.rb +22 -3
  23. data/lib/jets/cfn/builders/shared_builder.rb +1 -1
  24. data/lib/jets/cfn/built_template.rb +1 -1
  25. data/lib/jets/cfn/ship.rb +9 -2
  26. data/lib/jets/cfn/status.rb +1 -1
  27. data/lib/jets/cfn/upload.rb +2 -2
  28. data/lib/jets/cli.rb +12 -5
  29. data/lib/jets/commands/call/base_guesser.rb +1 -1
  30. data/lib/jets/commands/clean/log.rb +3 -3
  31. data/lib/jets/commands/configure.rb +1 -1
  32. data/lib/jets/commands/console.rb +7 -1
  33. data/lib/jets/commands/delete.rb +1 -1
  34. data/lib/jets/commands/deploy.rb +2 -2
  35. data/lib/jets/commands/main.rb +6 -3
  36. data/lib/jets/commands/stack_info.rb +1 -1
  37. data/lib/jets/commands/templates/skeleton/Gemfile.tt +1 -1
  38. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +2 -1
  39. data/lib/jets/commands/url.rb +1 -1
  40. data/lib/jets/core.rb +14 -2
  41. data/lib/jets/core_ext/file.rb +9 -0
  42. data/lib/jets/dotenv.rb +2 -2
  43. data/lib/jets/erb.rb +1 -1
  44. data/lib/jets/inflections.rb +1 -1
  45. data/lib/jets/internal/app/controllers/jets/bare_controller.rb +1 -1
  46. data/lib/jets/internal/app/functions/jets/base_path.rb +93 -3
  47. data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +79 -8
  48. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +6 -2
  49. data/lib/jets/job/base.rb +2 -0
  50. data/lib/jets/job/helpers/sns_event_helper.rb +8 -0
  51. data/lib/jets/job/helpers/sqs_event_helper.rb +8 -0
  52. data/lib/jets/lambda/dsl.rb +7 -1
  53. data/lib/jets/{naming.rb → names.rb} +3 -3
  54. data/lib/jets/preheat.rb +9 -6
  55. data/lib/jets/resource/api_gateway/base_path/role.rb +1 -1
  56. data/lib/jets/resource/api_gateway/deployment.rb +2 -2
  57. data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +13 -3
  58. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +1 -1
  59. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +11 -40
  60. data/lib/jets/resource/api_gateway/rest_api/routes/change/media_types.rb +1 -1
  61. data/lib/jets/resource/api_gateway/rest_api/routes/change/page.rb +2 -2
  62. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +1 -1
  63. data/lib/jets/resource/api_gateway/rest_api.rb +12 -2
  64. data/lib/jets/resource/child_stack/api_deployment.rb +1 -1
  65. data/lib/jets/resource/child_stack/api_resource/page.rb +1 -1
  66. data/lib/jets/resource/child_stack/api_resource.rb +1 -1
  67. data/lib/jets/resource/child_stack/app_class.rb +1 -1
  68. data/lib/jets/resource/child_stack/shared.rb +1 -1
  69. data/lib/jets/resource/iam/base_role_definition.rb +0 -5
  70. data/lib/jets/resource/iam/policy.rb +31 -0
  71. data/lib/jets/resource/lambda/function/environment.rb +6 -3
  72. data/lib/jets/resource/lambda/function.rb +3 -3
  73. data/lib/jets/router/route.rb +18 -2
  74. data/lib/jets/router/state.rb +47 -0
  75. data/lib/jets/router.rb +12 -0
  76. data/lib/jets/stack/main/dsl/lambda.rb +1 -0
  77. data/lib/jets/tmp_loader.rb +1 -1
  78. data/lib/jets/turbo/database_yaml.rb +1 -1
  79. data/lib/jets/util/yamler.rb +16 -0
  80. data/lib/jets/version.rb +1 -1
  81. data/lib/jets.rb +2 -0
  82. metadata +26 -20
  83. data/.python-version +0 -1
  84. data/.ruby-version +0 -1
@@ -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.config.env_extra if Jets.config.env_extra
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
@@ -36,21 +37,23 @@ class Jets::Resource::Lambda::Function
36
37
  exit 1
37
38
  end
38
39
 
39
- # https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html#lambda-environment-variables
40
+ # https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html
40
41
  def reserved_variables
41
42
  %w[
42
43
  _HANDLER
44
+ AWS_DEFAULT_REGION
43
45
  AWS_REGION
44
46
  AWS_EXECUTION_ENV
45
47
  AWS_LAMBDA_FUNCTION_NAME
46
48
  AWS_LAMBDA_FUNCTION_MEMORY_SIZE
47
49
  AWS_LAMBDA_FUNCTION_VERSION
50
+ AWS_LAMBDA_INITIALIZATION_TYPE
48
51
  AWS_LAMBDA_LOG_GROUP_NAME
49
52
  AWS_LAMBDA_LOG_STREAM_NAME
53
+ AWS_ACCESS_KEY
50
54
  AWS_ACCESS_KEY_ID
51
55
  AWS_SECRET_ACCESS_KEY
52
56
  AWS_SESSION_TOKEN
53
- TZ
54
57
  LAMBDA_TASK_ROOT
55
58
  LAMBDA_RUNTIME_DIR
56
59
  AWS_LAMBDA_RUNTIME_API
@@ -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
@@ -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,8 +203,8 @@ class Jets::Router
187
203
  end.to_h
188
204
  end
189
205
 
190
- def mount_class
191
- @options[:mount_class]
206
+ def to_h
207
+ JSON.load(to_json)
192
208
  end
193
209
 
194
210
  private
@@ -0,0 +1,47 @@
1
+ class Jets::Router
2
+ class State
3
+ extend Memoist
4
+ include Jets::AwsServices
5
+
6
+ def load(filename)
7
+ resp = s3.get_object(
8
+ bucket: Jets.aws.s3_bucket,
9
+ key: s3_storage_path(filename),
10
+ )
11
+ text = resp.body.read
12
+ JSON.load(text)
13
+ rescue
14
+ end
15
+ memoize :load
16
+
17
+ # Save previously deployed APIGW routes state
18
+ def save(filename, data)
19
+ # body = Jets::Router.routes.to_json
20
+ # body = JSON.generate(Jets::Cfn::Builders::PageBuilder.pages)
21
+ body = data.respond_to?(:to_json) ? data.to_json : JSON.generate(data)
22
+ s3.put_object(
23
+ body: body,
24
+ bucket: Jets.aws.s3_bucket,
25
+ key: s3_storage_path(filename),
26
+ )
27
+ end
28
+
29
+ # Examples:
30
+ #
31
+ # jets/state/apigw/pages.json
32
+ # jets/state/apigw/routes.json
33
+ #
34
+ # Fetch or loaded in:
35
+ #
36
+ # pages.json: Jets::Cfn::Builders::PageBuilder#old_pages
37
+ # routes.json: Jets::Resource::ApiGateway::RestApi::Routes::Change::Base#deployed_routes
38
+ #
39
+ # Saved in:
40
+ #
41
+ # Jets::Cfn::Ship#save_apigw_state
42
+ #
43
+ def s3_storage_path(filename)
44
+ "jets/state/apigw/#{filename}.json"
45
+ end
46
+ end
47
+ end
data/lib/jets/router.rb CHANGED
@@ -134,6 +134,18 @@ module Jets
134
134
  drawn_router.routes
135
135
  end
136
136
 
137
+ # So we can save state in s3 post deploy. Example of structure.
138
+ #
139
+ # [
140
+ # {"scope"=>{"options"=>{"as"=>"posts", "prefix"=>"posts", "param"=>nil, "from"=>"resources"}, "parent"=>{"options"=>{}, "parent"=>nil, "level"=>1}, "level"=>2}, "options"=>{"to"=>"posts#index", "from_scope"=>true, "path"=>"posts", "method"=>"get"}, "path"=>"posts", "to"=>"posts#index", "as"=>"posts"},
141
+ # {"scope"=>{"options"=>{"as"=>"posts", "prefix"=>"posts", "param"=>nil, "from"=>"resources"}, "parent"=>{"options"=>{}, "parent"=>nil, "level"=>1}, "level"=>2}, "options"=>{"to"=>"posts#new", "from_scope"=>true, "path"=>"posts/new", "method"=>"get"}, "path"=>"posts/new", "to"=>"posts#new", "as"=>"new_post"},
142
+ # ...
143
+ # ]
144
+ #
145
+ def to_json
146
+ JSON.dump(routes.map(&:to_h))
147
+ end
148
+
137
149
  # Returns all paths including subpaths.
138
150
  # Example:
139
151
  # Input: ["posts/:id/edit"]
@@ -33,6 +33,7 @@ module Jets::Stack::Main::Dsl
33
33
  runtime: :ruby,
34
34
  timeout: Jets.config.function.timeout,
35
35
  memory_size: Jets.config.function.memory_size,
36
+ ephemeral_storage: Jets.config.function.ephemeral_storage,
36
37
  description: description,
37
38
  }
38
39
 
@@ -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 = YAML.load_file(yaml_path)
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 = YAML.load_file(current_yaml)
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
@@ -1,3 +1,3 @@
1
1
  module Jets
2
- VERSION = "3.1.0"
2
+ VERSION = "4.0.0"
3
3
  end
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
@@ -17,6 +18,7 @@ require "active_support/ordered_options"
17
18
  require "cfn_camelizer"
18
19
  require "cfn_status"
19
20
  require "fileutils"
21
+ require "json"
20
22
  require "memoist"
21
23
  require "rainbow/ext/string"
22
24
  require "serverlessgems"
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: 3.1.0
4
+ version: 4.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: 2022-01-08 00:00:00.000000000 Z
11
+ date: 2023-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionmailer
@@ -252,16 +252,16 @@ dependencies:
252
252
  name: cfn_camelizer
253
253
  requirement: !ruby/object:Gem::Requirement
254
254
  requirements:
255
- - - "~>"
255
+ - - ">="
256
256
  - !ruby/object:Gem::Version
257
- version: 0.4.6
257
+ version: 0.4.9
258
258
  type: :runtime
259
259
  prerelease: false
260
260
  version_requirements: !ruby/object:Gem::Requirement
261
261
  requirements:
262
- - - "~>"
262
+ - - ">="
263
263
  - !ruby/object:Gem::Version
264
- version: 0.4.6
264
+ version: 0.4.9
265
265
  - !ruby/object:Gem::Dependency
266
266
  name: cfn_response
267
267
  requirement: !ruby/object:Gem::Requirement
@@ -434,16 +434,16 @@ dependencies:
434
434
  name: serverlessgems
435
435
  requirement: !ruby/object:Gem::Requirement
436
436
  requirements:
437
- - - "~>"
437
+ - - ">="
438
438
  - !ruby/object:Gem::Version
439
- version: 0.1.4
439
+ version: 0.2.0
440
440
  type: :runtime
441
441
  prerelease: false
442
442
  version_requirements: !ruby/object:Gem::Requirement
443
443
  requirements:
444
- - - "~>"
444
+ - - ">="
445
445
  - !ruby/object:Gem::Version
446
- version: 0.1.4
446
+ version: 0.2.0
447
447
  - !ruby/object:Gem::Dependency
448
448
  name: shotgun
449
449
  requirement: !ruby/object:Gem::Requirement
@@ -490,16 +490,16 @@ dependencies:
490
490
  name: zeitwerk
491
491
  requirement: !ruby/object:Gem::Requirement
492
492
  requirements:
493
- - - "~>"
493
+ - - ">="
494
494
  - !ruby/object:Gem::Version
495
- version: 2.5.0
495
+ version: 2.6.0
496
496
  type: :runtime
497
497
  prerelease: false
498
498
  version_requirements: !ruby/object:Gem::Requirement
499
499
  requirements:
500
- - - "~>"
500
+ - - ">="
501
501
  - !ruby/object:Gem::Version
502
- version: 2.5.0
502
+ version: 2.6.0
503
503
  - !ruby/object:Gem::Dependency
504
504
  name: bundler
505
505
  requirement: !ruby/object:Gem::Requirement
@@ -590,6 +590,7 @@ files:
590
590
  - ".cody/docs/bin/subnav.sh"
591
591
  - ".cody/docs/buildspec.yml"
592
592
  - ".cody/docs/project.rb"
593
+ - ".github/FUNDING.yml"
593
594
  - ".github/ISSUE_TEMPLATE.md"
594
595
  - ".github/ISSUE_TEMPLATE/bug_report.md"
595
596
  - ".github/ISSUE_TEMPLATE/documentation.md"
@@ -598,9 +599,7 @@ files:
598
599
  - ".github/PULL_REQUEST_TEMPLATE.md"
599
600
  - ".gitignore"
600
601
  - ".gitmodules"
601
- - ".python-version"
602
602
  - ".rspec"
603
- - ".ruby-version"
604
603
  - CHANGELOG.md
605
604
  - CONDUCT.md
606
605
  - CONTRIBUTING.md
@@ -660,6 +659,7 @@ files:
660
659
  - lib/jets/cfn/builders/function_builder.rb
661
660
  - lib/jets/cfn/builders/interface.rb
662
661
  - lib/jets/cfn/builders/job_builder.rb
662
+ - lib/jets/cfn/builders/page_builder.rb
663
663
  - lib/jets/cfn/builders/parent_builder.rb
664
664
  - lib/jets/cfn/builders/parent_builder/stagger.rb
665
665
  - lib/jets/cfn/builders/rule_builder.rb
@@ -812,6 +812,7 @@ files:
812
812
  - lib/jets/controller/stage.rb
813
813
  - lib/jets/core.rb
814
814
  - lib/jets/core_ext/bundler.rb
815
+ - lib/jets/core_ext/file.rb
815
816
  - lib/jets/core_ext/kernel.rb
816
817
  - lib/jets/db.rb
817
818
  - lib/jets/dotenv.rb
@@ -863,6 +864,8 @@ files:
863
864
  - lib/jets/job/helpers/kinesis_event_helper.rb
864
865
  - lib/jets/job/helpers/log_event_helper.rb
865
866
  - lib/jets/job/helpers/s3_event_helper.rb
867
+ - lib/jets/job/helpers/sns_event_helper.rb
868
+ - lib/jets/job/helpers/sqs_event_helper.rb
866
869
  - lib/jets/klass.rb
867
870
  - lib/jets/lambda/dsl.rb
868
871
  - lib/jets/lambda/function.rb
@@ -878,7 +881,7 @@ files:
878
881
  - lib/jets/middleware/default_stack.rb
879
882
  - lib/jets/middleware/layer.rb
880
883
  - lib/jets/middleware/stack.rb
881
- - lib/jets/naming.rb
884
+ - lib/jets/names.rb
882
885
  - lib/jets/overrides/lambda.rb
883
886
  - lib/jets/overrides/lambda/marshaller.rb
884
887
  - lib/jets/overrides/rails.rb
@@ -943,6 +946,7 @@ files:
943
946
  - lib/jets/resource/iam/class_role.rb
944
947
  - lib/jets/resource/iam/function_role.rb
945
948
  - lib/jets/resource/iam/managed_policy.rb
949
+ - lib/jets/resource/iam/policy.rb
946
950
  - lib/jets/resource/iam/policy_document.rb
947
951
  - lib/jets/resource/iot/topic_rule.rb
948
952
  - lib/jets/resource/lambda/event_source_mapping.rb
@@ -983,6 +987,7 @@ files:
983
987
  - lib/jets/router/route.rb
984
988
  - lib/jets/router/route/authorizer.rb
985
989
  - lib/jets/router/scope.rb
990
+ - lib/jets/router/state.rb
986
991
  - lib/jets/router/util.rb
987
992
  - lib/jets/rule/base.rb
988
993
  - lib/jets/rule/dsl.rb
@@ -1033,6 +1038,7 @@ files:
1033
1038
  - lib/jets/turbo/rails.rb
1034
1039
  - lib/jets/turbo/templates/config/database.yml
1035
1040
  - lib/jets/util.rb
1041
+ - lib/jets/util/yamler.rb
1036
1042
  - lib/jets/version.rb
1037
1043
  - readme/prerelease.md
1038
1044
  - readme/testing.md
@@ -1086,16 +1092,16 @@ require_paths:
1086
1092
  - lib
1087
1093
  required_ruby_version: !ruby/object:Gem::Requirement
1088
1094
  requirements:
1089
- - - "~>"
1095
+ - - ">="
1090
1096
  - !ruby/object:Gem::Version
1091
- version: '2.5'
1097
+ version: 2.5.0
1092
1098
  required_rubygems_version: !ruby/object:Gem::Requirement
1093
1099
  requirements:
1094
1100
  - - ">="
1095
1101
  - !ruby/object:Gem::Version
1096
1102
  version: '0'
1097
1103
  requirements: []
1098
- rubygems_version: 3.1.6
1104
+ rubygems_version: 3.4.10
1099
1105
  signing_key:
1100
1106
  specification_version: 4
1101
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.5