jets 2.3.12 → 2.3.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.cody/docs/bin/git_setup.sh +0 -9
  3. data/.ruby-version +1 -1
  4. data/CHANGELOG.md +41 -0
  5. data/Gemfile +1 -1
  6. data/jets.gemspec +0 -1
  7. data/lib/jets.rb +2 -0
  8. data/lib/jets/application/defaults.rb +1 -0
  9. data/lib/jets/booter.rb +1 -1
  10. data/lib/jets/builders/code_builder.rb +14 -5
  11. data/lib/jets/builders/gem_replacer.rb +3 -1
  12. data/lib/jets/builders/ruby_packager.rb +1 -1
  13. data/lib/jets/commands/build.rb +1 -0
  14. data/lib/jets/commands/call.rb +1 -1
  15. data/lib/jets/commands/call/base_guesser.rb +4 -2
  16. data/lib/jets/commands/gems.rb +1 -1
  17. data/lib/jets/commands/import/base.rb +1 -1
  18. data/lib/jets/commands/main.rb +1 -1
  19. data/lib/jets/commands/new.rb +1 -1
  20. data/lib/jets/commands/rake_tasks.rb +1 -0
  21. data/lib/jets/commands/templates/skeleton/Gemfile.tt +2 -2
  22. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +9 -1
  23. data/lib/jets/controller/authorization.rb +10 -1
  24. data/lib/jets/controller/base.rb +17 -4
  25. data/lib/jets/controller/parameters_filter.rb +29 -0
  26. data/lib/jets/controller/params.rb +8 -0
  27. data/lib/jets/core_ext/bundler.rb +7 -0
  28. data/lib/jets/dotenv.rb +5 -5
  29. data/lib/jets/internal/turbines/jets/mailer.rb +1 -0
  30. data/lib/jets/job/base.rb +1 -1
  31. data/lib/jets/rack_server.rb +1 -1
  32. data/lib/jets/resource.rb +4 -4
  33. data/lib/jets/resource/api_gateway/method.rb +3 -1
  34. data/lib/jets/resource/api_gateway/method/authorization.rb +9 -0
  35. data/lib/jets/resource/api_gateway/resource.rb +2 -2
  36. data/lib/jets/resource/lambda/function.rb +3 -3
  37. data/lib/jets/router.rb +10 -10
  38. data/lib/jets/router/route/authorizer.rb +4 -0
  39. data/lib/jets/turbo/rails.rb +1 -1
  40. data/lib/jets/turbo/templates/config/database.yml +4 -0
  41. data/lib/jets/version.rb +1 -1
  42. metadata +4 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 14f4e12068a48f8ff8d9114f69f9b01da482d89c78a4f7027a42c4c33995de93
4
- data.tar.gz: 2a078028215d546115310857ec3c37ec629b0be726182e4c6a4f1d6ddd2f9dd2
3
+ metadata.gz: 570f01c2fe2cff82700a1c8110b340a6897381d61fa5248f118b785fe399cefe
4
+ data.tar.gz: 64ad72c3d50974e7e816e5647dbcd3f5e26277144ab409b867e7f7ccc58e166e
5
5
  SHA512:
6
- metadata.gz: ae698eaaba985b224cb01b43e2ac90015ae5e7a5fd1eaf4a4c9a97e76303b9fc700fe3e251843bc7fb6c209a94c51f7a07743a98203bdb27e79c6dc19c18c026
7
- data.tar.gz: 40142abe6a735a848f1931fa1f044f5964191b1c0326cce0b00d3850b05023ab238b97b5c793d13e7c7b78bf5e4e3a1baa747f0fb233c7fd5f4e3535c9207e44
6
+ metadata.gz: 10c4489b8c063d2a3e94f63b9ebb0fda617a31f41bc92dcd77a32755307fef81930ba1359a3364f13baf8a3ea746234019343b7621bdf2ff27c6b86076fa473e
7
+ data.tar.gz: 76bf5d77ab7f8b3064174aea1baea7eac92a787d217fb8a91c431132da9fba95ef342a6f8f145f2174c74cb6f4a914c5ba74ce8a6c06c5984528fdee0ce86c24
@@ -10,12 +10,3 @@
10
10
  git config --global user.email "tongueroo@gmail.com"
