jets 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/Gemfile.lock +4 -4
  4. data/README.md +2 -2
  5. data/lib/jets.rb +3 -4
  6. data/lib/jets/application.rb +13 -2
  7. data/lib/jets/builders.rb +3 -0
  8. data/lib/jets/builders/code_builder.rb +22 -89
  9. data/lib/jets/builders/code_size.rb +55 -0
  10. data/lib/jets/builders/gem_replacer.rb +22 -1
  11. data/lib/jets/builders/handler_generator.rb +31 -5
  12. data/lib/jets/builders/lambda_layer.rb +50 -0
  13. data/lib/jets/builders/md5.rb +10 -5
  14. data/lib/jets/builders/md5_zip.rb +1 -0
  15. data/lib/jets/builders/purger.rb +35 -0
  16. data/lib/jets/builders/rack_packager.rb +25 -5
  17. data/lib/jets/builders/rackup_wrappers/rackup +1 -5
  18. data/lib/jets/builders/ruby_packager.rb +25 -27
  19. data/lib/jets/builders/shim_vars/app.rb +3 -3
  20. data/lib/jets/builders/shim_vars/base.rb +9 -4
  21. data/lib/jets/builders/shim_vars/shared.rb +2 -2
  22. data/lib/jets/builders/templates/handler.rb +7 -0
  23. data/lib/jets/builders/tidy.rb +4 -3
  24. data/lib/jets/builders/util.rb +11 -3
  25. data/lib/jets/cfn/builders/base_child_builder.rb +6 -3
  26. data/lib/jets/cfn/builders/interface.rb +1 -1
  27. data/lib/jets/cfn/builders/parent_builder.rb +5 -0
  28. data/lib/jets/commands/build.rb +4 -2
  29. data/lib/jets/commands/help/gems/check.md +1 -1
  30. data/lib/jets/commands/main.rb +1 -1
  31. data/lib/jets/commands/new.rb +4 -2
  32. data/lib/jets/commands/sequence.rb +1 -1
  33. data/lib/jets/commands/templates/skeleton/Gemfile.tt +2 -2
  34. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +0 -5
  35. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +2 -2
  36. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +2 -1
  37. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +2 -3
  38. data/lib/jets/commands/upgrade/v1.rb +21 -0
  39. data/lib/jets/controller/renderers/template_renderer.rb +1 -1
  40. data/lib/jets/controller/rendering.rb +1 -4
  41. data/lib/jets/core.rb +45 -6
  42. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +32 -34
  43. data/lib/jets/mega/request.rb +11 -0
  44. data/lib/jets/overrides/lambda.rb +1 -0
  45. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  46. data/lib/jets/overrides/rails.rb +4 -0
  47. data/lib/jets/{rails_overrides → overrides/rails}/asset_tag_helper.rb +0 -0
  48. data/lib/jets/{rails_overrides → overrides/rails}/common_methods.rb +0 -0
  49. data/lib/jets/{rails_overrides → overrides/rails}/rendering_helper.rb +0 -0
  50. data/lib/jets/{rails_overrides → overrides/rails}/url_helper.rb +0 -0
  51. data/lib/jets/poly_fun/base_executor.rb +1 -1
  52. data/lib/jets/preheat.rb +1 -0
  53. data/lib/jets/processors/main_processor.rb +3 -10
  54. data/lib/jets/{server.rb → rack_server.rb} +31 -2
  55. data/lib/jets/resource.rb +1 -1
  56. data/lib/jets/resource/api_gateway/base_path/function.rb +1 -1
  57. data/lib/jets/resource/child_stack/app_class.rb +10 -4
  58. data/lib/jets/resource/lambda.rb +5 -0
  59. data/lib/jets/resource/{function.rb → lambda/function.rb} +8 -6
  60. data/lib/jets/resource/{function → lambda/function}/environment.rb +1 -1
  61. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  62. data/lib/jets/resource/lambda/layer_version.rb +46 -0
  63. data/lib/jets/tmp_loader.rb +52 -0
  64. data/lib/jets/version.rb +1 -1
  65. data/{README → readme}/prerelease.md +0 -0
  66. data/{README → readme}/testing.md +5 -0
  67. data/vendor/jets-gems/lib/jets/gems.rb +1 -1
  68. data/vendor/jets-gems/lib/jets/gems/check.rb +7 -7
  69. data/vendor/jets-gems/lib/jets/gems/exist.rb +5 -5
  70. data/vendor/jets-gems/lib/jets/gems/extract/base.rb +4 -11
  71. data/vendor/jets-gems/lib/jets/gems/extract/gem.rb +15 -8
  72. data/vendor/jets-gems/lib/jets/gems/extract/ruby.rb +19 -10
  73. metadata +22 -15
  74. data/lib/jets/builders/templates/handler.js +0 -9
  75. data/lib/jets/builders/templates/shim.js +0 -275
  76. data/lib/jets/rails_overrides.rb +0 -4
  77. data/lib/jets/ruby_server.rb +0 -148
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0e0490cdce6f57474859bad4aa18687389e093c9c93bc3dd18d2277198455625
4
- data.tar.gz: aba0604bffff78b7c9d77e919d214497ad50810c03634153b9dacbd42a86bd74
3
+ metadata.gz: bb0598c2fec261f9cf41a160261d7641963e09a62158e1590194e96eff34fbcb
4
+ data.tar.gz: f2e34c4c936ab77a6c75045d048a9c5ddebac2611b876f28a74ed11881e3d802
5
5
  SHA512:
6
- metadata.gz: 766d84de9260cd6a068a2cead8fead75b8fd3a60b84815a153b787f2ce7c2bd420aad30b8398a7aace05006a9911c0aa0fffde7f91544b6327e81a2f5da6038f
7
- data.tar.gz: d297334afecc43c4d8a13ddad7df20a3c94a18ac0658a080ccd9be35b6aa7d2d7d7ee73d6f1bce6b2529325ca26928442bbb86cd61237689997b0c31cf0f9cfb
6
+ metadata.gz: 603c3925ff7c16dac27e5c1695f948882b6880f91ee162346df13a74c8b3ee59a936555af15eca5b99c966b60da26adbd53c1a252a925aa64dceb3c82b62d9e1
7
+ data.tar.gz: c1336fde24ccee02f4ac5e2de60856960b9b33bb84ae5678365ee98f67982c297e8dae3272a126f0f0c4694467d8d5311a4461630bc4c3fea8c4075d83aaaa54
@@ -3,6 +3,14 @@
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.3.0]
7
+ - Official AWS Ruby Support
8
+ - Ruby Version 2.5.3 upgrade
9
+ - Gem Layer introduced
10
+ - Removed node shim
11
+ - Build purger: /tmp/jets/project is auto purge when major or minor version changes
12
+ - Update default gems source to https://gems2.lambdagems.com
13
+
6
14
  ## [1.2.1]
7
15
  - remove comments about routes workaround, auto blue-green deployments resolves this
8
16
 
@@ -11,7 +11,7 @@ GIT
11
11
  PATH
12
12
  remote: .
13
13
  specs:
14
- jets (1.2.1)
14
+ jets (1.3.0)
15
15
  actionpack (>= 5.2.1)
16
16
  actionview (>= 5.2.1)
17
17
  activerecord (>= 5.2.1)
@@ -66,7 +66,7 @@ GEM
66
66
  tzinfo (~> 1.1)
67
67
  arel (9.0.0)
68
68
  aws-eventstream (1.0.1)
69
- aws-partitions (1.122.0)
69
+ aws-partitions (1.123.0)
70
70
  aws-sdk-apigateway (1.23.0)
71
71
  aws-sdk-core (~> 3, >= 3.39.0)
72
72
  aws-sigv4 (~> 1.0)
@@ -76,7 +76,7 @@ GEM
76
76
  aws-sdk-cloudwatchlogs (1.12.0)
