jets.benforeva 3.0.17.pre.mount.pre.fix

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 (459) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +92 -0
  3. data/.cody/README.md +13 -0
  4. data/.cody/docs/bin/build.sh +7 -0
  5. data/.cody/docs/bin/bundler_setup.sh +8 -0
  6. data/.cody/docs/bin/cli_docs.sh +6 -0
  7. data/.cody/docs/bin/git_commit.sh +27 -0
  8. data/.cody/docs/bin/git_setup.sh +12 -0
  9. data/.cody/docs/bin/subnav.sh +14 -0
  10. data/.cody/docs/buildspec.yml +10 -0
  11. data/.cody/docs/project.rb +10 -0
  12. data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
  13. data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
  14. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  15. data/.github/ISSUE_TEMPLATE/question.md +14 -0
  16. data/.github/ISSUE_TEMPLATE.md +7 -0
  17. data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
  18. data/.gitignore +24 -0
  19. data/.gitmodules +0 -0
  20. data/.python-version +1 -0
  21. data/.rspec +4 -0
  22. data/.ruby-gemset +1 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +1035 -0
  25. data/CONDUCT.md +1 -0
  26. data/CONTRIBUTING.md +1 -0
  27. data/Dockerfile +16 -0
  28. data/Dockerfile.base +53 -0
  29. data/Gemfile +14 -0
  30. data/Guardfile +22 -0
  31. data/LICENSE.txt +22 -0
  32. data/Procfile +2 -0
  33. data/README.md +212 -0
  34. data/Rakefile +24 -0
  35. data/backers.md +20 -0
  36. data/bin/release +9 -0
  37. data/exe/jets.benforeva +14 -0
  38. data/jets.benforeva.gemspec +71 -0
  39. data/lib/jets/application/defaults.rb +200 -0
  40. data/lib/jets/application.rb +240 -0
  41. data/lib/jets/authorizer/base.rb +36 -0
  42. data/lib/jets/authorizer/dsl.rb +69 -0
  43. data/lib/jets/authorizer/helpers/iam_helper.rb +47 -0
  44. data/lib/jets/autoloaders.rb +112 -0
  45. data/lib/jets/aws_info.rb +111 -0
  46. data/lib/jets/aws_services/global_memoist.rb +57 -0
  47. data/lib/jets/aws_services/s3_bucket.rb +34 -0
  48. data/lib/jets/aws_services/stack_status.rb +64 -0
  49. data/lib/jets/aws_services.rb +95 -0
  50. data/lib/jets/booter.rb +167 -0
  51. data/lib/jets/builders/code_builder.rb +410 -0
  52. data/lib/jets/builders/code_size.rb +57 -0
  53. data/lib/jets/builders/gem_replacer.rb +89 -0
  54. data/lib/jets/builders/handler_generator.rb +186 -0
  55. data/lib/jets/builders/lambda_layer.rb +68 -0
  56. data/lib/jets/builders/md5.rb +60 -0
  57. data/lib/jets/builders/md5_zip.rb +61 -0
  58. data/lib/jets/builders/purger.rb +35 -0
  59. data/lib/jets/builders/rack_packager.rb +51 -0
  60. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  61. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  62. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  63. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  64. data/lib/jets/builders/ruby_packager.rb +235 -0
  65. data/lib/jets/builders/shim_vars/app.rb +78 -0
  66. data/lib/jets/builders/shim_vars/base.rb +25 -0
  67. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  68. data/lib/jets/builders/templates/handler.rb +12 -0
  69. data/lib/jets/builders/tidy.rb +107 -0
  70. data/lib/jets/builders/util.rb +31 -0
  71. data/lib/jets/bundle.rb +88 -0
  72. data/lib/jets/camelizer.rb +4 -0
  73. data/lib/jets/cfn/builders/api_deployment_builder.rb +56 -0
  74. data/lib/jets/cfn/builders/api_gateway_builder.rb +123 -0
  75. data/lib/jets/cfn/builders/api_resources_builder.rb +44 -0
  76. data/lib/jets/cfn/builders/authorizer_builder.rb +67 -0
  77. data/lib/jets/cfn/builders/base_child_builder.rb +69 -0
  78. data/lib/jets/cfn/builders/controller_builder.rb +50 -0
  79. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  80. data/lib/jets/cfn/builders/interface.rb +133 -0
  81. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  82. data/lib/jets/cfn/builders/parent_builder/stagger.rb +34 -0
  83. data/lib/jets/cfn/builders/parent_builder.rb +130 -0
  84. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  85. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  86. data/lib/jets/cfn/builders/util/source.rb +21 -0
  87. data/lib/jets/cfn/built_template.rb +15 -0
  88. data/lib/jets/cfn/ship.rb +188 -0
  89. data/lib/jets/cfn/status.rb +10 -0
  90. data/lib/jets/cfn/template_source.rb +61 -0
  91. data/lib/jets/cfn/upload.rb +157 -0
  92. data/lib/jets/cli.rb +208 -0
  93. data/lib/jets/commands/base.rb +145 -0
  94. data/lib/jets/commands/build.rb +252 -0
  95. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  96. data/lib/jets/commands/call/autoload_guesser.rb +136 -0
  97. data/lib/jets/commands/call/base_guesser.rb +62 -0
  98. data/lib/jets/commands/call/guesser.rb +48 -0
  99. data/lib/jets/commands/call.rb +182 -0
  100. data/lib/jets/commands/clean/base.rb +24 -0
  101. data/lib/jets/commands/clean/build.rb +13 -0
  102. data/lib/jets/commands/clean/log.rb +111 -0
  103. data/lib/jets/commands/clean.rb +19 -0
  104. data/lib/jets/commands/configure.rb +51 -0
  105. data/lib/jets/commands/console.rb +12 -0
  106. data/lib/jets/commands/db/environment-task.rake +3 -0
  107. data/lib/jets/commands/db/tasks/dummy/app.rb +25 -0
  108. data/lib/jets/commands/db/tasks/dummy/config.rb +14 -0
  109. data/lib/jets/commands/db/tasks.rb +34 -0
  110. data/lib/jets/commands/db.rb +13 -0
  111. data/lib/jets/commands/dbconsole.rb +134 -0
  112. data/lib/jets/commands/delete.rb +136 -0
  113. data/lib/jets/commands/deploy.rb +137 -0
  114. data/lib/jets/commands/dotenv.rb +9 -0
  115. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  116. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  117. data/lib/jets/commands/dynamodb.rb +19 -0
  118. data/lib/jets/commands/gems.rb +13 -0
  119. data/lib/jets/commands/help/build.md +6 -0
  120. data/lib/jets/commands/help/call.md +69 -0
  121. data/lib/jets/commands/help/clean/build.md +5 -0
  122. data/lib/jets/commands/help/clean/log.md +5 -0
  123. data/lib/jets/commands/help/console.md +18 -0
  124. data/lib/jets/commands/help/db/generate.md +8 -0
  125. data/lib/jets/commands/help/dbconsole.md +9 -0
  126. data/lib/jets/commands/help/degenerate.md +16 -0
  127. data/lib/jets/commands/help/delete.md +22 -0
  128. data/lib/jets/commands/help/deploy.md +32 -0
  129. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  130. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  131. data/lib/jets/commands/help/gems/check.md +6 -0
  132. data/lib/jets/commands/help/generate.md +28 -0
  133. data/lib/jets/commands/help/import/rack.md +13 -0
  134. data/lib/jets/commands/help/import/rails.md +11 -0
  135. data/lib/jets/commands/help/new.md +42 -0
  136. data/lib/jets/commands/help/routes.md +16 -0
  137. data/lib/jets/commands/help/runner.md +17 -0
  138. data/lib/jets/commands/help/server.md +15 -0
  139. data/lib/jets/commands/help/status.md +14 -0
  140. data/lib/jets/commands/help/upgrade.md +7 -0
  141. data/lib/jets/commands/help/url.md +6 -0
  142. data/lib/jets/commands/help.rb +9 -0
  143. data/lib/jets/commands/import/base.rb +49 -0
  144. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  145. data/lib/jets/commands/import/rack.rb +16 -0
  146. data/lib/jets/commands/import/rails.rb +74 -0
  147. data/lib/jets/commands/import/sequence.rb +90 -0
  148. data/lib/jets/commands/import/templates/config/database.yml +30 -0
  149. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  150. data/lib/jets/commands/import.rb +12 -0
  151. data/lib/jets/commands/main.rb +166 -0
  152. data/lib/jets/commands/markdown/creator.rb +58 -0
  153. data/lib/jets/commands/markdown/index.rb +27 -0
  154. data/lib/jets/commands/markdown/page.rb +125 -0
  155. data/lib/jets/commands/markdown/shell.rb +11 -0
  156. data/lib/jets/commands/new.rb +173 -0
  157. data/lib/jets/commands/rake_command.rb +61 -0
  158. data/lib/jets/commands/rake_tasks.rb +50 -0
  159. data/lib/jets/commands/runner.rb +16 -0
  160. data/lib/jets/commands/sequence.rb +105 -0
  161. data/lib/jets/commands/stack_info.rb +30 -0
  162. data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
  163. data/lib/jets/commands/templates/skeleton/.env.test +3 -0
  164. data/lib/jets/commands/templates/skeleton/.env.tt +3 -0
  165. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  166. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  167. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  168. data/lib/jets/commands/templates/skeleton/Gemfile.tt +39 -0
  169. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  170. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  171. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  172. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  173. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  174. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  175. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  176. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  177. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +26 -0
  178. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +71 -0
  179. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -0
  180. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  181. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
  182. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
  183. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
  184. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  185. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  186. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  187. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  188. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  189. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  190. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  191. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  192. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  193. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  194. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  195. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  196. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +23 -0
  197. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  198. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  199. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  200. data/lib/jets/commands/upgrade/version1.rb +136 -0
  201. data/lib/jets/commands/upgrade.rb +105 -0
  202. data/lib/jets/commands/url.rb +69 -0
  203. data/lib/jets/commands/webpacker_template.rb +18 -0
  204. data/lib/jets/controller/authorization.rb +91 -0
  205. data/lib/jets/controller/base.rb +175 -0
  206. data/lib/jets/controller/callbacks.rb +73 -0
  207. data/lib/jets/controller/cookies/jar.rb +269 -0
  208. data/lib/jets/controller/cookies.rb +38 -0
  209. data/lib/jets/controller/error/invalid_authenticity_token.rb +6 -0
  210. data/lib/jets/controller/error.rb +4 -0
  211. data/lib/jets/controller/forgery_protection.rb +43 -0
  212. data/lib/jets/controller/layout.rb +17 -0
  213. data/lib/jets/controller/middleware/cors.rb +60 -0
  214. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  215. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  216. data/lib/jets/controller/middleware/local/route_matcher.rb +22 -0
  217. data/lib/jets/controller/middleware/local.rb +120 -0
  218. data/lib/jets/controller/middleware/main.rb +53 -0
  219. data/lib/jets/controller/middleware/reloader.rb +15 -0
  220. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  221. data/lib/jets/controller/parameters_filter.rb +29 -0
  222. data/lib/jets/controller/params.rb +117 -0
  223. data/lib/jets/controller/rack/adapter.rb +94 -0
  224. data/lib/jets/controller/rack/env.rb +122 -0
  225. data/lib/jets/controller/redirection.rb +51 -0
  226. data/lib/jets/controller/rendering/rack_renderer.rb +267 -0
  227. data/lib/jets/controller/rendering.rb +96 -0
  228. data/lib/jets/controller/request.rb +29 -0
  229. data/lib/jets/controller/response.rb +61 -0
  230. data/lib/jets/controller/stage.rb +34 -0
  231. data/lib/jets/controller.rb +3 -0
  232. data/lib/jets/core.rb +157 -0
  233. data/lib/jets/core_ext/bundler.rb +7 -0
  234. data/lib/jets/core_ext/kernel.rb +13 -0
  235. data/lib/jets/db.rb +15 -0
  236. data/lib/jets/dotenv/show.rb +11 -0
  237. data/lib/jets/dotenv/ssm.rb +64 -0
  238. data/lib/jets/dotenv.rb +48 -0
  239. data/lib/jets/erb.rb +51 -0
  240. data/lib/jets/generator/templates/active_job/job/templates/application_job.rb.tt +6 -0
  241. data/lib/jets/generator/templates/active_job/job/templates/job.rb.tt +8 -0
  242. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  243. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +34 -0
  244. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  245. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  246. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  247. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  248. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  249. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  250. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  251. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  252. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  253. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  254. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  255. data/lib/jets/generator.rb +112 -0
  256. data/lib/jets/inflections.rb +32 -0
  257. data/lib/jets/internal/app/controllers/jets/bare_controller.rb +16 -0
  258. data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
  259. data/lib/jets/internal/app/controllers/jets/mount_controller.rb +63 -0
  260. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  261. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +12 -0
  262. data/lib/jets/internal/app/functions/jets/base_path.rb +18 -0
  263. data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +100 -0
  264. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
  265. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
  266. data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +33 -0
  267. data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
  268. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
  269. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  270. data/lib/jets/internal/turbines/jets/mailer.rb +52 -0
  271. data/lib/jets/job/base.rb +49 -0
  272. data/lib/jets/job/dsl/dynamodb_event.rb +67 -0
  273. data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
  274. data/lib/jets/job/dsl/iot_event.rb +24 -0
  275. data/lib/jets/job/dsl/kinesis_event.rb +46 -0
  276. data/lib/jets/job/dsl/log_event.rb +15 -0
  277. data/lib/jets/job/dsl/rule_event.rb +75 -0
  278. data/lib/jets/job/dsl/s3_event.rb +36 -0
  279. data/lib/jets/job/dsl/sns_event.rb +54 -0
  280. data/lib/jets/job/dsl/sqs_event.rb +96 -0
  281. data/lib/jets/job/dsl.rb +40 -0
  282. data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
  283. data/lib/jets/job/helpers/log_event_helper.rb +17 -0
  284. data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
  285. data/lib/jets/klass.rb +109 -0
  286. data/lib/jets/lambda/dsl.rb +404 -0
  287. data/lib/jets/lambda/function.rb +29 -0
  288. data/lib/jets/lambda/function_constructor.rb +55 -0
  289. data/lib/jets/lambda/functions.rb +39 -0
  290. data/lib/jets/lambda/task.rb +111 -0
  291. data/lib/jets/logger.rb +21 -0
  292. data/lib/jets/mega/hash_converter.rb +25 -0
  293. data/lib/jets/mega/request/source.rb +21 -0
  294. data/lib/jets/mega/request.rb +163 -0
  295. data/lib/jets/middleware/configurator.rb +84 -0
  296. data/lib/jets/middleware/default_stack.rb +53 -0
  297. data/lib/jets/middleware/layer.rb +34 -0
  298. data/lib/jets/middleware/stack.rb +77 -0
  299. data/lib/jets/middleware.rb +33 -0
  300. data/lib/jets/naming.rb +63 -0
  301. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  302. data/lib/jets/overrides/lambda.rb +1 -0
  303. data/lib/jets/overrides/rails/action_controller.rb +13 -0
  304. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  305. data/lib/jets/overrides/rails/common_methods.rb +13 -0
  306. data/lib/jets/overrides/rails/migration_checker.rb +34 -0
  307. data/lib/jets/overrides/rails/rendering_helper.rb +27 -0
  308. data/lib/jets/overrides/rails/url_helper.rb +88 -0
  309. data/lib/jets/overrides/rails.rb +6 -0
  310. data/lib/jets/poly_fun/base_executor.rb +125 -0
  311. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  312. data/lib/jets/poly_fun/node_error.rb +8 -0
  313. data/lib/jets/poly_fun/node_executor.rb +54 -0
  314. data/lib/jets/poly_fun/python_error.rb +8 -0
  315. data/lib/jets/poly_fun/python_executor.rb +23 -0
  316. data/lib/jets/poly_fun.rb +73 -0
  317. data/lib/jets/preheat.rb +117 -0
  318. data/lib/jets/processors/deducer.rb +65 -0
  319. data/lib/jets/processors/main_processor.rb +61 -0
  320. data/lib/jets/rack_server.rb +86 -0
  321. data/lib/jets/rdoc.rb +30 -0
  322. data/lib/jets/resource/api_gateway/authorizer.rb +82 -0
  323. data/lib/jets/resource/api_gateway/base_path/function.rb +49 -0
  324. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  325. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  326. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  327. data/lib/jets/resource/api_gateway/deployment.rb +80 -0
  328. data/lib/jets/resource/api_gateway/domain_name.rb +65 -0
  329. data/lib/jets/resource/api_gateway/method/authorization.rb +41 -0
  330. data/lib/jets/resource/api_gateway/method.rb +102 -0
  331. data/lib/jets/resource/api_gateway/resource.rb +82 -0
  332. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +10 -0
  333. data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +49 -0
  334. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +98 -0
  335. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +136 -0
  336. data/lib/jets/resource/api_gateway/rest_api/routes/change/media_types.rb +36 -0
  337. data/lib/jets/resource/api_gateway/rest_api/routes/change/page.rb +93 -0
  338. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +25 -0
  339. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +35 -0
  340. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +16 -0
  341. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  342. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
  343. data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
  344. data/lib/jets/resource/api_gateway/rest_api.rb +64 -0
  345. data/lib/jets/resource/associated.rb +37 -0
  346. data/lib/jets/resource/base.rb +28 -0
  347. data/lib/jets/resource/child_stack/api_deployment.rb +58 -0
  348. data/lib/jets/resource/child_stack/api_gateway.rb +23 -0
  349. data/lib/jets/resource/child_stack/api_resource/page.rb +20 -0
  350. data/lib/jets/resource/child_stack/api_resource.rb +54 -0
  351. data/lib/jets/resource/child_stack/app_class.rb +149 -0
  352. data/lib/jets/resource/child_stack/authorizer.rb +40 -0
  353. data/lib/jets/resource/child_stack/base.rb +24 -0
  354. data/lib/jets/resource/child_stack/common_parameters.rb +14 -0
  355. data/lib/jets/resource/child_stack/shared.rb +85 -0
  356. data/lib/jets/resource/config/config_rule.rb +74 -0
  357. data/lib/jets/resource/config/managed_rule.rb +15 -0
  358. data/lib/jets/resource/events/rule.rb +31 -0
  359. data/lib/jets/resource/iam/application_role.rb +27 -0
  360. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  361. data/lib/jets/resource/iam/class_role.rb +74 -0
  362. data/lib/jets/resource/iam/function_role.rb +54 -0
  363. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  364. data/lib/jets/resource/iam/policy_document.rb +41 -0
  365. data/lib/jets/resource/iot/topic_rule.rb +34 -0
  366. data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
  367. data/lib/jets/resource/lambda/function/environment.rb +62 -0
  368. data/lib/jets/resource/lambda/function.rb +221 -0
  369. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  370. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  371. data/lib/jets/resource/logs/subscription_filter.rb +31 -0
  372. data/lib/jets/resource/permission.rb +45 -0
  373. data/lib/jets/resource/replacer.rb +85 -0
  374. data/lib/jets/resource/route53/record_set.rb +98 -0
  375. data/lib/jets/resource/s3/bucket.rb +24 -0
  376. data/lib/jets/resource/sns/subscription.rb +29 -0
  377. data/lib/jets/resource/sns/topic.rb +35 -0
  378. data/lib/jets/resource/sns/topic_policy.rb +40 -0
  379. data/lib/jets/resource/sqs/queue.rb +21 -0
  380. data/lib/jets/resource/standardizer.rb +42 -0
  381. data/lib/jets/resource.rb +71 -0
  382. data/lib/jets/router/dsl/mount.rb +13 -0
  383. data/lib/jets/router/dsl.rb +144 -0
  384. data/lib/jets/router/error.rb +4 -0
  385. data/lib/jets/router/finder.rb +47 -0
  386. data/lib/jets/router/helpers/core_helper.rb +27 -0
  387. data/lib/jets/router/helpers/named_routes_helper.rb +8 -0
  388. data/lib/jets/router/helpers.rb +4 -0
  389. data/lib/jets/router/matcher.rb +81 -0
  390. data/lib/jets/router/method_creator/code.rb +99 -0
  391. data/lib/jets/router/method_creator/edit.rb +12 -0
  392. data/lib/jets/router/method_creator/generic.rb +11 -0
  393. data/lib/jets/router/method_creator/index.rb +48 -0
  394. data/lib/jets/router/method_creator/new.rb +12 -0
  395. data/lib/jets/router/method_creator/root.rb +15 -0
  396. data/lib/jets/router/method_creator/show.rb +12 -0
  397. data/lib/jets/router/method_creator.rb +50 -0
  398. data/lib/jets/router/resources/base.rb +7 -0
  399. data/lib/jets/router/resources/filter.rb +15 -0
  400. data/lib/jets/router/resources/options.rb +13 -0
  401. data/lib/jets/router/route/authorizer.rb +57 -0
  402. data/lib/jets/router/route.rb +230 -0
  403. data/lib/jets/router/scope.rb +95 -0
  404. data/lib/jets/router/util.rb +38 -0
  405. data/lib/jets/router.rb +180 -0
  406. data/lib/jets/rule/base.rb +19 -0
  407. data/lib/jets/rule/dsl.rb +109 -0
  408. data/lib/jets/spec_helpers/controllers/params.rb +8 -0
  409. data/lib/jets/spec_helpers/controllers/request.rb +101 -0
  410. data/lib/jets/spec_helpers/controllers/response.rb +10 -0
  411. data/lib/jets/spec_helpers/controllers.rb +47 -0
  412. data/lib/jets/spec_helpers/fixtures.rb +11 -0
  413. data/lib/jets/spec_helpers.rb +21 -0
  414. data/lib/jets/stack/builder.rb +43 -0
  415. data/lib/jets/stack/definition.rb +50 -0
  416. data/lib/jets/stack/depends/item.rb +26 -0
  417. data/lib/jets/stack/depends.rb +34 -0
  418. data/lib/jets/stack/function.rb +69 -0
  419. data/lib/jets/stack/main/dsl/base.rb +63 -0
  420. data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
  421. data/lib/jets/stack/main/dsl/iam.rb +8 -0
  422. data/lib/jets/stack/main/dsl/kinesis.rb +15 -0
  423. data/lib/jets/stack/main/dsl/lambda.rb +83 -0
  424. data/lib/jets/stack/main/dsl/s3.rb +12 -0
  425. data/lib/jets/stack/main/dsl/sns.rb +16 -0
  426. data/lib/jets/stack/main/dsl/sqs.rb +10 -0
  427. data/lib/jets/stack/main/dsl.rb +17 -0
  428. data/lib/jets/stack/main.rb +4 -0
  429. data/lib/jets/stack/output/dsl.rb +19 -0
  430. data/lib/jets/stack/output/lookup.rb +36 -0
  431. data/lib/jets/stack/output.rb +35 -0
  432. data/lib/jets/stack/parameter/dsl.rb +42 -0
  433. data/lib/jets/stack/parameter.rb +37 -0
  434. data/lib/jets/stack/resource/dsl.rb +19 -0
  435. data/lib/jets/stack/resource.rb +31 -0
  436. data/lib/jets/stack/s3_event.rb +87 -0
  437. data/lib/jets/stack.rb +88 -0
  438. data/lib/jets/tmp_loader.rb +53 -0
  439. data/lib/jets/turbine.rb +41 -0
  440. data/lib/jets/turbo/database_yaml.rb +41 -0
  441. data/lib/jets/turbo/project/.gitignore +12 -0
  442. data/lib/jets/turbo/project/.jetskeep +1 -0
  443. data/lib/jets/turbo/project/Gemfile +16 -0
  444. data/lib/jets/turbo/project/Rakefile +2 -0
  445. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  446. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  447. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  448. data/lib/jets/turbo/project/config/application.rb +5 -0
  449. data/lib/jets/turbo/project/config/routes.rb +4 -0
  450. data/lib/jets/turbo/project/config.ru +5 -0
  451. data/lib/jets/turbo/rails.rb +127 -0
  452. data/lib/jets/turbo/templates/config/database.yml +30 -0
  453. data/lib/jets/turbo.rb +56 -0
  454. data/lib/jets/util.rb +40 -0
  455. data/lib/jets/version.rb +3 -0
  456. data/lib/jets.rb +31 -0
  457. data/readme/prerelease.md +6 -0
  458. data/readme/testing.md +60 -0
  459. metadata +1105 -0