11
11
  git config --global user.name "Tung Nguyen"
12
12
 
13
- set +u # cb start will not have CODEBUILD_WEBHOOK_TRIGGER set
14
- if [ -n "$CODEBUILD_WEBHOOK_TRIGGER" ]; then # git push
15
- BRANCH=$(echo $CODEBUILD_WEBHOOK_TRIGGER | sed "s/.*\///")
16
- elif [ -n "$CODEBUILD_SOURCE_VERSION" ]; then # cb start
17
- BRANCH=$CODEBUILD_SOURCE_VERSION # contains the actual branch
18
- else
19
- BRANCH=UNKNOWN-BRANCH
20
- fi
21
- git checkout $BRANCH
@@ -1 +1 @@
1
- 2.5.6
1
+ 2.5.7
@@ -3,6 +3,47 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/).
5
5
 
6
+ ## [2.3.17]
7
+ - #472 Docs: Update cors-support.md
8
+ - #475 Docs: Update activerecord.md to include db:create step
9
+ - #476 Docs: Update authorizer-cognito.md
10
+ - #482 Docs: Fixed description for "jetpacker" gem in Gemfile
11
+ - #483 Docs: controllers Fix minor typo
12
+ - #489 Docs: call typo
13
+ - #490 Docs: authorizers typo
14
+ - #504 Docs: tutorial series
15
+ - #505 Docs: display more tutorial articles
16
+ - #509 Docs: Update lamdba permissions for minimal-iam-policy doc
17
+ - #512 Bug fix: fix on_lambda? check allow testing #512
18
+
19
+ ## [2.3.16]
20
+ - #466 fix application_config typo
21
+ - #467 Handle forbidden error from s3
22
+ - #468 authorization_scopes
23
+ - #469 Fixed typo from STMP to SMTP
24
+ - #470 remove json dependency
25
+ - #471 use `Bundler.with_unbundled_env` remove bundler deprecation
26
+
27
+ ## [2.3.15]
28
+ - #461 fix guesser lookup for long function names
29
+
30
+ ## [2.3.14]
31
+ - #432 filtered_parameters support
32
+ - #447 improve nested routes support. order routes so that nested resources always work
33
+ - #451 Fix Jets turbo DB encoding
34
+ - #452 Print Cfn templates location after build
35
+ - #458 update webpacker fork with jetpacker gem
36
+ - #459 fix afterburner mode
37
+
38
+ ## [2.3.13]
39
+ - #430 Remove out-of-date note about FIFO Queue
40
+ - #433 Fixed ApiResources with long names not included in the main CloudFormation template
41
+ - #435 fix typo SMTP
42
+ - #437 Ignore *.local files when JETS_ENV_REMOTE=1
43
+ - #438 Forcing sort of initializers
44
+ - #446 temp fix for actionmailer turbine initializer
45
+ - update to ruby 2.5.7
46
+
6
47
  ## [2.3.12]
7
48
  - #421 use underscore for database name in database.yml
8
49
  - #422 url_for: allow any activemodel compatiable object to work
data/Gemfile CHANGED
@@ -9,6 +9,6 @@ gemspec
9
9
  group :development, :test do
10
10
  gem "mysql2", "~> 0.5.2"
11
11
  gem "dynomite"
12
- gem "webpacker", git: "https://github.com/tongueroo/webpacker.git", branch: "jets"
12
+ gem "jetpacker"
13
13
  gem "rspec_junit_formatter"
14
14
  end
@@ -50,7 +50,6 @@ Gem::Specification.new do |spec|
50
50
  spec.add_dependency "hashie"
51
51
  spec.add_dependency "jets-gems"
52
52
  spec.add_dependency "jets-html-sanitizer"
53
- spec.add_dependency "json"
54
53
  spec.add_dependency "kramdown"
55
54
  spec.add_dependency "memoist"
56
55
  spec.add_dependency "mimemagic"
@@ -18,6 +18,8 @@ $:.unshift("#{gem_root}/lib")
18
18
  $:.unshift("#{gem_root}/vendor/cfn-status/lib")
19
19
  require "cfn_status"
20
20
 
21
+ require "jets/core_ext/bundler"
22
+
21
23
  require "jets/autoloaders"
