jets 1.0.18 → 1.1.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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/Gemfile.lock +10 -10
  4. data/README/testing.md +5 -2
  5. data/lib/jets.rb +2 -2
  6. data/lib/jets/application.rb +69 -40
  7. data/lib/jets/booter.rb +17 -20
  8. data/lib/jets/builders/code_builder.rb +7 -8
  9. data/lib/jets/cfn/ship.rb +0 -6
  10. data/lib/jets/commands/build.rb +0 -5
  11. data/lib/jets/commands/deploy.rb +0 -4
  12. data/lib/jets/commands/main.rb +31 -4
  13. data/lib/jets/commands/templates/skeleton/{.env → .env.tt} +1 -0
  14. data/lib/jets/commands/templates/skeleton/config.ru +1 -0
  15. data/lib/jets/commands/upgrade/v1.rb +12 -0
  16. data/lib/jets/controller.rb +5 -0
  17. data/lib/jets/controller/base.rb +43 -21
  18. data/lib/jets/controller/cookies.rb +40 -0
  19. data/lib/jets/controller/cookies/jar.rb +269 -0
  20. data/lib/jets/controller/middleware.rb +4 -0
  21. data/lib/jets/controller/middleware/local.rb +119 -0
  22. data/lib/jets/{server/lambda_aws_proxy.rb → controller/middleware/local/api_gateway.rb} +11 -49
  23. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  24. data/lib/jets/{server → controller/middleware/local}/route_matcher.rb +4 -4
  25. data/lib/jets/controller/middleware/main.rb +46 -0
  26. data/lib/jets/{server → controller/middleware}/webpacker_setup.rb +0 -1
  27. data/lib/jets/controller/params.rb +2 -1
  28. data/lib/jets/controller/rack.rb +5 -0
  29. data/lib/jets/controller/rack/adapter.rb +60 -0
  30. data/lib/jets/controller/rack/env.rb +96 -0
  31. data/lib/jets/controller/redirection.rb +1 -1
  32. data/lib/jets/controller/renderers.rb +1 -1
  33. data/lib/jets/controller/renderers/base_renderer.rb +0 -4
  34. data/lib/jets/controller/renderers/{aws_proxy_renderer.rb → rack_renderer.rb} +7 -19
  35. data/lib/jets/controller/renderers/template_renderer.rb +1 -1
  36. data/lib/jets/controller/request.rb +14 -44
  37. data/lib/jets/controller/response.rb +55 -7
  38. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +13 -3
  39. data/lib/jets/mega.rb +7 -0
  40. data/lib/jets/{rack → mega}/hash_converter.rb +1 -1
  41. data/lib/jets/{rack → mega}/request.rb +17 -4
  42. data/lib/jets/middleware.rb +38 -0
  43. data/lib/jets/middleware/configurator.rb +84 -0
  44. data/lib/jets/middleware/default_stack.rb +44 -0
  45. data/lib/jets/middleware/layer.rb +34 -0
  46. data/lib/jets/middleware/stack.rb +77 -0
  47. data/lib/jets/resource/function.rb +1 -1
  48. data/lib/jets/ruby_server.rb +1 -1
  49. data/lib/jets/server.rb +48 -13
  50. data/lib/jets/version.rb +1 -1
  51. metadata +24 -17
  52. data/lib/jets/application/middleware.rb +0 -23
  53. data/lib/jets/default/application.rb +0 -23
  54. data/lib/jets/rack.rb +0 -7
  55. data/lib/jets/rack/server.rb +0 -47
  56. data/lib/jets/server/api_gateway.rb +0 -39
  57. data/lib/jets/server/timing_middleware.rb +0 -33
  58. data/lib/jets/timing.rb +0 -65
  59. data/lib/jets/timing/report.rb +0 -82
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b3641bfc605d605d224afb10bb88984598e186c9e804a93a4a0cae6c21196355
4
- data.tar.gz: bfece6211fcbfc4e58b0032adc42edfa8c9ebb2342cd78cb1cd67efee0591f6d
3
+ metadata.gz: c16c6b3b6a3226c7512a79011f134db88f544e86944fd96041c43cfa155c949a
4
+ data.tar.gz: b598ecc601f5edafb12dc8589be0511e9302b0fb16c61a27a27805612554b1c7
5
5
  SHA512:
