jets 2.3.13 → 2.3.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +37 -0
  3. data/Gemfile +1 -1
  4. data/backers.md +1 -0
  5. data/jets.gemspec +1 -1
  6. data/lib/jets.rb +2 -0
  7. data/lib/jets/application/defaults.rb +1 -0
  8. data/lib/jets/builders/code_builder.rb +14 -5
  9. data/lib/jets/builders/gem_replacer.rb +3 -1
  10. data/lib/jets/builders/ruby_packager.rb +1 -1
  11. data/lib/jets/cfn/upload.rb +18 -2
  12. data/lib/jets/commands/build.rb +1 -0
  13. data/lib/jets/commands/call.rb +1 -1
  14. data/lib/jets/commands/call/base_guesser.rb +4 -2
  15. data/lib/jets/commands/gems.rb +1 -1
  16. data/lib/jets/commands/import/base.rb +1 -1
  17. data/lib/jets/commands/main.rb +1 -1
  18. data/lib/jets/commands/new.rb +1 -1
  19. data/lib/jets/commands/rake_tasks.rb +1 -0
  20. data/lib/jets/commands/templates/skeleton/Gemfile.tt +2 -2
  21. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +9 -1
  22. data/lib/jets/controller/authorization.rb +10 -1
  23. data/lib/jets/controller/base.rb +17 -4
  24. data/lib/jets/controller/parameters_filter.rb +29 -0
  25. data/lib/jets/controller/params.rb +8 -0
  26. data/lib/jets/core_ext/bundler.rb +7 -0
  27. data/lib/jets/job/base.rb +1 -1
  28. data/lib/jets/rack_server.rb +1 -1
  29. data/lib/jets/resource/api_gateway/method.rb +3 -1
  30. data/lib/jets/resource/api_gateway/method/authorization.rb +9 -0
  31. data/lib/jets/resource/api_gateway/resource.rb +1 -1
  32. data/lib/jets/resource/lambda/function.rb +3 -3
  33. data/lib/jets/router.rb +10 -10
  34. data/lib/jets/router/route/authorizer.rb +4 -0
  35. data/lib/jets/spec_helpers/controllers/request.rb +1 -1
  36. data/lib/jets/turbo/rails.rb +1 -1
  37. data/lib/jets/turbo/templates/config/database.yml +4 -0
  38. data/lib/jets/version.rb +1 -1
  39. metadata +19 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1c15ea91434727519b1531096940a485671580c71718567d2f2789d49b52919
4
- data.tar.gz: 16b9fad79824140e0733c9753093d8e0ba969d6f8658cc0a2d846953cbbda3db
3
+ metadata.gz: 268e0ae0a8ea29568f0fc6bd1c5766be51ce75707d38aa91b2e297a4e3290c06
4
+ data.tar.gz: '05185b74c8cf470526dc50284074405acb63e9dfa351abddd465d3863485215b'
5
5
  SHA512:
6
- metadata.gz: f51fcf5b4ddb7bcfd2423556c6bb6871471ae487dc83a5ed080896276236dfedc8785e310e6862659f54dce8a61decb8baedf3f61b62c65f0bf79438d86d6ac1
7
- data.tar.gz: 9d4c6f4924acc0c62ea93265a94d1acc68436b5a41c9e9d1ae56c0b3325542f5a947b6b294ae88d6c7b17089aeab834ff675a1d60601b3365f7e282ae66e0526
6
+ metadata.gz: fc2abade16acc08eb2107d8ae4547c2f33b0e46c803a8f8231af4d8e236bc985d8f0bea8c8a335c39baf324fba9725f9c30c2377ac96fca53ae12067f1a6737a
7
+ data.tar.gz: 384865807f6d9154fdffa82a0cd165d9bb6c6d8bc5d9e6b3a505ced37586e9d7f382caeb0ae95f483005029f4b71ddbf606312eb0b6211cd834a4427c186a013
@@ -3,6 +3,43 @@
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.18]
7
+ - #514 Allow to define route that contains dot
8
+ - #515 set content type on upload by using extension so cloudfront will compress when serving
9
+ - #517 support nested query params in tests
10
+
11
+ ## [2.3.17]
12
+ - #472 Docs: Update cors-support.md
13
+ - #475 Docs: Update activerecord.md to include db:create step
14
+ - #476 Docs: Update authorizer-cognito.md
15
+ - #482 Docs: Fixed description for "jetpacker" gem in Gemfile
16
+ - #483 Docs: controllers Fix minor typo
17
+ - #489 Docs: call typo
18
+ - #490 Docs: authorizers typo
19
+ - #504 Docs: tutorial series
20
+ - #505 Docs: display more tutorial articles
21
+ - #509 Docs: Update lamdba permissions for minimal-iam-policy doc
22
+ - #512 Bug fix: fix on_lambda? check allow testing #512
23
+
24
+ ## [2.3.16]
25
+ - #466 fix application_config typo
26
+ - #467 Handle forbidden error from s3
27
+ - #468 authorization_scopes
28
+ - #469 Fixed typo from STMP to SMTP
29
+ - #470 remove json dependency
30
+ - #471 use `Bundler.with_unbundled_env` remove bundler deprecation
31
+
32
+ ## [2.3.15]
33
+ - #461 fix guesser lookup for long function names
34
+
35
+ ## [2.3.14]
36
+ - #432 filtered_parameters support
37
+ - #447 improve nested routes support. order routes so that nested resources always work
38
+ - #451 Fix Jets turbo DB encoding
39
+ - #452 Print Cfn templates location after build
40
+ - #458 update webpacker fork with jetpacker gem
41
+ - #459 fix afterburner mode
42
+
6
43
  ## [2.3.13]
7
44
  - #430 Remove out-of-date note about FIFO Queue
8
45
  - #433 Fixed ApiResources with long names not included in the main CloudFormation template
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
data/backers.md CHANGED
@@ -15,4 +15,5 @@ Funds donated via Patreon go directly to support Tung Nguyen's full-time work on
15
15
  - Nate Clark
16
16
  - Hirokatsu Endo
17
17
  - Michael Choi
18
+ - Phan Lam
18
19
  <!--10 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"
@@ -67,4 +66,5 @@ Gem::Specification.new do |spec|
67
66
  spec.add_development_dependency "bundler"
68
67
  spec.add_development_dependency "rake"
69
68
  spec.add_development_dependency "rspec"
69
+ spec.add_development_dependency "cfn-status"
70
70
  end
@@ -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
@@ -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"
@@ -7,6 +7,13 @@ module Jets::Cfn
7
7
  include ActionView::Helpers::NumberHelper # number_to_human_size
8
8
 
9
9
  attr_reader :bucket_name
10
+
11
+ CONTENT_TYPES_BY_EXTENSION = {
12
+ '.css' => 'text/css',
13
+ '.js' => 'application/javascript',
14
+ '.html' => 'text/html'
15
+ }
16
+
10
17
  def initialize(bucket_name)
11
18
  @bucket_name = bucket_name
12
19
  end
@@ -90,8 +97,17 @@ module Jets::Cfn
90
97
 
91
98
  key = s3_key(full_path)
92
99
  obj = s3_resource.bucket(bucket_name).object(key)
93
- puts "Uploading s3://#{bucket_name}/#{key}" # uncomment to see and debug
94
- obj.upload_file(full_path, acl: "public-read", cache_control: cache_control)
100
+ puts "Uploading and setting content type for s3://#{bucket_name}/#{key}" # uncomment to see and debug
101
+ obj.upload_file(full_path, { acl: "public-read", cache_control: cache_control }.merge(content_type_headers(full_path)))
102
+ end
103
+
104
+ def content_type_headers(full_path)
105
+ content_type = CONTENT_TYPES_BY_EXTENSION[File.extname(full_path)]
106
+ if content_type
107
+ { content_type: content_type }
108
+ else
109
+ {}
110
+ end
95
111
  end