22
24
  Jets::Autoloaders.log! if ENV["JETS_AUTOLOAD_LOG"]
23
25
  Jets::Autoloaders.once.setup
@@ -149,6 +149,7 @@ class Jets::Application
149
149
 
150
150
  config.controllers = ActiveSupport::OrderedOptions.new
151
151
  config.controllers.default_protect_from_forgery = nil
152
+ config.controllers.filtered_parameters = []
152
153
 
153
154
  config.deploy = ActiveSupport::OrderedOptions.new
154
155
  config.deploy.stagger = ActiveSupport::OrderedOptions.new
@@ -120,7 +120,7 @@ class Jets::Booter
120
120
 
121
121
  # All Turbines
122
122
  def app_initializers
123
- Dir.glob("#{Jets.root}/config/initializers/**/*").each do |path|
123
+ Dir.glob("#{Jets.root}/config/initializers/**/*").sort.each do |path|
124
124
  load path
125
125
  end
126
126
  end
@@ -82,7 +82,7 @@ module Jets::Builders
82
82
  begin
83
83
  s3.head_object(bucket: s3_bucket, key: s3_key)
84
84
  true
85
- rescue Aws::S3::Errors::NotFound
85
+ rescue Aws::S3::Errors::NotFound, Aws::S3::Errors::Forbidden
86
86
  false
87
87
  end
88
88
  end
@@ -99,8 +99,17 @@ module Jets::Builders
99
99
 
100
100
  # Code prep and zipping
101
101
  check_code_size!
102
- generate_shims
103
- calculate_md5s # must be called before create_zip_files because checksums need to be populated
102
+ calculate_md5s # must be called before create_zip_files and generate_shims because checksums need to be populated
103
+ # generate_shims and create_zip_files use checksums
104
+ #
105
+ # Notes:
106
+ #
107
+ # Had moved calculate_md5s to fix a what thought was a subtle issue https://github.com/tongueroo/jets/pull/424
108
+ # But am unsure about that the fix now. This essentially reverts that issue.
109
+ #
110
+ # Fix in https://github.com/tongueroo/jets/pull/459
111
+ #
112
+ generate_shims # the generated handlers/data.yml has rack_zip key
104
113
  create_zip_files
105
114
  end
106
115
 
@@ -211,7 +220,7 @@ module Jets::Builders
211
220
  # Checking this way because when using jets standalone for Afterburner mode we don't want to run into
212
221
  # bundler gem collisions. TODO: figure out the a better way to handle the collisions.
213
222
  lines = IO.readlines("#{Jets.root}/Gemfile")
214
- lines.detect { |l| l =~ /webpacker/ }
223
+ lines.detect { |l| l =~ /webpacker/ || l =~ /jetpacker/ }
215
224
  end
216
225
 
217
226
  # This happens in the current app directory not the tmp code for simplicity
@@ -226,7 +235,7 @@ module Jets::Builders
226
235
 
227
236
  # Need to capture JETS_ROOT since can be changed by Turbo mode
228
237
  jets_root = Jets.root
229
- Bundler.with_clean_env do
238
+ Bundler.with_unbundled_env do
230
239
  # Switch gemfile for Afterburner mode
231
240
  gemfile = ENV['BUNDLE_GEMFILE']
232
241
  ENV['BUNDLE_GEMFILE'] = "#{jets_root}/rack/Gemfile"
@@ -6,7 +6,9 @@ module Jets::Builders
6
6
  end
7
7
 
8
8
  def run
9
- check = Jets::Gems::Check.new
9
+ # use_gemspec to resolve http-parser gem issue
10
+ use_gemspec = !Jets::Turbo.afterburner? # gemspec approach breaks afterburner mode
11
+ check = Jets::Gems::Check.new(use_gemspec: use_gemspec)
10
12
  if Jets.config.lambda.layers.empty?
11
13
  found_gems = check.run! # exits early if missing gems found
12
14
  else
@@ -59,7 +59,7 @@ module Jets::Builders
59
59
 
60
60
  FileUtils.rm_rf("#{cache_area}/.bundle")
61
61
  require "bundler" # dynamically require bundler so user can use any bundler