6
- metadata.gz: de90662184c6b339aa2dd68d8fc11a77043a899d0df0e80e432bbbddb37fa96f207a52392b73810cb1147b60131ed2682f8d94a717f4516cbf35d079d9cd4f98
7
- data.tar.gz: 2969e083ee32d7053e65689eb9888b45ae144d4b0e681dd17ca30f2c13cc1153c6db5d5da364dfe251fc971fd627762877b0e209840c06092d9ccb61bb5abd7b
6
+ metadata.gz: e590e98ec4f3b6f6b865d678af0bbb519f4c7b41f0ea99b6d607cd948f18dbfba230cadd30a78342b894dc090eb5ac32de191253538f60715e136b7833a675c7
7
+ data.tar.gz: 371c670262da7a386880b6a467251c39fa846bb016325eb75b0e0a8e630934c3284134d5e8db27c64a8d62af0e06f927ced345c10faa1fdd862f2c7c84a14cb8
@@ -3,6 +3,10 @@
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/), even before v1.0.
5
5
 
6
+ ## [1.1.0]
7
+ - rack compatibility pull request #72 from tongueroo/rack
8
+ - remove Jets::Timing pull request #73 from tongueroo/rm-timing
9
+
6
10
  ## [1.0.18]
7
11
  - re-raise exception properly after reporting locally
8
12
 
@@ -11,7 +11,7 @@ GIT
11
11
  PATH
12
12
  remote: .
13
13
  specs:
14
- jets (1.0.18)
14
+ jets (1.1.0)
15
15
  actionpack (>= 5.2.1)
16
16
  actionview (>= 5.2.1)
17
17
  activerecord (>= 5.2.1)
@@ -65,9 +65,9 @@ GEM
65
65
  tzinfo (~> 1.1)
66
66
  arel (9.0.0)
67
67
  aws-eventstream (1.0.1)
68
- aws-partitions (1.113.0)
69
- aws-sdk-cloudformation (1.11.0)
70
- aws-sdk-core (~> 3, >= 3.26.0)
68
+ aws-partitions (1.114.0)
69
+ aws-sdk-cloudformation (1.12.0)
70
+ aws-sdk-core (~> 3, >= 3.37.0)
71
71
  aws-sigv4 (~> 1.0)
72
72
  aws-sdk-cloudwatchlogs (1.10.0)
73
73
  aws-sdk-core (~> 3, >= 3.26.0)
@@ -83,15 +83,15 @@ GEM
83
83
  aws-sdk-kms (1.11.0)
84
84
  aws-sdk-core (~> 3, >= 3.26.0)
85
85
  aws-sigv4 (~> 1.0)
86
- aws-sdk-lambda (1.13.0)
87
- aws-sdk-core (~> 3, >= 3.26.0)
86
+ aws-sdk-lambda (1.14.0)
87
+ aws-sdk-core (~> 3, >= 3.37.0)
88
88
  aws-sigv4 (~> 1.0)
89
- aws-sdk-s3 (1.23.1)
90
- aws-sdk-core (~> 3, >= 3.26.0)
89
+ aws-sdk-s3 (1.24.1)
90
+ aws-sdk-core (~> 3, >= 3.37.0)
91
91
  aws-sdk-kms (~> 1)
92
92
  aws-sigv4 (~> 1.0)
93
- aws-sdk-sns (1.8.0)
94
- aws-sdk-core (~> 3, >= 3.26.0)
93
+ aws-sdk-sns (1.8.1)
94
+ aws-sdk-core (~> 3, >= 3.37.0)
95
95
  aws-sigv4 (~> 1.0)
