jets_bb_fork 0.0.4

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 (398) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/bin/commit_docs.sh +26 -0
  3. data/.circleci/config.yml +126 -0
  4. data/.codebuild/README.md +68 -0
  5. data/.codebuild/bin/jets +3 -0
  6. data/.codebuild/buildspec-base.yml +14 -0
  7. data/.codebuild/integration.sh +72 -0
  8. data/.codebuild/jets.postman_collection.json +323 -0
  9. data/.codebuild/scripts/install-docker.sh +12 -0
  10. data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
  11. data/.codebuild/scripts/install-java.sh +22 -0
  12. data/.codebuild/scripts/install-node.sh +4 -0
  13. data/.github/ISSUE_TEMPLATE.md +7 -0
  14. data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
  15. data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
  16. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  17. data/.github/ISSUE_TEMPLATE/question.md +16 -0
  18. data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  19. data/.gitignore +24 -0
  20. data/.gitmodules +0 -0
  21. data/.python-version +1 -0
  22. data/.rspec +4 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +734 -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 +203 -0
  34. data/Rakefile +24 -0
  35. data/backers.md +16 -0
  36. data/bin/release +9 -0
  37. data/buildspec.yml +18 -0
  38. data/exe/jets_bb_fork +14 -0
  39. data/jets.gemspec +68 -0
  40. data/lib/jets.rb +27 -0
  41. data/lib/jets/application.rb +216 -0
  42. data/lib/jets/application/defaults.rb +172 -0
  43. data/lib/jets/autoloaders.rb +97 -0
  44. data/lib/jets/aws_info.rb +113 -0
  45. data/lib/jets/aws_services.rb +65 -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 +59 -0
  49. data/lib/jets/booter.rb +119 -0
  50. data/lib/jets/builders/code_builder.rb +399 -0
  51. data/lib/jets/builders/code_size.rb +57 -0
  52. data/lib/jets/builders/gem_replacer.rb +76 -0
  53. data/lib/jets/builders/handler_generator.rb +186 -0
  54. data/lib/jets/builders/lambda_layer.rb +69 -0
  55. data/lib/jets/builders/md5.rb +60 -0
  56. data/lib/jets/builders/md5_zip.rb +61 -0
  57. data/lib/jets/builders/purger.rb +35 -0
  58. data/lib/jets/builders/rack_packager.rb +51 -0
  59. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  60. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  61. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  62. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  63. data/lib/jets/builders/ruby_packager.rb +207 -0
  64. data/lib/jets/builders/shim_vars/app.rb +78 -0
  65. data/lib/jets/builders/shim_vars/base.rb +25 -0
  66. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  67. data/lib/jets/builders/templates/handler.rb +12 -0
  68. data/lib/jets/builders/tidy.rb +107 -0
  69. data/lib/jets/builders/util.rb +31 -0
  70. data/lib/jets/bundle.rb +82 -0
  71. data/lib/jets/camelizer.rb +71 -0
  72. data/lib/jets/cfn/builders/api_deployment_builder.rb +63 -0
  73. data/lib/jets/cfn/builders/api_gateway_builder.rb +157 -0
  74. data/lib/jets/cfn/builders/base_child_builder.rb +75 -0
  75. data/lib/jets/cfn/builders/controller_builder.rb +42 -0
  76. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  77. data/lib/jets/cfn/builders/interface.rb +137 -0
  78. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  79. data/lib/jets/cfn/builders/paged.rb +37 -0
  80. data/lib/jets/cfn/builders/parent_builder.rb +100 -0
  81. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  82. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  83. data/lib/jets/cfn/ship.rb +185 -0
  84. data/lib/jets/cfn/status.rb +212 -0
  85. data/lib/jets/cfn/upload.rb +139 -0
  86. data/lib/jets/cli.rb +194 -0
  87. data/lib/jets/commands/base.rb +146 -0
  88. data/lib/jets/commands/build.rb +234 -0
  89. data/lib/jets/commands/call.rb +169 -0
  90. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  91. data/lib/jets/commands/call/autoload_guesser.rb +136 -0
  92. data/lib/jets/commands/call/base_guesser.rb +60 -0
  93. data/lib/jets/commands/call/guesser.rb +48 -0
  94. data/lib/jets/commands/clean.rb +19 -0
  95. data/lib/jets/commands/clean/base.rb +24 -0
  96. data/lib/jets/commands/clean/build.rb +13 -0
  97. data/lib/jets/commands/clean/log.rb +107 -0
  98. data/lib/jets/commands/console.rb +12 -0
  99. data/lib/jets/commands/db.rb +13 -0
  100. data/lib/jets/commands/db/environment-task.rake +3 -0
  101. data/lib/jets/commands/db/tasks.rb +44 -0
  102. data/lib/jets/commands/dbconsole.rb +131 -0
  103. data/lib/jets/commands/delete.rb +143 -0
  104. data/lib/jets/commands/deploy.rb +141 -0
  105. data/lib/jets/commands/dynamodb.rb +19 -0
  106. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  107. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  108. data/lib/jets/commands/gems.rb +21 -0
  109. data/lib/jets/commands/help.rb +9 -0
  110. data/lib/jets/commands/help/build.md +6 -0
  111. data/lib/jets/commands/help/call.md +61 -0
  112. data/lib/jets/commands/help/clean/build.md +5 -0
  113. data/lib/jets/commands/help/clean/log.md +5 -0
  114. data/lib/jets/commands/help/console.md +18 -0
  115. data/lib/jets/commands/help/db/generate.md +8 -0
  116. data/lib/jets/commands/help/dbconsole.md +9 -0
  117. data/lib/jets/commands/help/delete.md +22 -0
  118. data/lib/jets/commands/help/deploy.md +32 -0
  119. data/lib/jets/commands/help/destroy.md +16 -0
  120. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  121. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  122. data/lib/jets/commands/help/gems/check.md +8 -0
  123. data/lib/jets/commands/help/generate.md +22 -0
  124. data/lib/jets/commands/help/import/rack.md +13 -0
  125. data/lib/jets/commands/help/import/rails.md +11 -0
  126. data/lib/jets/commands/help/new.md +42 -0
  127. data/lib/jets/commands/help/routes.md +16 -0
  128. data/lib/jets/commands/help/runner.md +17 -0
  129. data/lib/jets/commands/help/server.md +15 -0
  130. data/lib/jets/commands/help/status.md +14 -0
  131. data/lib/jets/commands/help/upgrade.md +5 -0
  132. data/lib/jets/commands/help/url.md +6 -0
  133. data/lib/jets/commands/import.rb +12 -0
  134. data/lib/jets/commands/import/base.rb +49 -0
  135. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  136. data/lib/jets/commands/import/rack.rb +16 -0
  137. data/lib/jets/commands/import/rails.rb +74 -0
  138. data/lib/jets/commands/import/sequence.rb +90 -0
  139. data/lib/jets/commands/import/templates/config/database.yml +26 -0
  140. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  141. data/lib/jets/commands/main.rb +157 -0
  142. data/lib/jets/commands/markdown/creator.rb +58 -0
  143. data/lib/jets/commands/markdown/index.rb +27 -0
  144. data/lib/jets/commands/markdown/page.rb +125 -0
  145. data/lib/jets/commands/markdown/shell.rb +11 -0
  146. data/lib/jets/commands/new.rb +157 -0
  147. data/lib/jets/commands/rake_command.rb +61 -0
  148. data/lib/jets/commands/rake_tasks.rb +46 -0
  149. data/lib/jets/commands/runner.rb +16 -0
  150. data/lib/jets/commands/sequence.rb +99 -0
  151. data/lib/jets/commands/stack_info.rb +30 -0
  152. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  153. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  154. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  155. data/lib/jets/commands/templates/skeleton/Gemfile.tt +38 -0
  156. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  157. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  158. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  159. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  160. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  161. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  162. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  163. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  164. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
  165. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  166. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +67 -0
  167. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
  168. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  169. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
  170. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
  171. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
  172. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  173. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  174. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  175. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  176. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  177. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  178. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  179. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  180. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  181. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  182. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  183. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
  184. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  185. data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
  186. data/lib/jets/commands/upgrade.rb +145 -0
  187. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  188. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  189. data/lib/jets/commands/url.rb +68 -0
  190. data/lib/jets/commands/webpacker_template.rb +18 -0
  191. data/lib/jets/controller.rb +3 -0
  192. data/lib/jets/controller/base.rb +108 -0
  193. data/lib/jets/controller/callbacks.rb +68 -0
  194. data/lib/jets/controller/cookies.rb +38 -0
  195. data/lib/jets/controller/cookies/jar.rb +269 -0
  196. data/lib/jets/controller/layout.rb +17 -0
  197. data/lib/jets/controller/middleware/cors.rb +60 -0
  198. data/lib/jets/controller/middleware/local.rb +116 -0
  199. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  200. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  201. data/lib/jets/controller/middleware/local/route_matcher.rb +106 -0
  202. data/lib/jets/controller/middleware/main.rb +46 -0
  203. data/lib/jets/controller/middleware/reloader.rb +15 -0
  204. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  205. data/lib/jets/controller/params.rb +87 -0
  206. data/lib/jets/controller/rack/adapter.rb +88 -0
  207. data/lib/jets/controller/rack/env.rb +105 -0
  208. data/lib/jets/controller/redirection.rb +55 -0
  209. data/lib/jets/controller/rendering.rb +79 -0
  210. data/lib/jets/controller/rendering/rack_renderer.rb +250 -0
  211. data/lib/jets/controller/request.rb +29 -0
  212. data/lib/jets/controller/response.rb +61 -0
  213. data/lib/jets/controller/stage.rb +33 -0
  214. data/lib/jets/core.rb +149 -0
  215. data/lib/jets/core_ext/kernel.rb +13 -0
  216. data/lib/jets/db.rb +15 -0
  217. data/lib/jets/dotenv.rb +48 -0
  218. data/lib/jets/dotenv/ssm.rb +48 -0
  219. data/lib/jets/erb.rb +51 -0
  220. data/lib/jets/generator.rb +48 -0
  221. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  222. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
  223. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  224. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  225. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  226. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  227. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  228. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  229. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  230. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  231. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  232. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  233. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  234. data/lib/jets/inflections.rb +32 -0
  235. data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
  236. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  237. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
  238. data/lib/jets/internal/app/functions/jets/base_path.rb +157 -0
  239. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
  240. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
  241. data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +43 -0
  242. data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
  243. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
  244. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  245. data/lib/jets/internal/turbines/jets/mailer.rb +51 -0
  246. data/lib/jets/job/base.rb +39 -0
  247. data/lib/jets/job/dsl.rb +40 -0
  248. data/lib/jets/job/dsl/dynamodb_event.rb +65 -0
  249. data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
  250. data/lib/jets/job/dsl/iot_event.rb +24 -0
  251. data/lib/jets/job/dsl/kinesis_event.rb +46 -0
  252. data/lib/jets/job/dsl/log_event.rb +15 -0
  253. data/lib/jets/job/dsl/rule_event.rb +75 -0
  254. data/lib/jets/job/dsl/s3_event.rb +36 -0
  255. data/lib/jets/job/dsl/sns_event.rb +54 -0
  256. data/lib/jets/job/dsl/sqs_event.rb +96 -0
  257. data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
  258. data/lib/jets/job/helpers/log_event_helper.rb +17 -0
  259. data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
  260. data/lib/jets/klass.rb +109 -0
  261. data/lib/jets/lambda/dsl.rb +419 -0
  262. data/lib/jets/lambda/function.rb +29 -0
  263. data/lib/jets/lambda/function_constructor.rb +55 -0
  264. data/lib/jets/lambda/functions.rb +34 -0
  265. data/lib/jets/lambda/task.rb +111 -0
  266. data/lib/jets/logger.rb +21 -0
  267. data/lib/jets/mega/hash_converter.rb +25 -0
  268. data/lib/jets/mega/request.rb +139 -0
  269. data/lib/jets/mega/request/source.rb +21 -0
  270. data/lib/jets/middleware.rb +33 -0
  271. data/lib/jets/middleware/configurator.rb +84 -0
  272. data/lib/jets/middleware/default_stack.rb +51 -0
  273. data/lib/jets/middleware/layer.rb +34 -0
  274. data/lib/jets/middleware/stack.rb +77 -0
  275. data/lib/jets/naming.rb +49 -0
  276. data/lib/jets/overrides/lambda.rb +1 -0
  277. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  278. data/lib/jets/overrides/rails.rb +4 -0
  279. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  280. data/lib/jets/overrides/rails/common_methods.rb +13 -0
  281. data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
  282. data/lib/jets/overrides/rails/url_helper.rb +25 -0
  283. data/lib/jets/poly_fun.rb +73 -0
  284. data/lib/jets/poly_fun/base_executor.rb +125 -0
  285. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  286. data/lib/jets/poly_fun/node_error.rb +8 -0
  287. data/lib/jets/poly_fun/node_executor.rb +54 -0
  288. data/lib/jets/poly_fun/python_error.rb +8 -0
  289. data/lib/jets/poly_fun/python_executor.rb +23 -0
  290. data/lib/jets/preheat.rb +117 -0
  291. data/lib/jets/processors/deducer.rb +65 -0
  292. data/lib/jets/processors/main_processor.rb +61 -0
  293. data/lib/jets/rack_server.rb +86 -0
  294. data/lib/jets/rdoc.rb +30 -0
  295. data/lib/jets/resource.rb +71 -0
  296. data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
  297. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  298. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  299. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  300. data/lib/jets/resource/api_gateway/deployment.rb +78 -0
  301. data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
  302. data/lib/jets/resource/api_gateway/method.rb +98 -0
  303. data/lib/jets/resource/api_gateway/resource.rb +101 -0
  304. data/lib/jets/resource/api_gateway/rest_api.rb +56 -0
  305. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
  306. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
  307. data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
  308. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +8 -0
  309. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
  310. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
  311. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
  312. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
  313. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  314. data/lib/jets/resource/associated.rb +37 -0
  315. data/lib/jets/resource/base.rb +28 -0
  316. data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
  317. data/lib/jets/resource/child_stack/api_gateway.rb +53 -0
  318. data/lib/jets/resource/child_stack/app_class.rb +107 -0
  319. data/lib/jets/resource/child_stack/base.rb +24 -0
  320. data/lib/jets/resource/child_stack/shared.rb +92 -0
  321. data/lib/jets/resource/config/config_rule.rb +74 -0
  322. data/lib/jets/resource/config/managed_rule.rb +15 -0
  323. data/lib/jets/resource/events/rule.rb +31 -0
  324. data/lib/jets/resource/iam/application_role.rb +27 -0
  325. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  326. data/lib/jets/resource/iam/class_role.rb +74 -0
  327. data/lib/jets/resource/iam/function_role.rb +54 -0
  328. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  329. data/lib/jets/resource/iam/policy_document.rb +41 -0
  330. data/lib/jets/resource/iot/topic_rule.rb +34 -0
  331. data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
  332. data/lib/jets/resource/lambda/function.rb +214 -0
  333. data/lib/jets/resource/lambda/function/environment.rb +62 -0
  334. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  335. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  336. data/lib/jets/resource/logs/subscription_filter.rb +31 -0
  337. data/lib/jets/resource/permission.rb +45 -0
  338. data/lib/jets/resource/replacer.rb +85 -0
  339. data/lib/jets/resource/route53/record_set.rb +70 -0
  340. data/lib/jets/resource/s3/bucket.rb +24 -0
  341. data/lib/jets/resource/sns/subscription.rb +29 -0
  342. data/lib/jets/resource/sns/topic.rb +35 -0
  343. data/lib/jets/resource/sns/topic_policy.rb +40 -0
  344. data/lib/jets/resource/sqs/queue.rb +21 -0
  345. data/lib/jets/resource/standardizer.rb +42 -0
  346. data/lib/jets/route.rb +166 -0
  347. data/lib/jets/router.rb +177 -0
  348. data/lib/jets/router/scope.rb +30 -0
  349. data/lib/jets/rule/base.rb +19 -0
  350. data/lib/jets/rule/dsl.rb +110 -0
  351. data/lib/jets/spec_helpers.rb +54 -0
  352. data/lib/jets/spec_helpers/params.rb +10 -0
  353. data/lib/jets/spec_helpers/request.rb +78 -0
  354. data/lib/jets/spec_helpers/response.rb +5 -0
  355. data/lib/jets/stack.rb +88 -0
  356. data/lib/jets/stack/builder.rb +43 -0
  357. data/lib/jets/stack/definition.rb +50 -0
  358. data/lib/jets/stack/depends.rb +34 -0
  359. data/lib/jets/stack/depends/item.rb +9 -0
  360. data/lib/jets/stack/function.rb +69 -0
  361. data/lib/jets/stack/main.rb +4 -0
  362. data/lib/jets/stack/main/dsl.rb +28 -0
  363. data/lib/jets/stack/main/dsl/base.rb +49 -0
  364. data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
  365. data/lib/jets/stack/main/dsl/iam.rb +8 -0
  366. data/lib/jets/stack/main/dsl/lambda.rb +83 -0
  367. data/lib/jets/stack/main/dsl/s3.rb +12 -0
  368. data/lib/jets/stack/main/dsl/sns.rb +16 -0
  369. data/lib/jets/stack/main/dsl/sqs.rb +10 -0
  370. data/lib/jets/stack/output.rb +35 -0
  371. data/lib/jets/stack/output/dsl.rb +19 -0
  372. data/lib/jets/stack/output/lookup.rb +36 -0
  373. data/lib/jets/stack/parameter.rb +37 -0
  374. data/lib/jets/stack/parameter/dsl.rb +42 -0
  375. data/lib/jets/stack/resource.rb +31 -0
  376. data/lib/jets/stack/resource/dsl.rb +19 -0
  377. data/lib/jets/stack/s3_event.rb +87 -0
  378. data/lib/jets/tmp_loader.rb +52 -0
  379. data/lib/jets/turbine.rb +41 -0
  380. data/lib/jets/turbo.rb +55 -0
  381. data/lib/jets/turbo/database_yaml.rb +41 -0
  382. data/lib/jets/turbo/project/.gitignore +12 -0
  383. data/lib/jets/turbo/project/.jetskeep +1 -0
  384. data/lib/jets/turbo/project/Gemfile +16 -0
  385. data/lib/jets/turbo/project/Rakefile +2 -0
  386. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  387. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  388. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  389. data/lib/jets/turbo/project/config.ru +5 -0
  390. data/lib/jets/turbo/project/config/application.rb +4 -0
  391. data/lib/jets/turbo/project/config/routes.rb +4 -0
  392. data/lib/jets/turbo/rails.rb +127 -0
  393. data/lib/jets/turbo/templates/config/database.yml +26 -0
  394. data/lib/jets/util.rb +38 -0
  395. data/lib/jets/version.rb +3 -0
  396. data/readme/prerelease.md +6 -0
  397. data/readme/testing.md +60 -0
  398. metadata +1004 -0