62
- Bundler.with_clean_env do
62
+ Bundler.with_unbundled_env do
63
63
  sh(
64
64
  "cd #{cache_area} && " \
65
65
  "env bundle install --path #{cache_area}/vendor/gems --without development test"
@@ -32,6 +32,7 @@ module Jets::Commands
32
32
  clean_templates
33
33
  build_minimal_template
34
34
  build_all_templates if full?
35
+ puts "Generated CloudFormation templates at #{Jets.build_root}/templates"
35
36
  end
36
37
 
37
38
  def full?
@@ -140,7 +140,7 @@ class Jets::Commands::Call
140
140
  puts "Pro tip: The Lambda Console Link to the #{function_name} function has been added to your clipboard." unless @options[:mute]
141
141
  end
142
142
 
143
- # TODO: Hook client_context up and maek sure it works. Think I've figure out how to sign client_context below.
143
+ # TODO: Hook client_context up and make sure it works. Think I've figure out how to sign client_context below.
144
144
  # Client context must be a valid Base64-encoded JSON object
145
145
  # Example: http://docs.aws.amazon.com/mobileanalytics/latest/ug/PutEvents.html
146
146
  def client_context
@@ -36,9 +36,11 @@ class Jets::Commands::Call
36
36
  def generated_function_name(function_name)
37
37
  if function_name.size > Jets::MAX_FUNCTION_NAME_SIZE # name generated by CloudFormation
38
38
  logical_id = @class_name.gsub('::','')
39
- app_stack_arn = lookup(parent_stack[:outputs], logical_id)
40
39
 
41
- resources = stack_resources(app_stack_arn)
40
+ parent_resources = stack_resources(parent_stack.stack_id)
41
+ app_stack = parent_resources.find { |s| s.logical_resource_id == logical_id }
42
+
43
+ resources = stack_resources(app_stack.physical_resource_id)
42
44
  resource = resources.find { |r| r.logical_resource_id == method_name.camelize + "LambdaFunction" } # method_name only contains the method
43
45
  resource.physical_resource_id # actual function name
44
46
  else
@@ -3,7 +3,7 @@ module Jets::Commands
3
3
  desc "check", "Check if pre-built Lambda gems are available from the sources"
4
4
  long_desc Help.text("gems:check")
5
5
  def check
6
- check = Jets::Gems::Check.new(cli: true)
6
+ check = Jets::Gems::Check.new
7
7
  check.run! # exits early if missing gems found
8
8
  # If reach here, means all gems are ok.
9
9
  puts "Congrats! All gems are available in as pre-built Lambda gems 👍"
@@ -41,7 +41,7 @@ class Jets::Commands::Import
41
41
  end
42
42
 
43
43
  def bundle_install
44
- Bundler.with_clean_env do
44
+ Bundler.with_unbundled_env do
45
45
  run "cd rack && bundle install"
46
46
  end
47
47
  end
@@ -43,7 +43,7 @@ module Jets::Commands
43
43
  puts Jets::Booter.message
44
44
  Jets::Booter.check_config_ru!
45
45
  Jets::RackServer.start(options) unless ENV['JETS_RACK'] == '0' # rack server runs in background by default
46
- Bundler.with_clean_env do
46
+ Bundler.with_unbundled_env do
47
47
  system(command)
48
48
  end
49
49
  end
@@ -61,7 +61,7 @@ module Jets::Commands
61
61
  end
62
62
 
63
63
  def bundle_install
64
- Bundler.with_clean_env do
64
+ Bundler.with_unbundled_env do
65
65
  system("BUNDLE_IGNORE_CONFIG=1 bundle install")
66
66
  end
67
67
  end
@@ -27,6 +27,7 @@ class Jets::Commands::RakeTasks
27
27
  def load_webpacker_tasks
28
28
  begin
29
29
  require "webpacker"
30
+ require "webpacker/rake_tasks"
30
31
  rescue LoadError
31
32
  # puts "WARN: unable to load gem. #{$!}. Running with 'bundle exec' might fix this warning."
32
33
  # Happens whne user calls jets help outside the jets project folder.
@@ -3,8 +3,8 @@ source "https://rubygems.org"
3
3
  gem "jets"
4
4
 
5
5
  <% if @webpacker -%>
6
- # Include webpacker if you are you are building html pages
7
- gem "webpacker", git: "https://github.com/tongueroo/webpacker.git", branch: "jets"
6
+ # Include jetpacker if you are building html pages
7
+ gem "jetpacker"
8
8
  <% end -%>
9
9
  <% if @database == 'postgresql' %>
10
10
  # Include pg gem if you are using ActiveRecord, remove next line
@@ -1,5 +1,5 @@
1
1
  /* eslint no-console:0 */
2
- // This file is automatically compiled by Webpack and Jets, along with any other files
2
+ // This file is automatically compiled by Webpack, along with any other files
3
3
  // present in this directory. You're encouraged to place your actual application logic in
4
4
  // a relevant structure within app/javascript and only use these pack files to reference
5
5
  // that code so it'll be compiled.
@@ -7,6 +7,14 @@
7
7
  // To reference this file, add <%%= javascript_pack_tag 'application' %> to the appropriate
8
8
  // layout file, like app/views/layouts/application.html.erb
9
9
 
10
+
11
+ // Uncomment to copy all static images under ../images to the output folder and reference
12
+ // them with the image_pack_tag helper in views (e.g <%%= image_pack_tag 'rails.png' %>)
13
+ // or the `imagePath` JavaScript helper below.
14
+ //
15
+ // const images = require.context('../images', true)
16
+ // const imagePath = (name) => images(name, true)
17
+
10
18
  <% if @bootstrap -%>
11
19
  import 'bootstrap/dist/js/bootstrap';
12
20
  <% end -%>
@@ -6,7 +6,8 @@ class Jets::Controller
6
6
  class_attribute :auth_type,
7
7
  :auth_to,
8
8
  :auth_options, # for only and except filters
9
- :api_key_needed
9
+ :api_key_needed,
10
+ :authorization_scopes_value
10
11
  end
11
12
 
12
13
  class_methods do
@@ -31,6 +32,14 @@ class Jets::Controller
31
32
  end
32
33
  end
33
34
 
35
+ def authorization_scopes(value=nil)
36
+ if !value.nil?
37
+ self.authorization_scopes_value = value
38
+ else
39
+ self.authorization_scopes_value
40
+ end
41
+ end
42
+
34
43
  def authorizer_metadata
35
44
  Jets::Router::Route::Authorizer.metadata(auth_to)
36
45
  end
@@ -100,14 +100,27 @@ class Jets::Controller
100
100
  end
101
101
 
102
102
  def log_info_start
103
- display_event = @event.dup
104
- display_event['body'] = '[BASE64_ENCODED]' if @event['isBase64Encoded']
105
103
  # JSON.dump makes logging look pretty in CloudWatch logs because it keeps it on 1 line
104
+
106
105
  ip = request.ip
107
106
  Jets.logger.info "Started #{@event['httpMethod']} \"#{@event['path']}\" for #{ip} at #{Time.now}"
108
107
  Jets.logger.info "Processing #{self.class.name}##{@meth}"
109
- Jets.logger.info " Event: #{json_dump(display_event)}"
110
- Jets.logger.info " Parameters: #{JSON.dump(params(raw: true).to_h)}"
108
+ Jets.logger.info " Event: #{event_log}"
109
+ Jets.logger.info " Parameters: #{JSON.dump(filtered_parameters.to_h)}"
110
+ end
111
+
112
+ def event_log
113
+ display_event = @event.dup
114
+
115
+ if @event['isBase64Encoded']
116
+ display_event['body'] = '[BASE64_ENCODED]'
117
+ else
118
+ display_event['body'] = parameter_filter.filter_json(display_event['body'])
119
+ end
120
+
121
+ display_event["queryStringParameters"] = parameter_filter.filter(display_event['queryStringParameters'])
122
+ display_event["pathParameters"] = parameter_filter.filter(display_event['pathParameters'])
123
+ json_dump(display_event)
111
124
  end
112
125
 
113
126
  # Handles binary data safely
@@ -0,0 +1,29 @@
1
+ require "active_support/parameter_filter"
2
+
3
+ class Jets::Controller
4
+ class ParametersFilter
5
+ attr_reader :filters, :params_filter
6
+
7
+ def initialize(filters)
8
+ @filters = filters
9
+ @params_filter = ActiveSupport::ParameterFilter.new(filters)
10
+ end
11
+
12
+ def filter(params)
13
+ params && params_filter.filter(params)
14
+ end
15
+
16
+ def filter_json(json_text)
17
+ return json_text if filters.blank? || json_text.blank?
18
+
19
+ begin
20
+ hash_params = JSON.parse(json_text)
21
+ filtered_params = filter(hash_params)
22
+ JSON.dump(filtered_params)
23
+ rescue JSON::ParserError
24
+ String.new
25
+ end
26
+ end
27
+
28
+ end
29
+ end
@@ -29,6 +29,10 @@ class Jets::Controller
29
29
  end
30
30
  end
31
31
 
32
+ def filtered_parameters(**kwargs)
33
+ parameter_filter.filter params(**kwargs, raw: true) # Always filter raw hash
34
+ end
35
+
32
36
  def query_parameters
33
37
  event["queryStringParameters"] || {}
34
38
  end
@@ -83,5 +87,9 @@ class Jets::Controller
83
87
  return nil if body.nil?
84
88
  Base64.decode64(body)
85
89
  end
90
+
91
+ def parameter_filter
92
+ @parameter_filter ||= ParametersFilter.new Jets.config.controllers.filtered_parameters
93
+ end
86
94
  end
87
95
  end
@@ -0,0 +1,7 @@
1
+ # Bundler 2.0 does yet not have with_unbundled_env
2
+ # Bundler 2.1 deprecates with_unbundled_env for with_unbundled_env
3
+
4
+ require "bundler"
5
+ def Bundler.with_unbundled_env(&block)
6
+ with_clean_env(&block)
7
+ end unless Bundler.respond_to?(:with_unbundled_env)
@@ -22,18 +22,18 @@ class Jets::Dotenv
22
22
  # dotenv files with the following precedence:
23
23
  #
24
24
  # - .env.development.jets_env_extra (highest)
25
- # - .env.development.remote (2nd highest)
26
- # - .env.development.local
25
+ # - .env.development.remote (2nd highest, only if JETS_ENV_REMOTE=1)
26
+ # - .env.development.local (unless JETS_ENV_REMOTE=1)
27
27
  # - .env.development
28
- # - .env.local - This file is loaded for all environments _except_ `test`.
28
+ # - .env.local - This file is loaded for all environments _except_ `test` or unless JETS_ENV_REMOTE=1
29
29
  # - .env - The original (lowest)
30
30
  #
31
31
  def dotenv_files
32
32
  files = [
33
33
  root.join(".env"),
34
- (root.join(".env.local") unless Jets.env.test?),
34
+ (root.join(".env.local") unless (Jets.env.test? || @remote)),
35
35
  root.join(".env.#{Jets.env}"),
36
- root.join(".env.#{Jets.env}.local"),
36
+ (root.join(".env.#{Jets.env}.local") unless @remote),
37
37
  ]
38
38
  files << root.join(".env.#{Jets.env}.remote") if @remote
39
39
  if ENV["JETS_ENV_EXTRA"]
@@ -8,6 +8,7 @@ module Jets
8
8
  end
9
9
 
10
10
  initializer "action_mailer.set_configs" do |app|
11
+ app.config.action_mailer ||= ActiveSupport::OrderedOptions.new # TODO: temp fix. only happens sometimes?
11
12
  options = app.config.action_mailer
12
13
  options.default_url_options ||= {}
13
14
  options.default_url_options[:protocol] ||= "https"
@@ -42,7 +42,7 @@ module Jets::Job
42
42
 
43
43
  private
44
44
  def on_lambda?
45
- !!ENV['AWS_LAMBDA_FUNCTION_NAME'] || Jets.env.test?
45
+ !!ENV['AWS_LAMBDA_FUNCTION_NAME']
46
46
  end
47
47
  end
48
48
  end
@@ -34,7 +34,7 @@ module Jets
34
34
  def serve
35
35
  # Note, looks like stopping jets server with Ctrl-C sends the TERM signal
36
36
  # down to the sub bin/rackup command cleans up the child process fine.
37
- Bundler.with_clean_env do
37
+ Bundler.with_unbundled_env do
38
38
  args = ''
39
39
  # only forward the host option, port is always 9292 for simplicity
40
40
  if @options[:host]
@@ -26,14 +26,14 @@ class Jets::Resource
26
26
  Jets::Resource.truncate_id(id)
27
27
  end
28
28
 
29
- def self.truncate_id(id)
29
+ def self.truncate_id(id, postfix = '')
30
30
  # Api Gateway resource name has a limit of 64 characters.
31
31
  # Yet it throws not found when ID is longer than 62 characters and I don't know why.
32
32
  # To keep it safe, let's stick to the 62 characters limit.
33
- if id.size > 62
34
- "#{id[0..55]}#{Digest::MD5.hexdigest(id)[0..5]}"
33
+ if id.size + postfix.size > 62
34
+ "#{id[0..(55 - postfix.size)]}#{Digest::MD5.hexdigest(id)[0..5]}#{postfix}"
35
35
  else
36
- id
36
+ "#{id}#{postfix}"
37
37
  end
38
38
  end
39
39
 
@@ -36,6 +36,8 @@ module Jets::Resource::ApiGateway
36
36
  method_responses: []
37
37
  }