@@ -0,0 +1,410 @@
1
+ require "action_view"
2
+ require "fileutils"
3
+ require "net/http"
4
+ require "open-uri"
5
+ require "socket"
6
+
7
+ # Some important folders to help understand how jets builds a project:
8
+ #
9
+ # /tmp/jets: build root where different jets projects get built.
10
+ # /tmp/jets/project: each jets project gets built in a different subdirectory.
11
+ #
12
+ # The rest of the folders are subfolders under /tmp/jets/project.
13
+ #
14
+ module Jets::Builders
15
+ class CodeBuilder
16
+ include Jets::AwsServices
17
+ include Util
18
+ extend Memoist
19
+
20
+ attr_reader :full_project_path
21
+ def initialize
22
+ # Expanding to the full path and capture now.
23
+ # Dir.chdir gets called later and we'll lose this info.
24
+ @full_project_path = File.expand_path(Jets.root) + "/"
25
+ @version_purger = Purger.new
26
+ end
27
+
28
+ def build
29
+ check_ruby_version
30
+ @version_purger.purge
31
+ cache_check_message
32
+
33
+ clean_start
34
+ compile_assets # easier to do before we copy the project because node and yarn has been likely setup in the that dir
35
+ compile_rails_assets
36
+ copy_project
37
+ copy_ruby_version_file
38
+ Dir.chdir("#{stage_area}/code") do
39
+ # These commands run from project root
40
+ code_setup
41
+ package_ruby
42
+ code_finish
43
+ end
44
+ end
45
+
46
+ # Resolves the chicken-and-egg problem with md5 checksums. The handlers need
47
+ # to reference files with the md5 checksum. The files are the:
48
+ #
49
+ # jets/code/rack-checksum.zip
50
+ # jets/code/opt-checksum.zip
51
+ #
52
+ # We compute the checksums before we generate the node shim handlers.
53
+ def calculate_md5s
54
+ Md5.compute! # populates Md5.checksums hash
55
+ end
56
+
57
+ def generate_shims
58
+ headline "Generating shims in the handlers folder."
59
+ # Crucial that the Dir.pwd is in the tmp_code because for
60
+ # Jets::Builders::app_files because Jets.boot set ups
61
+ # autoload_paths and this is how project classes are loaded.
62
+ Jets::Builders::HandlerGenerator.build!
63
+ end
64
+
65
+ def create_zip_files
66
+ folders = Md5.stage_folders
67
+ # Md5.stage_folders ["stage/bundled", "stage/code"]
68
+ folders.each do |folder|
69
+ zip = Md5Zip.new(folder)
70
+ if exist_on_s3?(zip.md5_name)
71
+ puts "Already exists: s3://#{s3_bucket}/jets/code/#{zip.md5_name}"
72
+ else
73
+ zip = Md5Zip.new(folder)
74
+ zip.create
75
+ end
76
+ end
77
+ end
78
+
79
+ def exist_on_s3?(filename)
80
+ return false if ENV['JETS_BUILD_NO_INTERNET']
81
+ s3_key = "jets/code/#{filename}"
82
+ begin
83
+ s3.head_object(bucket: s3_bucket, key: s3_key)
84
+ true
85
+ rescue Aws::S3::Errors::NotFound, Aws::S3::Errors::Forbidden
86
+ false
87
+ end
88
+ end
89
+
90
+ def code_setup
91
+ reconfigure_development_webpacker
92
+ end
93
+
94
+ def code_finish
95
+ # Reconfigure code
96
+ store_s3_base_url
97
+ disable_webpacker_middleware
98
+ copy_internal_jets_code
99
+
100
+ # Code prep and zipping
101
+ check_code_size!
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
113
+ create_zip_files
114
+ end
115
+
116
+ def check_code_size!
117
+ CodeSize.check!
118
+ end
119
+
120
+ # Materialized internal code into actually user Jets app as part of the deploy process.
121
+ # Examples of things that we might materialize:
122
+ #
123
+ # Views
124
+ # Simple Functions
125
+ #
126
+ # For functions, We copy the files into the project because we cannot require
127
+ # simple functions directly since they are wrapped by an anonymous class.
128
+ def copy_internal_jets_code
129
+ files = []
130
+
131
+ mailers_controller = Jets::Router.has_controller?("Jets::MailersController")
132
+ if mailers_controller
133
+ files << "app/controllers/jets/mailers_controller.rb"
134
+ files << "app/views/jets/mailers"
135
+ files << "app/helpers/jets/mailers_helper.rb"
136
+ end
137
+
138
+ files.each do |relative_path|
139
+ src = File.expand_path("../internal/#{relative_path}", File.dirname(__FILE__))
140
+ dest = "#{"#{stage_area}/code"}/#{relative_path}"
141
+ FileUtils.mkdir_p(File.dirname(dest))
142
+ FileUtils.cp_r(src, dest)
143
+ end
144
+ end
145
+
146
+ # Thanks https://stackoverflow.com/questions/9354595/recursively-getting-the-size-of-a-directory
147
+ # Seems to overestimate a little bit but close enough.
148
+ def dir_size(folder)
149
+ Dir.glob(File.join(folder, '**', '*'))
150
+ .select { |f| File.file?(f) }
151
+ .map{ |f| File.size(f) }
152
+ .inject(:+)
153
+ end
154
+
155
+ # Store s3 base url is needed for asset serving from s3 later. Need to package this
156
+ # as part of the code so we have a reference to it.
157
+ # At this point the minimal stack exists, so we can grab it with the AWS API.
158
+ # We do not want to grab this as part of the live request because it is slow.
159
+ def store_s3_base_url
160
+ write_s3_base_url("#{stage_area}/code/config/s3_base_url.txt")
161
+ write_s3_base_url("#{stage_area}/rack/config/s3_base_url.txt") if Jets.rack?
162
+ end
163
+
164
+ def write_s3_base_url(full_path)
165
+ FileUtils.mkdir_p(File.dirname(full_path))
166
+ IO.write(full_path, s3_base_url)
167
+ end
168
+
169
+ def s3_base_url
170
+ # Allow user to set assets.base_url
171
+ #
172
+ # Jets.application.configure do
173
+ # config.assets.base_url = "https://cloudfront.com/my/base/path"
174
+ # end
175
+ #
176
+ return Jets.config.assets.base_url if Jets.config.assets.base_url
177
+
178
+ region = Jets.aws.region
179
+
180
+ asset_base_url = region == 'us-east-1' ?
181
+ "https://s3.amazonaws.com" :
182
+ "https://s3-#{region}.amazonaws.com"
183
+ "#{asset_base_url}/#{s3_bucket}/jets" # s3_base_url
184
+ end
185
+
186
+ def s3_bucket
187
+ Jets.aws.s3_bucket
188
+ end
189
+
190
+ def disable_webpacker_middleware
191
+ full_path = "#{"#{stage_area}/code"}/config/disable-webpacker-middleware.txt"
192
+ FileUtils.mkdir_p(File.dirname(full_path))
193
+ FileUtils.touch(full_path)
194
+ end
195
+
196
+ # This happens in the current app directory not the tmp code for simplicity.
197
+ # This is because the node and yarn has likely been set up correctly there.
198
+ def compile_assets
199
+ if ENV['JETS_SKIP_ASSETS']
200
+ puts "Skip compiling assets".color(:yellow) # useful for debugging
201
+ return
202
+ end
203
+
204
+ headline "Compling assets in current project directory"
205
+ return unless webpacker_included?
206
+
207
+ sh("yarn install")
208
+ webpack_command = File.exist?("#{Jets.root}/bin/webpack") ?
209
+ "bin/webpack" :
210
+ `which webpack`.strip
211
+ sh "JETS_ENV=#{Jets.env} #{webpack_command}"
212
+ end
213
+
214
+ def webpacker_included?
215
+ # Old code, leaving around for now:
216
+ # Thanks: https://stackoverflow.com/questions/4195735/get-list-of-gems-being-used-by-a-bundler-project
217
+ # webpacker_loaded = Gem.loaded_specs.keys.include?("webpacker")
218
+ # return unless webpacker_loaded
219
+
220
+ # Checking this way because when using jets standalone for Afterburner mode we don't want to run into
221
+ # bundler gem collisions. TODO: figure out the a better way to handle the collisions.
222
+ lines = IO.readlines("#{Jets.root}/Gemfile")
223
+ lines.detect { |l| l =~ /webpacker/ || l =~ /jetpacker/ }
224
+ end
225
+
226
+ # This happens in the current app directory not the tmp code for simplicity
227
+ # This is because the node likely been set up correctly there.
228
+ def compile_rails_assets
229
+ return unless Jets.rack? && rails? && !rails_api?
230
+
231
+ if ENV['JETS_SKIP_ASSETS']
232
+ puts "Skip compiling rack assets".color(:yellow) # useful for debugging
233
+ return
234
+ end
235
+
236
+ # Need to capture JETS_ROOT since can be changed by Turbo mode
237
+ jets_root = Jets.root
238
+ Bundler.with_unbundled_env do
239
+ # Switch gemfile for Afterburner mode
240
+ gemfile = ENV['BUNDLE_GEMFILE']
241
+ ENV['BUNDLE_GEMFILE'] = "#{jets_root}/rack/Gemfile"
242
+ sh "cd #{jets_root} && bundle install"
243
+ ENV['BUNDLE_GEMFILE'] = gemfile
244
+
245
+ rails_assets(:clobber, jets_root: jets_root)
246
+ rails_assets(:precompile, jets_root: jets_root)
247
+ end
248
+ end
249
+
250
+ def rails_assets(cmd, jets_root:)
251
+ # rake is available in both rails 4 and 5. rails command only in 5
252
+ command = "bundle exec rake assets:#{cmd} --trace"
253
+ command = "RAILS_ENV=#{Jets.env} #{command}" unless Jets.env.development?
254
+ sh("cd #{jets_root}/rack && #{command}")
255
+ end
256
+
257
+ # Rudimentary rails detection
258
+ # Duplicated in builders/reconfigure_rails.rb
259
+ def rails?
260
+ config_ru = "#{Jets.root}/rack/config.ru"
261
+ return false unless File.exist?(config_ru)
262
+ !IO.readlines(config_ru).grep(/Rails.application/).empty?
263
+ end
264
+
265
+ # Rudimentary rails api detection
266
+ # Duplicated in builders/reconfigure_rails.rb
267
+ # Another way of checking is loading a rails console and checking Rails.application.config.api_only
268
+ # Using this way for simplicity.
269
+ def rails_api?
270
+ config_app = "#{Jets.root}/rack/config/application.rb"
271
+ return false unless File.exist?(config_app)
272
+ !IO.readlines(config_app).grep(/config.api_only.*=.*true/).empty?
273
+ end
274
+
275
+ # Cleans out non-cached files like code-*.zip in Jets.build_root
276
+ # for a clean start. Also ensure that the /tmp/jets/project build root exists.
277
+ #
278
+ # Most files are kept around after the build process for inspection and
279
+ # debugging. So we have to clean out the files. But we only want to clean out
280
+ # some of the files.
281
+ def clean_start
282
+ Dir.glob("#{Jets.build_root}/code/code-*.zip").each { |f| FileUtils.rm_f(f) }
283
+ FileUtils.mkdir_p(Jets.build_root) # /tmp/jets/demo
284
+ end
285
+
286
+ # Copy project into temporary directory. Do this so we can keep the project
287
+ # directory untouched and we can also remove a bunch of unnecessary files like
288
+ # logs before zipping it up.
289
+ def copy_project
290
+ headline "Copying current project directory to temporary build area: #{"#{stage_area}/code"}"
291
+ FileUtils.rm_rf("#{build_area}/stage") # clear out from previous build's stage area
292
+ FileUtils.mkdir_p("#{build_area}/stage")
293
+ FileUtils.rm_rf("#{stage_area}/code") # remove current code folder
294
+ move_node_modules(Jets.root, Jets.build_root)
295
+ begin
296
+ # puts "cp -r #{@full_project_path} #{"#{stage_area}/code"}".color(:yellow) # uncomment to debug
297
+ Jets::Util.cp_r(@full_project_path, "#{stage_area}/code")
298
+ ensure
299
+ move_node_modules(Jets.build_root, Jets.root) # move node_modules directory back
300
+ end
301
+ end
302
+
303
+ # Move the node modules to the tmp build folder to speed up project copying.
304
+ # A little bit risky because a ctrl-c in the middle of the project copying
305
+ # results in a missing node_modules but user can easily rebuild that.
306
+ #
307
+ # Tesing shows 6.623413 vs 0.027754 speed improvement.
308
+ def move_node_modules(source_folder, dest_folder)
309
+ source = "#{source_folder}/node_modules"
310
+ dest = "#{dest_folder}/node_modules"
311
+ if File.exist?(source)
312
+ FileUtils.mv(source, dest)
313
+ end
314
+ end
315
+
316
+ # Bit hacky but this saves the user from accidentally forgetting to change this
317
+ # when they deploy a jets project in development mode
318
+ def reconfigure_development_webpacker
319
+ return unless Jets.env.development?
320
+ headline "Reconfiguring webpacker development settings for AWS Lambda."
321
+
322
+ webpacker_yml = "#{"#{stage_area}/code"}/config/webpacker.yml"
323
+ return unless File.exist?(webpacker_yml)
324
+
325
+ config = YAML.load_file(webpacker_yml)
326
+ config["development"]["compile"] = false # force this to be false for deployment
327
+ new_yaml = YAML.dump(config)
328
+ IO.write(webpacker_yml, new_yaml)
329
+ end
330
+
331
+ def ruby_packager
332
+ RubyPackager.new(tmp_code)
333
+ end
334
+ memoize :ruby_packager
335
+
336
+ def rack_packager
337
+ RackPackager.new("#{tmp_code}/rack")
338
+ end
339
+ memoize :rack_packager
340
+
341
+ def package_ruby
342
+ return if Jets.poly_only?
343
+
344
+ check_agree
345
+ ruby_packager.install
346
+ reconfigure_rails # call here after "#{stage_area}/code" is available
347
+ rack_packager.install
348
+ ruby_packager.finish # by this time we have a /tmp/jets/demo/stage/code/vendor/gems
349
+ rack_packager.finish
350
+
351
+ build_lambda_layer
352
+ end
353
+
354
+ def check_agree
355
+ agree = Jets::Gems::Agree.new
356
+ agree.prompt
357
+ end
358
+
359
+ def build_lambda_layer
360
+ return if Jets.poly_only?
361
+ lambda_layer = LambdaLayer.new
362
+ lambda_layer.build
363
+ end
364
+
365
+ # TODO: Move logic into plugin instead
366
+ def reconfigure_rails
367
+ ReconfigureRails.new("#{"#{stage_area}/code"}/rack").run
368
+ end
369
+
370
+ def cache_check_message
371
+ if File.exist?("#{Jets.build_root}/cache")
372
+ puts "The #{Jets.build_root}/cache folder exists. Incrementally re-building the jets using the cache. To clear the cache: rm -rf #{Jets.build_root}/cache"
373
+ end
374
+ end
375
+
376
+ def copy_ruby_version_file
377
+ ruby_version_path = Jets.root.join(".ruby-version")
378
+ return unless File.exists?(ruby_version_path)
379
+ FileUtils.cp_r(ruby_version_path, build_area)
380
+ end
381
+
382
+ SUPPORTED_RUBY_VERSIONS = %w[2.5 2.7]
383
+ def check_ruby_version
384
+ return unless ENV['JETS_RUBY_CHECK'] == '0' || Jets.config.ruby.check == false
385
+ return if ruby_version_supported?
386
+ puts <<~EOL.color(:red)
387
+ You are using Ruby version #{RUBY_VERSION} which is not supported by Jets.
388
+ Please use one of the Jets supported ruby versions: #{SUPPORTED_RUBY_VERSIONS.join(' ')}
389
+ If you would like to skip this check you can set: JETS_RUBY_CHECK=0
390
+ EOL
391
+ exit 1
392
+ end
393
+
394
+ def ruby_version_supported?
395
+ md = RUBY_VERSION.match(/(\d+)\.(\d+)\.\d+/)
396
+ major, minor = md[1], md[2]
397
+ detected_ruby = [major, minor].join('.')
398
+ SUPPORTED_RUBY_VERSIONS.include?(detected_ruby)
399
+ end
400
+
401
+ # Group all the path settings together here
402
+ def self.tmp_code
403
+ Jets::Commands::Build.tmp_code
404
+ end
405
+
406
+ def tmp_code
407
+ self.class.tmp_code
408
+ end
409
+ end
410
+ end
@@ -0,0 +1,57 @@
1
+ module 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".color(: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
+ say "Sometimes blowing away the /tmp/jets cache will reduce the size: rm -rf /tmp/jets"
39
+ # sh "du -kcsh #{stage_area}/*" unless Jets.env.test? # uncomment to debug
40
+ end
41
+
42
+ def compute_size(path)
43
+ # -k option is required for macosx but not for linux
44
+ out = `du -ks #{path}`
45
+ out.split(' ').first.to_i # bytes
46
+ end
47
+
48
+ def megabytes(bytes)
49
+ n = bytes / 1024.0
50
+ sprintf('%.1f', n) + 'MB'
51
+ end
52
+
53
+ def say(message)
54
+ puts message unless Jets.env.test?
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,89 @@
1
+ module Jets::Builders
2
+ class GemReplacer
3
+ extend Memoist
4
+ def initialize(options)
5
+ @options = options
6
+ end
7
+
8
+ def run
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)
12
+ if Jets.config.lambda.layers.empty?
13
+ found_gems = check.run! # exits early if missing gems found
14
+ else
15
+ # assumes missing gems are in the provided custom layer by the user
16
+ found_gems = check.run # does not exist early
17
+ end
18
+
19
+ # found gems will only have gems that were found
20
+ found_gems.each do |gem_name|
21
+ gem_extractor = Jets::Gems::Extract::Gem.new(gem_name, @options)
22
+ gem_extractor.run
23
+ rename_gem(gem_name)
24
+ end
25
+
26
+ tidy
27
+ end
28
+
29
+ def rename_gem(gem_name)
30
+ ruby_folder = "#{Jets.build_root}/stage/opt/ruby/gems/#{Jets::Gems.ruby_folder}"
31
+ gems_folder = "#{ruby_folder}/gems"
32
+ expr = "#{gems_folder}/#{gem_name}-x*-{darwin,linux}"
33
+ src = Dir.glob(expr).first
34
+ return unless src
35
+
36
+ dest = src.sub("-darwin", "-linux")
37
+ FileUtils.mv(src, dest) unless File.exist?(dest) # looks like rename_gem actually runs twice
38
+ end
39
+
40
+ def sh(command)
41
+ puts "=> #{command}".color(:green)
42
+ success = system(command)
43
+ abort("Command Failed: #{command}") unless success
44
+ success
45
+ end
46
+
47
+ def ruby_folder
48
+ Jets::Gems.ruby_folder
49
+ end
50
+
51
+ # remove unnecessary files to reduce package size
52
+ def tidy
53
+ # project_root: /tmp/jets/demo/stage/code/
54
+ # /tmp/jets/demo/stage/code/bundled
55
+ tidy_gems("#{@options[:project_root]}/ruby/gems/#{ruby_folder}/*/gems/*")
56
+ tidy_gems("#{@options[:project_root]}/ruby/gems/#{ruby_folder}/*/bundler/gems/*")
57
+ end
58
+
59
+ def tidy_gems(gems_path)
60
+ Dir.glob(gems_path).each do |gem_path|
61
+ tidy_gem(gem_path)
62
+ end
63
+ end
64
+
65
+ # Clean up some unneeded files to try to keep the package size down
66
+ # In a generated jets app this made a decent 9% difference:
67
+ # 175M test2
68
+ # 191M test3
69
+ def tidy_gem(path)
70
+ # remove top level tests and cache folders
71
+ Dir.glob("#{path}/*").each do |path|
72
+ next unless File.directory?(path)
73
+ folder = File.basename(path)
74
+ if %w[test tests spec features benchmark cache doc].include?(folder)
75
+ FileUtils.rm_rf(path)
76
+ end
77
+ end
78
+
79
+ Dir.glob("#{path}/**/*").each do |path|
80
+ next unless File.file?(path)
81
+ ext = File.extname(path)
82
+ if %w[.rdoc .md .markdown].include?(ext) or
83
+ path =~ /LICENSE|CHANGELOG|README/
84
+ FileUtils.rm_f(path)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end