@@ -0,0 +1,399 @@
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
+ s3_key = "jets/code/#{filename}"
81
+ begin
82
+ s3.head_object(bucket: s3_bucket, key: s3_key)
83
+ true
84
+ rescue Aws::S3::Errors::NotFound
85
+ false
86
+ end
87
+ end
88
+
89
+ def code_setup
90
+ reconfigure_development_webpacker
91
+ end
92
+
93
+ def code_finish
94
+ # Reconfigure code
95
+ store_s3_base_url
96
+ disable_webpacker_middleware
97
+ copy_internal_jets_code
98
+
99
+ # Code prep and zipping
100
+ check_code_size!
101
+ calculate_md5s # must be called before generate_shims and create_zip_files
102
+ generate_shims
103
+ create_zip_files
104
+ end
105
+
106
+ def check_code_size!
107
+ CodeSize.check!
108
+ end
109
+
110
+ # Materialized internal code into actually user Jets app as part of the deploy process.
111
+ # Examples of things that we might materialize:
112
+ #
113
+ # Views
114
+ # Simple Functions
115
+ #
116
+ # For functions, We copy the files into the project because we cannot require
117
+ # simple functions directly since they are wrapped by an anonymous class.
118
+ def copy_internal_jets_code
119
+ files = []
120
+
121
+ mailers_controller = Jets::Router.has_controller?("Jets::MailersController")
122
+ if mailers_controller
123
+ files << "app/controllers/jets/mailers_controller.rb"
124
+ files << "app/views/jets/mailers"
125
+ files << "app/helpers/jets/mailers_helper.rb"
126
+ end
127
+
128
+ files.each do |relative_path|
129
+ src = File.expand_path("../internal/#{relative_path}", File.dirname(__FILE__))
130
+ dest = "#{"#{stage_area}/code"}/#{relative_path}"
131
+ FileUtils.mkdir_p(File.dirname(dest))
132
+ FileUtils.cp_r(src, dest)
133
+ end
134
+ end
135
+
136
+ # Thanks https://stackoverflow.com/questions/9354595/recursively-getting-the-size-of-a-directory
137
+ # Seems to overestimate a little bit but close enough.
138
+ def dir_size(folder)
139
+ Dir.glob(File.join(folder, '**', '*'))
140
+ .select { |f| File.file?(f) }
141
+ .map{ |f| File.size(f) }
142
+ .inject(:+)
143
+ end
144
+
145
+ # Store s3 base url is needed for asset serving from s3 later. Need to package this
146
+ # as part of the code so we have a reference to it.
147
+ # At this point the minimal stack exists, so we can grab it with the AWS API.
148
+ # We do not want to grab this as part of the live request because it is slow.
149
+ def store_s3_base_url
150
+ write_s3_base_url("#{stage_area}/code/config/s3_base_url.txt")
151
+ write_s3_base_url("#{stage_area}/rack/config/s3_base_url.txt") if Jets.rack?
152
+ end
153
+
154
+ def write_s3_base_url(full_path)
155
+ FileUtils.mkdir_p(File.dirname(full_path))
156
+ IO.write(full_path, s3_base_url)
157
+ end
158
+
159
+ def s3_base_url
160
+ # Allow user to set assets.base_url
161
+ #
162
+ # Jets.application.configure do
163
+ # config.assets.base_url = "https://cloudfront.com/my/base/path"
164
+ # end
165
+ #
166
+ return Jets.config.assets.base_url if Jets.config.assets.base_url
167
+
168
+ region = Jets.aws.region
169
+
170
+ asset_base_url = region == 'us-east-1' ?
171
+ "https://s3.amazonaws.com" :
172
+ "https://s3-#{region}.amazonaws.com"
173
+ "#{asset_base_url}/#{s3_bucket}/jets" # s3_base_url
174
+ end
175
+
176
+ def s3_bucket
177
+ Jets.aws.s3_bucket
178
+ end
179
+
180
+ def disable_webpacker_middleware
181
+ full_path = "#{"#{stage_area}/code"}/config/disable-webpacker-middleware.txt"
182
+ FileUtils.mkdir_p(File.dirname(full_path))
183
+ FileUtils.touch(full_path)
184
+ end
185
+
186
+ # This happens in the current app directory not the tmp code for simplicity.
187
+ # This is because the node and yarn has likely been set up correctly there.
188
+ def compile_assets
189
+ if ENV['JETS_SKIP_ASSETS']
190
+ puts "Skip compiling assets".color(:yellow) # useful for debugging
191
+ return
192
+ end
193
+
194
+ headline "Compling assets in current project directory"
195
+ return unless webpacker_included?
196
+
197
+ sh("yarn install")
198
+ webpack_command = File.exist?("#{Jets.root}/bin/webpack") ?
199
+ "bin/webpack" :
200
+ `which webpack`.strip
201
+ sh "JETS_ENV=#{Jets.env} #{webpack_command}"
202
+ end
203
+
204
+ def webpacker_included?
205
+ # Old code, leaving around for now:
206
+ # Thanks: https://stackoverflow.com/questions/4195735/get-list-of-gems-being-used-by-a-bundler-project
207
+ # webpacker_loaded = Gem.loaded_specs.keys.include?("webpacker")
208
+ # return unless webpacker_loaded
209
+
210
+ # Checking this way because when using jets standalone for Afterburner mode we don't want to run into
211
+ # bundler gem collisions. TODO: figure out the a better way to handle the collisions.
212
+ lines = IO.readlines("#{Jets.root}/Gemfile")
213
+ lines.detect { |l| l =~ /webpacker/ }
214
+ end
215
+
216
+ # This happens in the current app directory not the tmp code for simplicity
217
+ # This is because the node likely been set up correctly there.
218
+ def compile_rails_assets
219
+ return unless Jets.rack? && rails? && !rails_api?
220
+
221
+ if ENV['JETS_SKIP_ASSETS']
222
+ puts "Skip compiling rack assets".color(:yellow) # useful for debugging
223
+ return
224
+ end
225
+
226
+ # Need to capture JETS_ROOT since can be changed by Turbo mode
227
+ jets_root = Jets.root
228
+ Bundler.with_clean_env do
229
+ # Switch gemfile for Afterburner mode
230
+ gemfile = ENV['BUNDLE_GEMFILE']
231
+ ENV['BUNDLE_GEMFILE'] = "#{jets_root}/rack/Gemfile"
232
+ sh "cd #{jets_root} && bundle install"
233
+ ENV['BUNDLE_GEMFILE'] = gemfile
234
+
235
+ rails_assets(:clobber, jets_root: jets_root)
236
+ rails_assets(:precompile, jets_root: jets_root)
237
+ end
238
+ end
239
+
240
+ def rails_assets(cmd, jets_root:)
241
+ # rake is available in both rails 4 and 5. rails command only in 5
242
+ command = "bundle exec rake assets:#{cmd} --trace"
243
+ command = "RAILS_ENV=#{Jets.env} #{command}" unless Jets.env.development?
244
+ sh("cd #{jets_root}/rack && #{command}")
245
+ end
246
+
247
+ # Rudimentary rails detection
248
+ # Duplicated in builders/reconfigure_rails.rb
249
+ def rails?
250
+ config_ru = "#{Jets.root}/rack/config.ru"
251
+ return false unless File.exist?(config_ru)
252
+ !IO.readlines(config_ru).grep(/Rails.application/).empty?
253
+ end
254
+
255
+ # Rudimentary rails api detection
256
+ # Duplicated in builders/reconfigure_rails.rb
257
+ # Another way of checking is loading a rails console and checking Rails.application.config.api_only
258
+ # Using this way for simplicity.
259
+ def rails_api?
260
+ config_app = "#{Jets.root}/rack/config/application.rb"
261
+ return false unless File.exist?(config_app)
262
+ !IO.readlines(config_app).grep(/config.api_only.*=.*true/).empty?
263
+ end
264
+
265
+ # Cleans out non-cached files like code-*.zip in Jets.build_root
266
+ # for a clean start. Also ensure that the /tmp/jets/project build root exists.
267
+ #
268
+ # Most files are kept around after the build process for inspection and
269
+ # debugging. So we have to clean out the files. But we only want to clean out
270
+ # some of the files.
271
+ def clean_start
272
+ Dir.glob("#{Jets.build_root}/code/code-*.zip").each { |f| FileUtils.rm_f(f) }
273
+ FileUtils.mkdir_p(Jets.build_root) # /tmp/jets/demo
274
+ end
275
+
276
+ # Copy project into temporary directory. Do this so we can keep the project
277
+ # directory untouched and we can also remove a bunch of unnecessary files like
278
+ # logs before zipping it up.
279
+ def copy_project
280
+ headline "Copying current project directory to temporary build area: #{"#{stage_area}/code"}"
281
+ FileUtils.rm_rf("#{build_area}/stage") # clear out from previous build's stage area
282
+ FileUtils.mkdir_p("#{build_area}/stage")
283
+ FileUtils.rm_rf("#{stage_area}/code") # remove current code folder
284
+ move_node_modules(Jets.root, Jets.build_root)
285
+ begin
286
+ # puts "cp -r #{@full_project_path} #{"#{stage_area}/code"}".color(:yellow) # uncomment to debug
287
+ Jets::Util.cp_r(@full_project_path, "#{stage_area}/code")
288
+ ensure
289
+ move_node_modules(Jets.build_root, Jets.root) # move node_modules directory back
290
+ end
291
+ end
292
+
293
+ # Move the node modules to the tmp build folder to speed up project copying.
294
+ # A little bit risky because a ctrl-c in the middle of the project copying
295
+ # results in a missing node_modules but user can easily rebuild that.
296
+ #
297
+ # Tesing shows 6.623413 vs 0.027754 speed improvement.
298
+ def move_node_modules(source_folder, dest_folder)
299
+ source = "#{source_folder}/node_modules"
300
+ dest = "#{dest_folder}/node_modules"
301
+ if File.exist?(source)
302
+ FileUtils.mv(source, dest)
303
+ end
304
+ end
305
+
306
+ # Bit hacky but this saves the user from accidentally forgetting to change this
307
+ # when they deploy a jets project in development mode
308
+ def reconfigure_development_webpacker
309
+ return unless Jets.env.development?
310
+ headline "Reconfiguring webpacker development settings for AWS Lambda."
311
+
312
+ webpacker_yml = "#{"#{stage_area}/code"}/config/webpacker.yml"
313
+ return unless File.exist?(webpacker_yml)
314
+
315
+ config = YAML.load_file(webpacker_yml)
316
+ config["development"]["compile"] = false # force this to be false for deployment
317
+ new_yaml = YAML.dump(config)
318
+ IO.write(webpacker_yml, new_yaml)
319
+ end
320
+
321
+ def ruby_packager
322
+ RubyPackager.new(tmp_code)
323
+ end
324
+ memoize :ruby_packager
325
+
326
+ def rack_packager
327
+ RackPackager.new("#{tmp_code}/rack")
328
+ end
329
+ memoize :rack_packager
330
+
331
+ def package_ruby
332
+ return if Jets.poly_only?
333
+
334
+ check_agree
335
+ ruby_packager.install
336
+ reconfigure_rails # call here after "#{stage_area}/code" is available
337
+ rack_packager.install
338
+ ruby_packager.finish # by this time we have a /tmp/jets/demo/stage/code/vendor/gems
339
+ rack_packager.finish
340
+
341
+ build_lambda_layer
342
+ end
343
+
344
+ def check_agree
345
+ agree = Jets::Gems::Agree.new
346
+ agree.prompt
347
+ end
348
+
349
+ def build_lambda_layer
350
+ return if Jets.poly_only?
351
+ lambda_layer = LambdaLayer.new
352
+ lambda_layer.build
353
+ end
354
+
355
+ # TODO: Move logic into plugin instead
356
+ def reconfigure_rails
357
+ ReconfigureRails.new("#{"#{stage_area}/code"}/rack").run
358
+ end
359
+
360
+ def cache_check_message
361
+ if File.exist?("#{Jets.build_root}/cache")
362
+ 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"
363
+ end
364
+ end
365
+
366
+ def check_ruby_version
367
+ unless ruby_version_supported?
368
+ puts "You are using Ruby version #{RUBY_VERSION} which is not supported by Jets."
369
+ ruby_variant = Jets::RUBY_VERSION.split('.')[0..1].join('.') + '.x'
370
+ abort("Jets uses Ruby #{Jets::RUBY_VERSION}. You should use a variant of Ruby #{ruby_variant}".color(:red))
371
+ end
372
+ end
373
+
374
+ def copy_ruby_version_file
375
+ return unless File.exists?(".ruby-version")
376
+
377
+ FileUtils.cp_r(Jets.root.join(".ruby-version"), build_area)
378
+ end
379
+
380
+ def ruby_version_supported?
381
+ pattern = /(\d+)\.(\d+)\.(\d+)/
382
+ md = RUBY_VERSION.match(pattern)
383
+ ruby = {major: md[1], minor: md[2]}
384
+ md = Jets::RUBY_VERSION.match(pattern)
385
+ jets = {major: md[1], minor: md[2]}
386
+
387
+ ruby[:major] == jets[:major] && ruby[:minor] == jets[:minor]
388
+ end
389
+
390
+ # Group all the path settings together here
391
+ def self.tmp_code
392
+ Jets::Commands::Build.tmp_code
393
+ end
394
+
395
+ def tmp_code
396
+ self.class.tmp_code
397
+ end
398
+ end
399
+ 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 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 ENV['TEST']
55
+ end
56
+ end
57
+ end