38
38
  props[:authorizer_id] = authorizer_id if authorizer_id
39
+ props[:authorization_scopes] = authorization_scopes if authorization_scopes
40
+
39
41
  props
40
42
  end
41
43
 
@@ -83,7 +85,7 @@ module Jets::Resource::ApiGateway
83
85
  def resource_id
84
86
  @route.path == '' ?
85
87
  "RootResourceId" :
86
- Jets::Resource.truncate_id("#{resource_logical_id.camelize}ApiResource")
88
+ Jets::Resource.truncate_id(resource_logical_id.camelize, "ApiResource")
87
89
  end
88
90
 
89
91
  # Example: Posts
@@ -28,5 +28,14 @@ class Jets::Resource::ApiGateway::Method
28
28
  controller_klass.api_key_required ||
29
29
  Jets.config.api.api_key_required
30
30
  end
31
+
32
+ def authorization_scopes
33
+ if @route.authorization_scopes
34
+ authorization_scopes = @route.authorization_scopes
35
+ elsif controller_klass.authorization_scopes
36
+ authorization_scopes = controller_klass.authorization_scopes
37
+ end
38
+ authorization_scopes
39
+ end
31
40
  end
32
41
  end
@@ -28,7 +28,7 @@ module Jets::Resource::ApiGateway
28
28
  if @path == ''
