jets 1.0.18 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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