96
96
  aws-sigv4 (1.0.3)
97
97
  builder (3.2.3)
@@ -17,7 +17,7 @@ To run the integration tests locally, you need to create a new Jets CRUD project
17
17
  jets new demo
18
18
  cd demo
19
19
  jets generate scaffold Post title:string
20
- jets server
20
+ jets server --no-reload
21
21
 
22
22
  Then you can run the postman tests:
23
23
 
@@ -45,4 +45,7 @@ Run the remote integration script:
45
45
  Example:
46
46
 
47
47
  BASE_URL=https://wb5dcjc09a.execute-api.us-west-2.amazonaws.com/dev spec/integration/remote.sh
48
-
48
+
49
+ ## Manual Test
50
+
51
+ Test books create, update and delete manually until it's scripted.
@@ -32,11 +32,12 @@ module Jets
32
32
  autoload :Klass, 'jets/klass'
33
33
  autoload :Lambda, 'jets/lambda'
34
34
  autoload :Logger, "jets/logger"
35
+ autoload :Mega, "jets/mega"
36
+ autoload :Middleware, "jets/middleware"
35
37
  autoload :Naming, 'jets/naming'
36
38
  autoload :PolyFun, 'jets/poly_fun'
37
39
  autoload :Preheat, "jets/preheat"
38
40
  autoload :Processors, 'jets/processors'
39
- autoload :Rack, "jets/rack"
40
41
  autoload :Rdoc, "jets/rdoc"
41
42
  autoload :Resource, "jets/resource"
42
43
  autoload :Route, "jets/route"
@@ -45,7 +46,6 @@ module Jets
45
46
  autoload :Rule, 'jets/rule'
46
47
  autoload :Server, "jets/server"
47
48
  autoload :Stack, "jets/stack"
48
- autoload :Timing, "jets/timing"
49
49
  autoload :Turbine, 'jets/turbine'
50
50
  autoload :Util, "jets/util"
51
51
 
@@ -1,12 +1,12 @@
1
1
  require "active_support/ordered_options"
2
2
  require "singleton"
3
+ require "rack"
3
4
 
4
5
  class Jets::Application
5
6
  include Singleton
6
7
  extend Memoist
7
- # Middleware used for development only
8
- autoload :Middleware, "jets/application/middleware"
9
- include Middleware
8
+ autoload :Middleware, "jets/middleware"
9
+ include Jets::Middleware
10
10
 
11
11
  def configure(&block)
12
12
  instance_eval(&block) if block
@@ -23,9 +23,30 @@ class Jets::Application
23
23
  Jets::Inflections.load!
24
24
  end
25
25
 
26
- # Default config
27
26
  def config
27
+ @config ||= ActiveSupport::OrderedOptions.new # dont use memoize since we reset @config later
28
+ end
29
+
30
+ def default_config(project_name=nil)
28
31
  config = ActiveSupport::OrderedOptions.new
32
+ config.project_name = project_name
33
+ config.cors = true
34
+ config.autoload_paths = %w[
35
+ app/controllers
36
+ app/models
37
+ app/jobs
38
+ app/rules
39
+ app/helpers
40
+ app/shared/resources
41
+ ]
42
+ config.extra_autoload_paths = []
43
+
44
+ # function properties defaults
45
+ config.function = ActiveSupport::OrderedOptions.new
46
+ config.function.timeout = 30
47
+ # default memory setting based on:
48
+ # https://medium.com/epsagon/how-to-make-lambda-faster-memory-performance-benchmark-be6ebc41f0fc
49
+ config.function.memory_size = 1536
29
50
 
30
51
  config.prewarm = ActiveSupport::OrderedOptions.new
31
52
  config.prewarm.enable = true
@@ -51,53 +72,37 @@ class Jets::Application
51
72
  config.ruby = ActiveSupport::OrderedOptions.new
52
73
  config.ruby.lazy_load = true # also set in config/environments files