29
29
  "RootResourceId"
30
30
  else
31
- Jets::Resource.truncate_id "#{path_logical_id(@path)}ApiResource"
31
+ Jets::Resource.truncate_id path_logical_id(@path), "ApiResource"
32
32
  end
33
33
  end
34
34
 
@@ -41,7 +41,7 @@ module Jets::Resource::ApiGateway
41
41
  if @path.include?('/') # posts/:id or posts/:id/edit
42
42
  parent_path = @path.split('/')[0..-2].join('/')
43
43
  parent_logical_id = path_logical_id(parent_path)
44
- Jets::Resource.truncate_id("#{parent_logical_id}ApiResource")
44
+ Jets::Resource.truncate_id(parent_logical_id, "ApiResource")
45
45
  else
46
46
  "RootResourceId"
47
47
  end
@@ -52,8 +52,8 @@ module Jets::Resource::Lambda
52
52
  environment: { variables: environment },
53
53
  }
54
54
 
55
- appplication_config = Jets.application.config.function.to_h
56
- baseline.merge(appplication_config)
55
+ application_config = Jets.application.config.function.to_h
56
+ baseline.merge(application_config)
57
57
  end
58
58
 
59
59
  # Class properties example:
@@ -211,4 +211,4 @@ module Jets::Resource::Lambda
211
211
  "#{@app_class}##{@task.meth}"