77
77
  aws-sdk-core (~> 3, >= 3.39.0)
78
78
  aws-sigv4 (~> 1.0)
79
- aws-sdk-core (3.43.0)
79
+ aws-sdk-core (3.44.0)
80
80
  aws-eventstream (~> 1.0)
81
81
  aws-partitions (~> 1.0)
82
82
  aws-sigv4 (~> 1.0)
@@ -109,7 +109,7 @@ GEM
109
109
  gems (1.1.1)
110
110
  json
111
111
  hashie (3.6.0)
112
- i18n (1.1.1)
112
+ i18n (1.2.0)
113
113
  concurrent-ruby (~> 1.0)
114
114
  jmespath (1.4.0)
115
115
  json (2.1.0)
data/README.md CHANGED
@@ -30,13 +30,13 @@ Jets supports writing AWS Lambda functions with Ruby. You define them in the `ap
30
30
  app/functions/simple.rb:
31
31
 
32
32
  ```ruby
33
- def handle(event, context)
33
+ def handle(event:, context:)
34
34
  puts "hello world"
35
35
  {hello: "world"}
36
36
  end
37
37
  ```
38
38
 
39
- Though simple functions are supported by Jets, aside from the ability to use Ruby, they do not as much value as other ways to write code with Jets.
39
+ Though simple functions are supported by Jets, they do not really add much value as other ways to write Ruby code with Jets. Classes like Controllers and Jobs add many conveniences and are more powerful to use. We’ll cover them next.
40
40
 
41
41
  ### Jets Controllers
42
42
 
@@ -12,8 +12,7 @@ require "fileutils"
12
12
  require "memoist"
13
13
 
14
14
  module Jets
15
- # When we update Jets::RUBY_VERSION, need to update jets-gems/base.rb: def jets_ruby_version also
16
- RUBY_VERSION = "2.5.0"
15
+ RUBY_VERSION = "2.5.3"
17
16
 
18
17
  autoload :Application, "jets/application"
19
18
  autoload :AwsInfo, "jets/aws_info"
@@ -42,14 +41,14 @@ module Jets
42
41
  autoload :PolyFun, 'jets/poly_fun'
43
42
  autoload :Preheat, "jets/preheat"
44
43
  autoload :Processors, 'jets/processors'
44
+ autoload :RackServer, "jets/rack_server"
45
45
  autoload :Rdoc, "jets/rdoc"
46
46
  autoload :Resource, "jets/resource"
47
47
  autoload :Route, "jets/route"
48
48
  autoload :Router, "jets/router"
49
- autoload :RubyServer, "jets/ruby_server"
50
49
  autoload :Rule, 'jets/rule'
51
- autoload :Server, "jets/server"
52
50
  autoload :Stack, "jets/stack"
51
+ autoload :TmpLoader, "jets/tmp_loader"
53
52
  autoload :Turbine, 'jets/turbine'
54
53
  autoload :Util, "jets/util"
55
54
 
@@ -52,7 +52,7 @@ class Jets::Application
52
52
 
53
53
  config.gems = ActiveSupport::OrderedOptions.new
54
54
  config.gems.sources = [
55
- 'https://gems.lambdagems.com'
55
+ Jets.default_gems_source
56
56
  ]
57
57
 
58
58
  config.inflections = ActiveSupport::OrderedOptions.new
@@ -65,7 +65,6 @@ class Jets::Application
65
65
  config.assets.cache_control = nil # IE: public, max-age=3600 , max_age is a shorter way to set cache_control.
66
66
 
67
67
  config.ruby = ActiveSupport::OrderedOptions.new
68
- config.ruby.lazy_load = true # also set in config/environments files
69
68
 
70
69
  config.middleware = Jets::Middleware::Configurator.new
71
70
 
@@ -133,6 +132,18 @@ class Jets::Application
133
132
  load_app_config
134
133
  load_db_config
135
134
  load_environments_config
135
+ deprecated_configs_message
136
+ end
137
+
138
+ def deprecated_configs_message
139
+ unless config.ruby.lazy_load.nil?
140
+ puts "Detected config.ruby.lazy_load = #{config.ruby.lazy_load.inspect}".colorize(:yellow)
141
+ puts "Deprecated: config.ruby.lazy_load".colorize(:yellow)
142
+ puts "Gems are now bundled with with Lambda Layer and there's no need to lazy load them."
143
+ puts "Please remove the config in your config/application.rb or config/environments files."
144
+ puts "You can have Jets automatically do this by running:"
145
+ puts " jets upgrade:v1"
146
+ end
136
147
  end
137
148
 
138
149
  def setup_auto_load_paths
@@ -1,9 +1,12 @@
1
1
  class Jets::Builders
2
2
  autoload :CodeBuilder, "jets/builders/code_builder"
3
+ autoload :CodeSize, "jets/builders/code_size"
3
4
  autoload :GemReplacer, "jets/builders/gem_replacer"
4
5
  autoload :HandlerGenerator, "jets/builders/handler_generator"
6
+ autoload :LambdaLayer, "jets/builders/lambda_layer"
5
7
  autoload :Md5, "jets/builders/md5"
6
8
  autoload :Md5Zip, "jets/builders/md5_zip"
9
+ autoload :Purger, "jets/builders/purger"
7
10
  autoload :RackPackager, "jets/builders/rack_packager"
8
11
  autoload :ReconfigureRails, "jets/builders/reconfigure_rails"
9
12
  autoload :RubyPackager, "jets/builders/ruby_packager"
@@ -10,49 +10,10 @@ require "action_view"
10
10
  # /tmp/jets: build root where different jets projects get built.
11
11
  # /tmp/jets/project: each jets project gets built in a different subdirectory.
12
12
  #
13
- # The rest of the folders are subfolders under /tmp/jets/project:
13
+ # The rest of the folders are subfolders under /tmp/jets/project.
14
14
  #
15
- # cache: Gemfile is here, this is where we run bundle install.
16
- # cache/bundled/gems: Vendored gems that get created as part of bundled install.
17
- # Initially, macosx gems but then get replaced by linux gems where appropriate.
18
- # cache/downloads/rubies: ruby tarballs.
19
- # cache/downloads/gems: gem tarballs.
20
- # code: Where project gets copied into in order for us to configure it.
21
- # app_root/bundled/gems: Where vendored gems finally end up at. The compiled
22
- # gems at this point are only linux gems.
23
- # artifacts/code/code-md5sha.zip: code artifact that gets uploaded to lambda.
24
- #
25
- # Building Steps:
26
- #
27
- ### Before copy
28
- # * compile assets: easier to do this before the copy
29
- #
30
- ### copy project
31
- # * copy project: to app_root
32
- #
33
- ### setup app_root project
34
- # * clean project: remove log and ignored files to reduce size
35
- # * reconfigure webpacker: config/webpacker.yml
36
- # * generate node shims: handlers
37
- #
38
- ### build bundled in cache area
39
- # * bundle install: cache/bundled/gems
40
- #
41
- ### setup bundled on app root from cache
42
- # * copy bundled to code: code/bundled
43
- # * extract linux ruby: cache/downloads/rubies:
44
- # cache/bundled/rbenv, cache/bundled/linuxbrew
45
- # * extract linux gems: cache/downloads/gems:
46
- # cache/bundled/gems, cache/bundled/linuxbrew
47
- # * setup bundled config: code/.bundle/config
48
- #
49
- ### zip
50
- # * create zip file
51
15
  class Jets::Builders
52
16
  class CodeBuilder
53
- # https://docs.aws.amazon.com/lambda/latest/dg/limits.html
54
- AWS_CODE_SIZE_LIMIT = 250 * 1024 * 1024 # 250MB
55
-
56
17
  include Jets::AwsServices
57
18
  include Util
58
19
  extend Memoist
@@ -62,11 +23,13 @@ class Jets::Builders
62
23
  # Expanding to the full path and capture now.
63
24
  # Dir.chdir gets called later and we'll lose this info.
64
25
  @full_project_path = File.expand_path(Jets.root) + "/"
26
+ @version_purger = Purger.new
65
27
  end
66
28
 
67
29
  def build
68
- cache_check_message
69
30
  check_ruby_version
31
+ @version_purger.purge
32
+ cache_check_message
70
33
 
71
34
  clean_start
72
35
  compile_assets # easier to do before we copy the project because node and yarn has been likely setup in the that dir
@@ -101,6 +64,7 @@ class Jets::Builders
101
64
 
102
65
  def create_zip_files
103
66
  folders = Md5.stage_folders
67
+ # Md5.stage_folders ["stage/bundled", "stage/code"]
104
68
  folders.each do |folder|
105
69
  zip = Md5Zip.new(folder)
106
70
  if exist_on_s3?(zip.md5_name)
@@ -122,56 +86,38 @@ class Jets::Builders
122
86
  end
123
87
  end
124
88
 
125
- # Moves code/bundled and code/rack to build_root.
126
- # These files will be packaged separated and lazy loaded as part of the
127
- # node shim. This keeps the code zipfile smaller in size and helps
128
- # with the 250MB extract limited. /tmp permits up to 512MB.
129
- # AWS Lambda Limits: https://amzn.to/2A7y6v6
130
- #
131
- # > Each Lambda function receives an additional 512MB of non-persistent disk space in its own /tmp directory. The /tmp directory can be used for loading additional resources like dependency libraries or data sets during function initialization.
132
- #
133
- def setup_tmp
134
- tmp_symlink("bundled") if Jets.lazy_load?
135
- tmp_symlink("rack")
136
- end
137
-
138
89
  def stage_area
139
90
  "#{Jets.build_root}/stage"
140
91
  end
141
92
 
142
- # Moves folder to a stage folder and create a symlink its place
143
- # that links from /var/task to /tmp. Example:
144
- #
145
- # /var/task/bundled => /tmp/bundled
146
- #
147
- def tmp_symlink(folder)
148
- src = "#{full(tmp_code)}/#{folder}"
149
- return unless File.exist?(src)
150
-
151
- dest = "#{stage_area}/#{folder}"
152
- dir = File.dirname(dest)
153
- FileUtils.mkdir_p(dir) unless File.exist?(dir)
154
- FileUtils.mv(src, dest)
155
-
156
- # Create symlink
157
- FileUtils.ln_sf("/tmp/#{folder}", "/#{full(tmp_code)}/#{folder}")
158
- end
159
-
160
93
  def code_setup
161
94
  reconfigure_development_webpacker
162
95
  end
163
96
 
164
97
  def code_finish
165
- update_lazy_load_config # at the top, must be called before Jets.lazy_load? is used
98
+ # Reconfigure code
166
99
  store_s3_base_url
167
100
  disable_webpacker_middleware
168
101
  copy_internal_jets_code
169
- setup_tmp
102
+
103
+ # Code prep and zipping
104
+ build_lambda_layer
105
+ check_code_size!
170
106
  calculate_md5s # must be called before generate_node_shims and create_zip_files
171
107
  generate_node_shims
172
108
  create_zip_files
173
109
  end
174
110
 
111
+ def build_lambda_layer
112
+ return if Jets.poly_only?
113
+ lambda_layer = LambdaLayer.new
114
+ lambda_layer.build
115
+ end
116
+
117
+ def check_code_size!
118
+ CodeSize.check!
119
+ end
120
+
175
121
  # We copy the files into the project because we cannot require simple functions
176
122
  # directly since they are wrapped by an anonymous class.
177
123
  # TODO: Do this with the other files we required the same way.
@@ -185,17 +131,6 @@ class Jets::Builders
185
131
  end
186
132
  end
187
133
 
188
- def update_lazy_load_config
189
- size_limit = AWS_CODE_SIZE_LIMIT
190
- code_size = dir_size(full(tmp_code))
191
- if code_size > size_limit && !Jets.config.ruby.lazy_load
192
- # override the setting because we dont have to a choice but to lazy load
193
- mb_limit = AWS_CODE_SIZE_LIMIT / 1024 / 1024
194
- puts "Code size close to AWS code size limit of #{mb_limit}MB. Lazy loading automatically enabled."
195
- Jets.config.ruby.lazy_load = true
196
- end
197
- end
198
-
199
134
  # Thanks https://stackoverflow.com/questions/9354595/recursively-getting-the-size-of-a-directory
200
135
  # Seems to overestimate a little bit but close enough.
201
136
  def dir_size(folder)
@@ -210,8 +145,6 @@ class Jets::Builders
210
145
  # At this point the minimal stack exists, so we can grab it with the AWS API.
211
146
  # We do not want to grab this as part of the live request because it is slow.
212
147
  def store_s3_base_url
213
- return if poly_only?
214
-
215
148
  write_s3_base_url("config/s3_base_url.txt")
216
149
  write_s3_base_url("rack/config/s3_base_url.txt") if Jets.rack?
217
150
  end
@@ -369,9 +302,9 @@ class Jets::Builders
369
302
  return if Jets.poly_only?
370
303
 
371
304
  ruby_packager.install
372
- reconfigure_rails
305
+ reconfigure_rails # call here after full(tmp_code) is available
373
306
  rack_packager.install
374
- ruby_packager.finish
307
+ ruby_packager.finish # by this time we have a /tmp/jets/demo/stage/code/bundled
375
308
  rack_packager.finish
376
309
  end
377
310
 
@@ -0,0 +1,55 @@
1
+ class Jets::Builders
2
+ class CodeSize
3
+ LAMBDA_SIZE_LIMIT = 250 # Total lambda limit is 250MB
4
+ include Util
5
+
6
+ def self.check!
7
+ new.check
8
+ end
9
+
10
+ def check
11
+ return if within_lambda_limit?
12
+ say "Over the Lambda size limit of #{LAMBDA_SIZE_LIMIT}MB".colorize(:red)
13
+ say "Please reduce the size of your code."
14
+ display_sizes
15
+ exit 1
16
+ end
17
+
18
+ def within_lambda_limit?
19
+ total_size < LAMBDA_SIZE_LIMIT * 1024 # 120MB
20
+ end
21
+
22
+ def total_size
23
+ code_size = compute_size("#{stage_area}/code")
24
+ opt_size = compute_size("#{stage_area}/opt")
25
+ opt_size + code_size # total_size
26
+ end
27
+
28
+ def display_sizes
29
+ code_size = compute_size("#{stage_area}/code")
30
+ opt_size = compute_size("#{stage_area}/opt")
31
+ total_size = opt_size + code_size
32
+ overlimit = (LAMBDA_SIZE_LIMIT * 1024 - total_size) * -1
33
+ say "Sizes:"
34
+ say "Code: #{megabytes(code_size)} - #{stage_area}/code"
35
+ say "Gem Layer: #{megabytes(opt_size)} - #{stage_area}/opt"
36
+ say "Total Package: #{megabytes(total_size)}"
37
+ say "Over limit by: #{megabytes(overlimit)}"
38
+ # sh "du -csh #{stage_area}/*" unless ENV['TEST'] # uncomment to debug
39
+ end
40
+
41
+ def compute_size(path)
42
+ out = `du -s #{path}`
43
+ out.split(' ').first.to_i # bytes
44
+ end
45
+
46
+ def megabytes(bytes)
47
+ n = bytes / 1024.0
48
+ sprintf('%.1f', n) + 'MB'
49
+ end
50
+
51
+ def say(message)
52
+ puts message unless ENV['TEST']
53
+ end
54
+ end
55
+ end
@@ -17,15 +17,36 @@ class Jets::Builders
17
17
  gem_extractor.run