53
74
 
54
- config
55
- end
56
- memoize :config
75
+ config.middleware = Jets::Middleware::Configurator.new
57
76
 
58
- def setup_auto_load_paths
59
- autoload_paths = config.autoload_paths + config.extra_autoload_paths
60
- autoload_paths = autoload_paths.uniq.map { |p| "#{Jets.root}#{p}" }
61
- # internal_autoload_paths are last
62
- autoload_paths += internal_autoload_paths
63
- ActiveSupport::Dependencies.autoload_paths += autoload_paths
64
- end
77
+ config.session = ActiveSupport::OrderedOptions.new
78
+ config.session.store = Rack::Session::Cookie # note when accessing it use session[:store] since .store is an OrderedOptions method
79
+ config.session.options = {}
65
80
 
66
- def internal_autoload_paths
67
- internal = File.expand_path("../internal", __FILE__)
68
- paths = %w[
69
- app/controllers
70
- app/models
71
- app/jobs
72
- ]
73
- paths.map { |path| "#{internal}/#{path}" }
74
- end
75
-
76
- def load_configs
77
- # The Jets default/application.rb is loaded.
78
- load File.expand_path("../default/application.rb", __FILE__)
79
- # Then project config/application.rb is loaded.
80
- load_app_config
81
- load_db_config
82
- load_environments_config
81
+ config
83
82
  end
84
83
 
85
- # First time loading this might not have all the values. Some values like
86
- # project_namespace depend on project_name. Loading the config twice
87
- # resolves the chicken and egg problem here.
88
84
  def load_app_config
89
- eval_app_config
90
- # Normalize config and setup some shortcuts
85
+ # First time loading will not have all correct values. Some values like
86
+ # project_namespace depend on project_name. Loading the config twice
87
+ # resolves the chicken-and-egg problem with config.project_name.
88
+ # TODO: Improve the way we this is solved.
89
+ eval_app_config(squash_exception: true) # first time load to capture the config.project_name
90
+ @config = default_config(config.project_name) # reset config with the captured project_name
91
+
91
92
  set_dependent_configs! # things like project_namespace that need project_name
92
- eval_app_config # twice to fix values that rely on the dependent configs
93
93
 
94
- set_iam_policy # relies on dependent values, must be called late
94
+ # Running eval_app_config the second time, hack to solve the chicken-and-egg problem
95
+ eval_app_config
96
+
97
+ set_iam_policy # relies on dependent values, must be called afterwards
95
98
  normalize_env_vars!
96
99
  end
97
100
 
98
- def eval_app_config
101
+ def eval_app_config(squash_exception: false)
99
102
  app_config = "#{Jets.root}config/application.rb"
100
- load app_config if File.exist?(app_config)
103
+ load app_config
104
+ rescue NoMethodError => e
105
+ raise(e) unless squash_exception
101
106
  end
102
107
 
103
108
  def load_environments_config
@@ -108,6 +113,30 @@ class Jets::Application
108
113
  end
109
114
  end
110
115
 
116
+ def load_configs
117
+ load_app_config
118
+ load_db_config
119
+ load_environments_config
120
+ end
121
+
122
+ def setup_auto_load_paths
123
+ autoload_paths = config.autoload_paths + config.extra_autoload_paths
124
+ autoload_paths = autoload_paths.uniq.map { |p| "#{Jets.root}#{p}" }
125
+ # internal_autoload_paths are last
126
+ autoload_paths += internal_autoload_paths
127
+ ActiveSupport::Dependencies.autoload_paths += autoload_paths
128
+ end
129
+
130
+ def internal_autoload_paths
131
+ internal = File.expand_path("../internal", __FILE__)
132
+ paths = %w[
133
+ app/controllers
134
+ app/models
135
+ app/jobs
136
+ ]
137
+ paths.map { |path| "#{internal}/#{path}" }
138
+ end
139
+
111
140
  # Use the shorter name in stack names, but use the full name when it