212
212
  end
213
213
  end
214
- end
214
+ end
@@ -93,18 +93,18 @@ module Jets
93
93
  # Useful for RouterMatcher
94
94
  #
95
95
  # Precedence:
96
- # 1. Routes with no captures get highest precedence: posts/new
97
- # 2. Then consider the routes with captures: post/:id
98
- # 3. Last consider the routes with wildcards: *catchall
96
+ # Routes with wildcards are considered after routes without wildcards
99
97
  #
100
- # Within these 2 groups we consider the routes with the longest path first
101
- # since posts/:id and posts/:id/edit can both match.
98
+ # Routes with fewer captures are ordered first since both
99
+ # /posts/:post_id/comments/new and /posts/:post_id/comments/:id are equally
100
+ # long
101
+ #
102
+ # Routes with the same amount of captures and wildcards are orderd so that
103
+ # the longest path is considered first since posts/:id and posts/:id/edit
104
+ # can both match.
102
105
  def ordered_routes
103
- length = Proc.new { |r| r.path.length * -1 }
104
- capture_routes = routes.select { |r| r.path.include?(':') }.sort_by(&length)
105
- wildcard_routes = routes.select { |r| r.path.include?('*') }.sort_by(&length)
106
- simple_routes = (routes - capture_routes - wildcard_routes).sort_by(&length)
107
- simple_routes + capture_routes + wildcard_routes
106
+ length = Proc.new { |r| [r.path.count("*"), r.path.count(":"), r.path.length * -1] }
107
+ routes.sort_by(&length)
108
108
  end
