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,111 @@
1
+
2
+ module Jets
3
+ class AwsInfo
4
+ extend Memoist
5
+ include AwsServices
6
+
7
+ def region
8
+ return 'us-east-1' if Jets.env.test?
9
+
10
+ return ENV['JETS_AWS_REGION'] if ENV['JETS_AWS_REGION'] # highest precedence
11
+ return ENV['AWS_REGION'] if ENV['AWS_REGION']
12
+
13
+ region = nil
14
+
15
+ # First if aws binary is available
16
+ # try to get it from the ~/.aws/config
17
+ if which('aws')
18
+ region = `aws configure get region 2>&1`.strip rescue nil
19
+ exit_code = $?.exitstatus
20
+ if exit_code != 0
21
+ exception_message = region.split("\n").grep(/botocore\.exceptions/).first
22
+ if exception_message
23
+ puts "WARN: #{exception_message}".color(:yellow)
24
+ else
25
+ # show full message as warning
26
+ puts region.color(:yellow)
27
+ end
28
+ puts "You can also get rid of this message by setting AWS_REGION or configuring ~/.aws/config with the region"
29
+ region = nil
30
+ end
31
+ region = nil if region == ''
32
+ return region if region
33
+ end
34
+
35
+ # Second try the metadata endpoint, should be available on AWS Lambda environment
36
+ # https://stackoverflow.com/questions/4249488/find-region-from-within-an-ec2-instance
37
+ begin
38
+ az = `curl -s --max-time 3 --connect-timeout 5 http://169.254.169.254/latest/meta-data/placement/availability-zone`
39
+ region = az.strip.chop # remove last char
40
+ region = nil if region == ''
41
+ rescue
42
+ end
43
+ return region if region
44
+
45
+ 'us-east-1' # default if all else fails
46
+ end
47
+ memoize :region
48
+
49
+ # aws sts get-caller-identity
50
+ def account
51
+ return '123456789' if Jets.env.test?
52
+ return ENV['JETS_AWS_ACCOUNT'] if ENV['JETS_AWS_ACCOUNT']
53
+
54
+ # ensure region set, required for sts.get_caller_identity.account to work
55
+ ENV['AWS_REGION'] ||= region
56
+ begin
57
+ sts.get_caller_identity.account
58
+ rescue Aws::Errors::MissingCredentialsError, Aws::Errors::NoSuchEndpointError, Aws::STS::Errors::InvalidClientTokenId
59
+ puts "INFO: You're missing AWS credentials. Only local services are currently available"
60
+ rescue Seahorse::Client::NetworkingError
61
+ puts "INFO: No internet connection available. Only local services are currently available"
62
+ end
63
+ end
64
+ memoize :account
65
+
66
+ # If bucket does not exist, do not use the cache value and check for the bucket again.
67
+ # This is because we can build the app before deploying it for the first time.
68
+ # The deploy sequence ensure an minimal stack exists and will return a s3 bucket
69
+ # value for real deployments though, just not for the `jets build` only command.
70
+ BUCKET_DOES_NOT_YET_EXIST = "bucket-does-not-yet-exist" # use const to save from misspellings
71
+ @@s3_bucket = BUCKET_DOES_NOT_YET_EXIST
72
+ def s3_bucket
73
+ return "fake-test-s3-bucket" if Jets.env.test?
74
+ return @@s3_bucket unless @@s3_bucket == BUCKET_DOES_NOT_YET_EXIST
75
+
76
+ resp = cfn.describe_stacks(stack_name: Jets::Naming.parent_stack_name)
77
+ stack = resp.stacks.first
78
+ output = stack["outputs"].find { |o| o["output_key"] == "S3Bucket" }
79
+ @@s3_bucket = output["output_value"] # s3_bucket
80
+ rescue Exception => e
81
+ # When user uses Jets::Application.default_iam_policy in their config/application.rb
82
+ # it looks up the s3 bucket for the iam policy, but the project name has
83
+ # not been loaded in the config yet. We do some trickery with loading
84
+ # the config twice in Application#load_app_config
85
+ # The first load will result in a Aws::CloudFormation::Errors::ValidationError
86
+ # since the Jets::Naming.parent_stack_name has not been properly set yet.
87
+ #
88
+ # Rescuing all exceptions in case there are other exceptions dont know about yet
89
+ # Here are the known ones: Aws::CloudFormation::Errors::ValidationError, Aws::CloudFormation::Errors::InvalidClientTokenId
90
+ BUCKET_DOES_NOT_YET_EXIST
91
+ end
92
+
93
+ private
94
+
95
+ # Cross-platform way of finding an executable in the $PATH.
96
+ #
97
+ # which('ruby') #=> /usr/bin/ruby
98
+ #
99
+ # source: https://stackoverflow.com/questions/2108727/which-in-ruby-checking-if-program-exists-in-path-from-ruby
100
+ def which(cmd)
101
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
102
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
103
+ exts.each { |ext|
104
+ exe = File.join(path, "#{cmd}#{ext}")
105
+ return exe if File.executable?(exe) && !File.directory?(exe)
106
+ }
107
+ end
108
+ return nil
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,57 @@
1
+ # We cache the clients globally to avoid re-instantiating them again after the initial Lambda cold start.
2
+ #
3
+ # Based on: https://hashrocket.com/blog/posts/implementing-a-macro-in-ruby-for-memoization
4
+ # Except we use a global variable for the cache. So we'll use the same client across
5
+ # all instances as well as across Lambda executions after the cold-start. Example:
6
+ #
7
+ # class Foo
8
+ # def s3
9
+ # Aws::S3::Client.new
10
+ # end
11
+ # global_memoize :s3
12
+ # end
13
+ #
14
+ # foo1 = Foo.new
15
+ # foo2 = Foo.new
16
+ # foo1.s3
17
+ # foo2.s3 # same client as foo1
18
+ #
19
+ # A prewarmed request after a cold-start will still use the same s3 client instance since it uses the
20
+ # global variable $__memo_methods as the cache.
21
+ #
22
+ module Jets::AwsServices
23
+ module GlobalMemoist
24
+ def self.included(klass)
25
+ klass.extend(Macros)
26
+ end
27
+
28
+ module Macros
29
+ def global_memoize(*methods)
30
+ const_defined?(:"GlobalMemoist#{self.object_id}") ?
31
+ const_get(:"GlobalMemoist#{self.object_id}") : const_set(:"GlobalMemoist#{self.object_id}", Module.new)
32
+ mod = const_get(:"GlobalMemoist#{self.object_id}")
33
+
34
+ mod.class_eval do
35
+ methods.each do |method|
36
+ define_method(method) do |skip_cache = false|
37
+ $__memo_methods ||= {}
38
+ if $__memo_methods.include?(method) && !skip_cache
39
+ $__memo_methods[method]
40
+ else
41
+ $__memo_methods[method] = super()
42
+ end
43
+ end
44
+ end
45
+ end
46
+ prepend mod
47
+ end
48
+
49
+ def global_memoize_class_method(*methods)
50
+ singleton_class.class_eval do
51
+ include GlobalMemoist
52
+ global_memoize(*methods)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,34 @@
1
+ module Jets::AwsServices
2
+ class S3Bucket
3
+ include Jets::AwsServices
4
+
5
+ def self.ensure_exists(bucket_name)
6
+ new(bucket_name).ensure_exists
7
+ end
8
+
9
+ def initialize(name)
10
+ @name = name
11
+ end
12
+
13
+ def ensure_exists
14
+ s3.create_bucket(bucket: @name) unless exists?
15
+ rescue Aws::S3::Errors::BucketAlreadyExists => e
16
+ puts "ERROR #{e.class}: #{e.message}".color(:red)
17
+ puts "Bucket name: #{@name}"
18
+ exit 1
19
+ end
20
+
21
+ def exists?
22
+ begin
23
+ s3.head_bucket(bucket: @name)
24
+ true
25
+ rescue Aws::S3::Errors::BucketAlreadyOwnedByYou, Aws::S3::Errors::Http301Error => e
26
+ # These exceptions indicate bucket already exists
27
+ # Aws::S3::Errors::Http301Error could be inaccurate but compromising for simplicity
28
+ true
29
+ rescue
30
+ false
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,64 @@
1
+ module Jets::AwsServices
2
+ module StackStatus
3
+ # Only cache if it is true because the initial deploy checks live status until a stack exists.
4
+ @@stack_exists_cache = [] # helps with CloudFormation rate limit
5
+ def stack_exists?(stack_name)
6
+ return false if Jets.env.test?
7
+ return true if ENV['JETS_BUILD_NO_INTERNET']
8
+ return true if @@stack_exists_cache.include?(stack_name)
9
+
10
+ exist = nil
11
+ begin
12
+ # When the stack does not exist an exception is raised. Example:
13
+ # Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
14
+ cfn.describe_stacks(stack_name: stack_name)
15
+ @@stack_exists_cache << stack_name
16
+ exist = true
17
+ rescue Aws::CloudFormation::Errors::ValidationError => e
18
+ if e.message =~ /does not exist/
19
+ exist = false
20
+ elsif e.message.include?("'stackName' failed to satisfy constraint")
21
+ # Example of e.message when describe_stack with invalid stack name
22
+ # "1 validation error detected: Value 'instance_and_route53' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*|arn:[-a-zA-Z0-9:/._+]*"
23
+ puts "Invalid stack name: #{stack_name}"
24
+ puts "Full error message: #{e.message}"
25
+ exit 1
26
+ else
27
+ raise # re-raise exception because unsure what other errors can happen
28
+ end
29
+ end
30
+ exist
31
+ end
32
+
33
+ # All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
34
+ #
35
+ # Returns resp so we can use it to grab data about the stack without calling api again.
36
+ def stack_in_progress?(stack_name)
37
+ return true if !stack_exists?(stack_name)
38
+
39
+ # Assumes stack exists
40
+ resp = cfn.describe_stacks(stack_name: stack_name)
41
+ status = resp.stacks[0].stack_status
42
+ if status =~ /_IN_PROGRESS$/
43
+ puts "The '#{stack_name}' stack status is #{status}. " \
44
+ "Please wait until the stack is ready and try again.".color(:red)
45
+ exit 0
46
+ elsif resp.stacks[0].outputs.empty? && status != 'ROLLBACK_COMPLETE'
47
+ # This Happens when the miminal stack fails at the very beginning.
48
+ # There is no s3 bucket at all. User should delete the stack.
49
+ puts "The minimal stack failed to create. Please delete the stack first and try again. " \
50
+ "You can delete the CloudFormation stack or use the `jets delete` command"
51
+ exit 0
52
+ else
53
+ true
54
+ end
55
+ end
56
+
57
+ # Lookup output value.
58
+ # Used in Jets::Resource::ApiGateway::RestApi::* andJets::Commands::Url
59
+ def lookup(outputs, key)
60
+ out = outputs.find { |o| o.output_key == key }
61
+ out&.output_value
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,95 @@
1
+ require "aws-sdk-apigateway"
2
+ require "aws-sdk-cloudformation"
3
+ require "aws-sdk-cloudwatchlogs"
4
+ require "aws-sdk-dynamodb"
5
+ require "aws-sdk-lambda"
6
+ require "aws-sdk-s3"
7
+ require "aws-sdk-sts"
8
+ # Not used in Jets internally but convenient for shared resources
9
+ require "aws-sdk-sns"
10
+ require "aws-sdk-sqs"
11
+
12
+ require "aws_mfa_secure/ext/aws" # add MFA support
13
+
14
+ module Jets::AwsServices
15
+ include GlobalMemoist
16
+ include StackStatus
17
+
18
+ def apigateway
19
+ Aws::APIGateway::Client.new(aws_options)
20
+ end
21
+ global_memoize :apigateway
22
+
23
+ def cfn
24
+ Aws::CloudFormation::Client.new(aws_options)
25
+ end
26
+ global_memoize :cfn
27
+
28
+ def dynamodb
29
+ Aws::DynamoDB::Client.new(aws_options)
30
+ end
31
+ global_memoize :dynamodb
32
+
33
+ def aws_lambda
34
+ Aws::Lambda::Client.new(aws_options)
35
+ end
36
+ global_memoize :aws_lambda
37
+
38
+ def logs
39
+ Aws::CloudWatchLogs::Client.new(aws_options)
40
+ end
41
+ global_memoize :logs
42
+
43
+ def s3
44
+ Aws::S3::Client.new(aws_options)
45
+ end
46
+ global_memoize :s3
47
+
48
+ def s3_resource
49
+ Aws::S3::Resource.new(aws_options)
50
+ end
51
+ global_memoize :s3_resource
52
+
53
+ def sns
54
+ Aws::SNS::Client.new(aws_options)
55
+ end
56
+ global_memoize :sns
57
+
58
+ def sqs
59
+ Aws::SQS::Client.new(aws_options)
60
+ end
61
+ global_memoize :sqs
62
+
63
+ def sts
64
+ Aws::STS::Client.new(aws_options)
65
+ end
66
+ global_memoize :sts
67
+
68
+ # Override the AWS retry settings with Jets AWS clients.
69
+ #
70
+ # The aws-sdk-core has exponential backup with this formula:
71
+ #
72
+ # 2 ** c.retries * c.config.retry_base_delay
73
+ #
74
+ # So the max delay will be 2 ** 7 * 0.6 = 76.8s
75
+ #
76
+ # Only scoping this to deploy because dont want to affect people's application that use the aws sdk.
77
+ #
78
+ # There is also additional rate backoff logic elsewhere, since this is only scoped to deploys.
79
+ #
80
+ # Useful links:
81
+ # https://github.com/aws/aws-sdk-ruby/blob/master/gems/aws-sdk-core/lib/aws-sdk-core/plugins/retry_errors.rb
82
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html
83
+ #
84
+ def aws_options
85
+ options = {
86
+ retry_limit: 7, # default: 3
87
+ retry_base_delay: 0.6, # default: 0.3
88
+ }
89
+ options.merge!(
90
+ log_level: :debug,
91
+ logger: Logger.new($stdout),
92
+ ) if ENV['JETS_DEBUG_AWS_SDK']
93
+ options
94
+ end
95
+ end
@@ -0,0 +1,167 @@
1
+ require "jets/core_ext/kernel" # Hack prevents Rails const from being defined
2
+
3
+ class Jets::Booter
4
+ class << self
5
+ @booted = false
6
+ def boot!
7
+ return if @booted
8
+
9
+ confirm_jets_project!
10
+ Jets::Bundle.require
11
+
12
+ Jets.application.setup!
13
+
14
+ # Turbines are loaded after setup_autoload_paths in Jets.application.setup! Some Turbine options are defined
15
+ # in the project so setup must happen before internal Turbines are loaded.
16
+ load_internal_turbines
17
+
18
+ run_turbines(:initializers)
19
+ # Load configs after Turbine initializers so Turbines can defined some config options and they are available in
20
+ # user's project environment configs.
21
+ Jets.application.configs!
22
+ app_initializers
23
+ run_turbines(:after_initializers)
24
+ Jets.application.finish!
25
+
26
+ setup_db # establish db connections in Lambda Execution Context.
27
+ # The eager load calls connects_to in models and establish those connections in Lambda Execution Context also.
28
+ internal_finisher
29
+ eager_load
30
+
31
+ # TODO: Figure out how to build middleware during Jets.boot without breaking jets new and webpacker:install
32
+ # build_middleware_stack
33
+
34
+ @booted = true
35
+ end
36
+
37
+ # Runs right before eager_load
38
+ def internal_finisher
39
+ load_shared_extensions
40
+ end
41
+
42
+ # Shared extensions are added near the end because they require the Jets app load paths to first.
43
+ # We eager load the extensions and then use the loaded modules to extend Jets::Stack directly.
44
+ # Originally used an included hook but thats too early before app/shared/extensions is in the load_path.
45
+ def load_shared_extensions
46
+ Jets::Autoloaders.once.preload("#{Jets.root}/app/shared/extensions")
47
+ base_path = "#{Jets.root}/app/shared/extensions"
48
+ Dir.glob("#{base_path}/**/*.rb").each do |path|
49
+ next unless File.file?(path)
50
+
51
+ class_name = path.sub("#{base_path}/", '').sub(/\.rb/,'').camelize
52
+ mod = class_name.constantize # autoload
53
+ Jets::Stack.extend(mod)
54
+ end
55
+ end
56
+
57
+ def eager_load
58
+ preload_extensions
59
+ Jets::Autoloaders.main.eager_load # Eager load project code. Rather have user find out early than later on AWS Lambda.
60
+ end
61
+
62
+ def preload_extensions
63
+ base_path = "#{Jets.root}/app/extensions"
64
+ Dir.glob("#{base_path}/**/*.rb").each do |path|
65
+ next unless File.file?(path)
66
+
67
+ class_name = path.sub("#{base_path}/", '').sub(/\.rb/,'').camelize
68
+ klass = class_name.constantize # autoload
69
+ Jets::Lambda::Functions.extend(klass)
70
+ end
71
+ end
72
+
73
+ # Using ActiveRecord outside of Rails, so we need to set up the db connection ourself.
74
+ #
75
+ # Only connects to database for ActiveRecord and when config/database.yml exists.
76
+ # Dynomite handles connecting to the clients lazily.
77
+ def setup_db
78
+ return unless File.exist?("#{Jets.root}/config/database.yml")
79
+
80
+ db_configs = Jets.application.config.database
81
+ # DatabaseTasks.database_configuration for db:create db:migrate tasks
82
+ # Documented in DatabaseTasks that this is the right way to set it when
83
+ # using ActiveRecord rake tasks outside of Rails.
84
+ ActiveRecord::Tasks::DatabaseTasks.database_configuration = db_configs
85
+
86
+ if db_configs.configs_for(env_name: Jets.env).blank?
87
+ abort("ERROR: config/database.yml exists but no environment section configured for #{Jets.env}")
88
+ end
89
+ ActiveRecord::Base.configurations = db_configs
90
+ connect_db
91
+ end
92
+
93
+ # Eager connect to database, so connections are established in the Lambda Execution Context and get reused.
94
+ # Interestingly, the connections info is stored in the shared state but the connection doesnt show up on
95
+ # `show processlist` until after a query. Have confirmed that the connection is reused and the connection count stays
96
+ # the same.
97
+ def connect_db
98
+ primary_hash_config = ActiveRecord::Base.configurations.configs_for(env_name: Jets.env).find { |hash_config|
99
+ hash_config.name == "primary"
100
+ }
101
+ primary_config = primary_hash_config.configuration_hash # configuration_hash is a normal Ruby Hash
102
+ ActiveRecord::Base.establish_connection(primary_config)
103
+ end
104
+
105
+ def load_internal_turbines
106
+ Dir.glob("#{__dir__}/internal/turbines/**/*.rb").each do |path|
107
+ Jets::Autoloaders.once.preload(path)
108
+ end
109
+ end
110
+
111
+ # All Turbines
112
+ def turbine_initializers
113
+ Jets::Turbine.subclasses.each do |subclass|
114
+ initializers = subclass.initializers || []
115
+ initializers.each do |label, block|
116
+ block.call(Jets.application)
117
+ end
118
+ end
119
+ end
120
+
121
+ # All Turbines
122
+ def app_initializers
123
+ Dir.glob("#{Jets.root}/config/initializers/**/*").sort.each do |path|
124
+ load path
125
+ end
126
+ end
127
+
128
+ # run_turbines(:initializers)
129
+ # run_turbines(:after_initializers)
130
+ def run_turbines(name)
131
+ Jets::Turbine.subclasses.each do |subclass|
132
+ hooks = subclass.send(name) || []
133
+ hooks.each do |label, block|
134
+ block.call(Jets.application)
135
+ end
136
+ end
137
+ end
138
+
139
+ # Builds and memoize stack so it only gets built on bootup
140
+ def build_middleware_stack
141
+ Jets.application.build_stack
142
+ end
143
+
144
+ # Cannot call this for the jets new
145
+ def confirm_jets_project!
146
+ unless File.exist?("#{Jets.root}/config/application.rb")
147
+ puts "It does not look like you are running this command within a jets project. Please confirm that you are in a jets project and try again.".color(:red)
148
+ exit 1
149
+ end
150
+ end
151
+
152
+ def message
153
+ "Jets booting up in #{Jets.env.color(:green)} mode!"
154
+ end
155
+
156
+ def check_config_ru!
157
+ config_ru = File.read("#{Jets.root}/config.ru")
158
+ unless config_ru.include?("Jets.boot")
159
+ puts 'The config.ru file is missing Jets.boot. Please add Jets.boot after require "jets"'.color(:red)
160
+ puts "This was changed as made in Jets v1.1.0."
161
+ puts "To have Jets update the config.fu file for you, you can run:\n\n"
162
+ puts " jets upgrade"
163
+ exit 1
164
+ end
165
+ end
166
+ end
167
+ end