112
141
  # comes to checking for the env.
113
142
  #
@@ -4,18 +4,23 @@ class Jets::Booter
4
4
  def boot!(options={})
5
5
  return if @booted
6
6
 
7
- redirect_output
8
7
  confirm_jets_project!
9
8
  require_bundle_gems
10
9
  Jets::Dotenv.load!
11
- Jets.application # triggers application.setup! # autoload_paths, routes, etc
10
+ Jets.application # triggers Application.instance setup # autoload_paths, routes, etc
12
11
  setup_db
13
12
  app_initializers
14
13
  turbine_initializers
14
+ build_middleware_stack
15
15
 
16
16
  @booted = true
17
17
  end
18
18
 
19
+ # Builds and memoize stack so it only gets built on bootup
20
+ def build_middleware_stack
21
+ Jets.application.build_stack
22
+ end
23
+
19
24
  def turbine_initializers
20
25
  Jets::Turbine.subclasses.each do |subclass|
21
26
  subclass.initializers.each do |label, block|
@@ -30,23 +35,6 @@ class Jets::Booter
30
35
  end
31
36
  end
32
37
 
33
- # AWS Lambda for natively supported languages prints to CloudWatch instead of
34
- # mungling up the response. We'll redirect stdout to stderr to mimic AWS Lambda
35
- # behavior.
36
- #
37
- # Also, for local use, printing to stdout can mangle up the response when piping
38
- # the value to jq. For example:
39
- #
40
- # `jets call --local .. | jq`
41
- #
42
- # By redirecting stderr we can use jq safely.
43
- #
44
- def redirect_output
45
- $stdout.sync = true
46
- $stderr.sync = true
47
- $stdout = $stderr # jets call and local jets operation
48
- end
49
-
50
38
  # require_bundle_gems called when environment boots up via Jets.boot. It
51
39
  # also useful for when to loading Rake tasks in
52
40
  # Jets::Commands::RakeTasks.load!
@@ -105,12 +93,21 @@ class Jets::Booter
105
93
  def confirm_jets_project!
106
94
  unless File.exist?("#{Jets.root}config/application.rb")
107
95
  puts "It does not look like you are running this command within a jets project. Please confirm that you are in a jets project and try again.".colorize(:red)
108
- exit
96
+ exit 1
109
97
  end
110
98
  end
111
99
 
112
100
  def message
113
101
  "Jets booting up in #{Jets.env.colorize(:green)} mode!"
114
102
  end
103
+
104
+ def check_config_ru!
105
+ config_ru = File.read("#{Jets.root}config.ru")
106
+ unless config_ru.include?("Jets.boot")
107
+ puts 'The config.ru file is missing Jets.boot. Please add Jets.boot after require "jets"'.colorize(:red)
108
+ puts "This was changed as made in Jets v1.1.0"
109
+ exit 1
110
+ end
111
+ end
115
112
  end
116
113
  end
@@ -53,7 +53,6 @@ class Jets::Builders
53
53
  # https://docs.aws.amazon.com/lambda/latest/dg/limits.html
54
54
  AWS_CODE_SIZE_LIMIT = 250 * 1024 * 1024 # 250MB
55
55
 
56
- include Jets::Timing
57
56
  include Jets::AwsServices
58
57
  include Util
59
58
  extend Memoist
@@ -80,7 +79,6 @@ class Jets::Builders
80
79
  code_finish
81
80
  end
82
81
  end
83
- time :build
84
82
 
85
83
  # Resolves the chicken-and-egg problem with md5 checksums. The handlers need
86
84
  # to reference files with the md5 checksum. The files are the:
@@ -113,7 +111,6 @@ class Jets::Builders
113
111
  end
114
112
  end
115
113
  end
116
- time :create_zip_files
117
114
 
118
115
  def exist_on_s3?(filename)
119
116
  s3_key = "jets/code/#{filename}"