109
109
 
110
110
  class << self
@@ -16,6 +16,10 @@ class Jets::Router::Route
16
16
  @options[:authorizer]
17
17
  end
18
18
 
19
+ def authorization_scopes
20
+ @options[:authorization_scopes]
21
+ end
22
+
19
23
  def authorization_type
20
24
  @options[:authorization_type] || inferred_authorization_type
21
25
  end
@@ -110,7 +110,7 @@ class Jets::Turbo
110
110
  # TODO: remove duplication, copied from jets/commands/import/base.rb
111
111
  # And modified it slightly
112
112
  def bundle_install
113
- Bundler.with_clean_env do
113
+ Bundler.with_unbundled_env do
114
114
  sh "cd #{build_area}/#{@project_folder}/rack && bundle install"
115
115
  end
116
116
  end
@@ -1,6 +1,10 @@
1
1
  default: &default
2
2
  adapter: <%= @adapter %>
3
+ <% if @adapter == 'postgresql' -%>
4
+ encoding: unicode
5
+ <% else -%>
3
6
  encoding: utf8mb4
7
+ <% end -%>
4
8
  pool: <%%= ENV["DB_POOL"] || 5 %>
5
9
  database: <%%= ENV['DB_NAME'] || '<%= @database_development %>' %>
6
10
  <% if @adapter == 'postgresql' -%>
@@ -1,3 +1,3 @@
1
1
  module Jets
2
- VERSION = "2.3.12"
2
+ VERSION = "2.3.17"
3
3
  end
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: 2.3.12
4
+ version: 2.3.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-01-19 00:00:00.000000000 Z
11
+ date: 2020-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionmailer
@@ -332,20 +332,6 @@ dependencies:
332
332
  - - ">="
333
333
  - !ruby/object:Gem::Version
334
334
  version: '0'
335
- - !ruby/object:Gem::Dependency
336
- name: json
337
- requirement: !ruby/object:Gem::Requirement
338
- requirements:
339
- - - ">="
340
- - !ruby/object:Gem::Version
341
- version: '0'
342
- type: :runtime
343
- prerelease: false
344
- version_requirements: !ruby/object:Gem::Requirement
345
- requirements:
346
- - - ">="
347
- - !ruby/object:Gem::Version
348
- version: '0'
349
335
  - !ruby/object:Gem::Dependency
350
336
  name: kramdown
351
337
  requirement: !ruby/object:Gem::Requirement
@@ -786,6 +772,7 @@ files:
786
772
  - lib/jets/controller/middleware/main.rb
787
773
  - lib/jets/controller/middleware/reloader.rb
788
774
  - lib/jets/controller/middleware/webpacker_setup.rb
775
+ - lib/jets/controller/parameters_filter.rb
789
776
  - lib/jets/controller/params.rb
790
777
  - lib/jets/controller/rack/adapter.rb
791
778
  - lib/jets/controller/rack/env.rb
@@ -796,6 +783,7 @@ files:
796
783
  - lib/jets/controller/response.rb
797
784
  - lib/jets/controller/stage.rb
798
785
  - lib/jets/core.rb
786
+ - lib/jets/core_ext/bundler.rb
799
787
  - lib/jets/core_ext/kernel.rb
800
788
  - lib/jets/db.rb
801
789
  - lib/jets/dotenv.rb