18
18
  end
19
19
 
20
+ # At this point the current compiled gems have been removed and compiled gems
21
+ # have been unpacked to code/opt. We can take the unpacked gems in opt and fully
22
+ # move them into vendor/bundle gems now.
23
+ move_opt_gems_to_vendor
24
+
20
25
  tidy
21
26
  end
22
27
 
23
- def report_missing_gems
28
+ def move_opt_gems_to_vendor
29
+ code = "#{Jets.build_root}/stage/code"
30
+ opt_gems = "#{code}/opt/ruby/gems/#{Jets::Gems.ruby_folder}"
31
+ vendor_gems = "#{code}/vendor/bundle/ruby/#{Jets::Gems.ruby_folder}"
32
+ # https://stackoverflow.com/questions/23698183/how-to-force-cp-to-overwrite-directory-instead-of-creating-another-one-inside
33
+ # $ cp -TRv foo/ bar/
34
+ sh "cp -TR #{opt_gems} #{vendor_gems}"
35
+ # clean up opt compiled gems
36
+ FileUtils.rm_rf("#{code}/opt/ruby")
37
+ end
24
38
 
39
+ def sh(command)
40
+ puts "=> #{command}".colorize(:green)
41
+ success = system(command)
42
+ abort("Command Failed") unless success
43
+ success
25
44
  end