@@ -163,17 +160,16 @@ class Jets::Builders
163
160
  def code_setup
164
161
  reconfigure_development_webpacker
165
162
  end
166
- time :code_setup
167
163
 
168
164
  def code_finish
169
165
  update_lazy_load_config # at the top, must be called before Jets.lazy_load? is used
170
166
  store_s3_base_url
167
+ disable_webpacker_middleware
171
168
  setup_tmp
172
169
  calculate_md5s # must be called before generate_node_shims and create_zip_files
173
170
  generate_node_shims
174
171
  create_zip_files
175
172
  end
176
- time :code_finish
177
173
 
178
174
  def update_lazy_load_config
179
175
  size_limit = AWS_CODE_SIZE_LIMIT
@@ -231,6 +227,12 @@ class Jets::Builders
231
227
  Jets.aws.s3_bucket
232
228
  end
233
229
 
230
+ def disable_webpacker_middleware
231
+ full_path = "#{full(tmp_code)}/config/disable-webpacker-middleware.txt"
232
+ FileUtils.mkdir_p(File.dirname(full_path))
233
+ FileUtils.touch(full_path)
234
+ end
235
+
234
236
  # This happens in the current app directory not the tmp code for simplicity.
235
237
  # This is because the node and yarn has likely been set up correctly there.
236
238
  def compile_assets
@@ -250,7 +252,6 @@ class Jets::Builders
250
252
  `which webpack`.strip
251
253
  sh("JETS_ENV=#{Jets.env} #{webpack_command}")
252
254
  end
253
- time :compile_assets
254
255
 
255
256
  # This happens in the current app directory not the tmp code for simplicity
256
257
  # This is because the node likely been set up correctly there.
@@ -311,7 +312,6 @@ class Jets::Builders
311
312
  move_node_modules(Jets.build_root, Jets.root) # move node_modules directory back
312
313
  end
313
314
  end
314
- time :copy_project
315
315
 
316
316
  # Move the node modules to the tmp build folder to speed up project copying.
317
317
  # A little bit risky because a ctrl-c in the middle of the project copying
@@ -360,7 +360,6 @@ class Jets::Builders
360
360
  ruby_packager.finish
361
361
  rack_packager.finish
362
362
  end
363
- time :package_ruby
364
363
 
365
364
  # TODO: Move logic into plugin instead
366
365
  def reconfigure_rails
@@ -1,6 +1,5 @@
1
1
  class Jets::Cfn
2
2
  class Ship
3
- include Jets::Timing
4
3
  include Jets::AwsServices
5
4
 
6
5
  def initialize(options)
@@ -35,7 +34,6 @@ class Jets::Cfn
35
34
  prewarm
36
35
  show_api_endpoint
37
36
  end
38
- time :run
39
37
 
40
38
  def save_stack
41
39
  if stack_exists?(@parent_stack_name)
@@ -49,7 +47,6 @@ class Jets::Cfn
49
47
  # parent stack template is on filesystem and child stacks templates is on s3
50
48
  cfn.create_stack(stack_options)
51
49
  end
52
- time :create_stack
53
50
 
54
51
  def update_stack
55
52
  begin
@@ -59,7 +56,6 @@ class Jets::Cfn
59
56
  true # error
60
57
  end
61
58
  end
62
- time :update_stack
63
59
 
64
60
  # options common to both create_stack and update_stack
65
61
  def stack_options
@@ -75,7 +71,6 @@ class Jets::Cfn
75
71
  def wait_for_stack
76
72
  Jets::Cfn::Status.new(@options).wait
77
73
  end
78
- time :wait_for_stack
79
74
 
80
75
  def prewarm
81
76
  if ENV['SKIP_PREWARMING']
@@ -147,6 +142,5 @@ class Jets::Cfn
147
142
  uploader = Upload.new(@options[:s3_bucket])
148
143
  uploader.upload
149
144
  end
150
- time :upload_to_s3
151
145
  end
152
146
  end