96
112
 
97
113
  def s3_key(full_path)
@@ -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)
@@ -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]
@@ -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
 
@@ -94,7 +96,7 @@ module Jets::Resource::ApiGateway
94
96
  def camelized_path
95
97
  path = @route.path
96
98
  path = "homepage" if path == ''
97
- path.gsub('/','_').gsub(':','').gsub('*','').camelize
99
+ path.gsub('/','_').gsub(':','').gsub('*','').gsub('.','').camelize
98
100
  end
99
101
  end
100
102
  end
@@ -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
@@ -76,7 +76,7 @@ module Jets::Resource::ApiGateway
76
76
  private
77
77
  # Similar path_logical_id method in resource/route.rb
78
78
  def path_logical_id(path)
79
- path.gsub('/','_').gsub(':','').gsub('*','').gsub('-','_').camelize
79
+ path.gsub('/','_').gsub(':','').gsub('*','').gsub('-','_').gsub('.','_').camelize
80
80
  end
81
81
  end
82
82
  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
@@ -46,7 +46,7 @@ module Jets::SpecHelpers::Controllers
46
46
 
47
47
  params.query_params.each do |key, value|
48
48
  json['queryStringParameters'] ||= {}
49
- json['queryStringParameters'][key.to_s] = value.to_s
49
+ json['queryStringParameters'][key.to_s] = value
50
50
  end
51
51
 
52
52
  json
@@ -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.13"
2
+ VERSION = "2.3.18"
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.13
4
+ version: 2.3.18
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-02-23 00:00:00.000000000 Z
11
+ date: 2020-11-09 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
@@ -556,6 +542,20 @@ dependencies:
556
542
  - - ">="
557
543
  - !ruby/object:Gem::Version
558
544
  version: '0'
545
+ - !ruby/object:Gem::Dependency
546
+ name: cfn-status
547
+ requirement: !ruby/object:Gem::Requirement
548
+ requirements:
549
+ - - ">="
550
+ - !ruby/object:Gem::Version
551
+ version: '0'
552
+ type: :development
553
+ prerelease: false
554
+ version_requirements: !ruby/object:Gem::Requirement
555
+ requirements:
556
+ - - ">="
557
+ - !ruby/object:Gem::Version
558
+ version: '0'
559
559
  description: 'Jets is a framework that allows you to create serverless applications
560
560
  with a beautiful language: Ruby. It includes everything required to build and deploy
561
561
  an application. Jets leverages the power of Ruby to make serverless joyful for
@@ -786,6 +786,7 @@ files:
786
786
  - lib/jets/controller/middleware/main.rb
787
787
  - lib/jets/controller/middleware/reloader.rb
788
788
  - lib/jets/controller/middleware/webpacker_setup.rb
789
+ - lib/jets/controller/parameters_filter.rb
789
790
  - lib/jets/controller/params.rb
790
791
  - lib/jets/controller/rack/adapter.rb
791
792
  - lib/jets/controller/rack/env.rb
@@ -796,6 +797,7 @@ files:
796
797
  - lib/jets/controller/response.rb
797
798
  - lib/jets/controller/stage.rb
798
799
  - lib/jets/core.rb
800
+ - lib/jets/core_ext/bundler.rb
799
801
  - lib/jets/core_ext/kernel.rb
800
802
  - lib/jets/db.rb
801
803
  - lib/jets/dotenv.rb
@@ -1101,7 +1103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1101
1103
  - !ruby/object:Gem::Version
1102
1104
  version: '0'
1103
1105
  requirements: []
1104
- rubygems_version: 3.1.2
1106
+ rubygems_version: 3.1.4
1105
1107
  signing_key:
1106
1108
  specification_version: 4
1107
1109
  summary: Ruby Serverless Framework