26
45
 
27
46
  # remove unnecessary files to reduce package size
28
47
  def tidy
48
+ # project_root: /tmp/jets/demo/stage/code/
49
+ # /tmp/jets/demo/stage/code/bundled
29
50
  tidy_gems("#{@options[:project_root]}/bundled/gems/ruby/*/gems/*")
30
51
  tidy_gems("#{@options[:project_root]}/bundled/gems/ruby/*/bundler/gems/*")
31
52
  end
@@ -14,21 +14,47 @@ class Jets::Builders
14
14
  end
15
15
 
16
16
  def build
17
- common_base_shim
17
+ generate_data_yaml
18
18
  app_ruby_shims
19
19
  poly_shims
20
20
  shared_shims
21
21
  internal_shims
22
22
  end
23
23
 
24
+ # The handlers/data.yml is used by the shims
25
+ def generate_data_yaml
26
+ vars = Jets::Builders::ShimVars::Base.new
27
+ data = {
28
+ "s3_bucket" => vars.s3_bucket
29
+ }
30
+ data["rack_zip"] = vars.rack_zip if vars.rack_zip
31
+
32
+ content = YAML.dump(data)
33
+ path = "#{tmp_code}/handlers/data.yml"
34
+ FileUtils.mkdir_p(File.dirname(path))
35
+ IO.write(path, content)
36
+ end
37
+
24
38
  def app_ruby_shims
25
39
  app_files.each do |path|
26
- # Generates one big node shim for a entire controller.
40
+ # Generates one shim for each app class: controller, job, etc
27
41
  vars = Jets::Builders::ShimVars::App.new(path)
28
- generate_handler(vars)
42
+ if path.include?('app/functions')
43
+ copy_simple_function(path)
44
+ else
45
+ generate_handler(vars)
46
+ end
29
47
  end
30
48
  end
31
49
 
50
+ # source_path: app/functions/simple.rb
51
+ def copy_simple_function(source_path)
52
+ # Handler: handlers/controllers/posts_controller.handle
53
+ dest_path = source_path.sub('app/functions', 'handlers/functions')
54
+ FileUtils.mkdir_p(File.dirname(dest_path))
55
+ FileUtils.cp(source_path, dest_path)
56
+ end
57
+
32
58
  def app_files
33
59
  Jets::Commands::Build.app_files
34
60
  end
@@ -127,8 +153,8 @@ class Jets::Builders
127
153
  end
128
154
 
129
155
  def generate_handler(vars)
130
- result = evaluate_template("handler.js", vars)
131
- dest = "#{tmp_code}/#{vars.js_path}"
156
+ result = evaluate_template("handler.rb", vars)
157
+ dest = "#{tmp_code}/#{vars.dest_path}"
132
158
  FileUtils.mkdir_p(File.dirname(dest))
133
159
  IO.write(dest, result)
134
160
  end