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,65 @@
1
+ # Jets::Processors::Deducer class figures out information that allows the
2
+ # controller or job to be called. Sme key methods for deducer:
3
+ #
4
+ # code - code to instance eval. IE: PostsController.new(event, context).index
5
+ # path - full path to the app code. IE: #{Jets.root}app/controllers/posts_controller.rb
6
+ #
7
+ class Jets::Processors::Deducer
8
+ def initialize(handler)
9
+ @handler = handler # handlers/controllers/posts.show
10
+ # @handler_path: "handlers/controllers/posts"
11
+ # @handler_method: "show"
12
+ @handler_path, @handler_method = @handler.split('.')
13
+ end
14
+
15
+ def code
16
+ # code: "PostsController.process(event, context, meth: "show")"
17
+ # code: "HardJob.process(event, context, meth: "dig")"
18
+ %|#{class_name}.process(event, context, "#{@handler_method}")|
19
+ end
20
+
21
+ # Input: @handler_path: handlers/jobs/hard_job.rb
22
+ # Output: #{Jets.root/app/jobs/hard_job.rb
23
+ def path
24
+ @handler_path.sub("handlers", "app") + ".rb"
25
+ end
26
+
27
+ # process_type is key. It can be either "controller" or "job". It is used to
28
+ # deduce the rest of the methods: code, path.
29
+ def process_type
30
+ if shared?
31
+ "function" # all app/shared/functions are always function process_type
32
+ else
33
+ @handler.split('/')[1].singularize # controller, job, rule, etc
34
+ end
35
+ end
36
+
37
+ def shared?
38
+ @handler.include?("/shared/functions")
39
+ end
40
+
41
+ # Example underscored_class_name:
42
+ # class_name = underscored_class_name
43
+ # class_name = class_name # PostsController
44
+ def class_name
45
+ regexp = shared? ?
46
+ Regexp.new(".*handlers/shared/functions/") :
47
+ Regexp.new(".*handlers/#{process_type.pluralize}/")
48
+
49
+ # Example regexp:
50
+ # /.*handlers\/controllers\//
51
+ # /.*handlers\/jobs\//
52
+ class_name = @handler_path.sub(regexp, "")
53
+ # Example class names:
54
+ # posts_controller
55
+ # hard_job
56
+ # hello
57
+ # hello_function
58
+
59
+ class_name.camelize
60
+ end
61
+
62
+ def load_class
63
+ Jets::Klass.from_path(path)
64
+ end
65
+ end
@@ -0,0 +1,61 @@
1
+ require 'json'
2
+ require 'stringio'
3
+
4
+ # Node shim calls this class to process both controllers and jobs
5
+ class Jets::Processors::MainProcessor
6
+ attr_reader :event, :context, :handler
7
+ def initialize(event, context, handler)
8
+ @event = event
9
+ @context = context
10
+ @handler = handler
11
+ end
12
+
13
+ def run
14
+ # Use the handler to deduce app code to run.
15
+ # Example handlers: handlers/controllers/posts.create, handlers/jobs/sleep.perform
16
+ #
17
+ # deducer = Jets::Processors::Deducer.new("handlers/controllers/posts.create")
18
+ #
19
+ deducer = Jets::Processors::Deducer.new(handler)
20
+ begin
21
+ # Examples:
22
+ # deducer.code => PostsController.process(event, context, "show")
23
+ # deducer.path => app/controllers/posts_controller.rb
24
+ #
25
+ # deducer.code => HardJob.process(event, context, "dig")
26
+ # deducer.path => app/jobs/hard_job.rb
27
+ #
28
+ # deducer.code => HelloFunction.process(event, context, "world")
29
+ # deducer.path => app/functions/hello.rb
30
+ deducer.load_class
31
+ # result = PostsController.process(event, context, "create")
32
+ result = instance_eval(deducer.code, deducer.path)
33
+ result = HashWithIndifferentAccess.new(result) if result.is_a?(Hash)
34
+
35
+ Jets.increase_call_count
36
+
37
+ if result.is_a?(Hash) && result["headers"]
38
+ # API Gateway is okay with the header values as Integers but
39
+ # ELBs are more strict about this and require the header values to be Strings
40
+ result["headers"]["x-jets-call-count"] = Jets.call_count.to_s
41
+ result["headers"]["x-jets-prewarm-count"] = Jets.prewarm_count.to_s
42
+ end
43
+
44
+ result
45
+ rescue Exception => e
46
+ unless ENV['TEST']
47
+ # Customize error message slightly so nodejs shim can process the
48
+ # returned error message.
49
+ # The "RubyError: " is a marker that the javascript shim scans for.
50
+ $stderr.puts("RubyError: #{e.class}: #{e.message}") # js needs this as the first line
51
+ backtrace = e.backtrace.map {|l| " #{l}" }
52
+ $stderr.puts(backtrace)
53
+ # No need to having error in stderr above anymore because errors are handled in memory
54
+ # at ruby_server.rb but keeping around for posterity.
55
+ end
56
+
57
+ Jets.on_exception(e)
58
+ raise(e) # raise error to ruby_server.rb to rescue and handle
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,86 @@
1
+ module Jets
2
+ class RackServer
3
+ def self.start(options={})
4
+ new(options).start
5
+ end
6
+
7
+ def initialize(options={})
8
+ @options = options
9
+ end
10
+
11
+ def start
12
+ return unless File.exist?("#{rack_project}/config.ru")
13
+ puts "Starting additional rack server for the project under the rack subfolder..." if ENV['JETS_DEBUG']
14
+
15
+ if ENV['FOREGROUND']
16
+ serve
17
+ return
18
+ end
19
+
20
+ # Reaching here means we'll run the server in the background.
21
+ # Handle daemonzing ourselves because it keeps the stdout of the 2nd
22
+ # rack server. The rackup --daemonize option ends up hiding the output.
23
+ pid = Process.fork
24
+ if pid.nil?
25
+ # we're in the child process
26
+ serve
27
+ else
28
+ # we're in the parent process
29
+ Process.detach(pid) # dettached but still in the "foreground" since bin/rackup runs in the foreground
30
+ end
31
+ end
32
+
33
+ # Runs in the child process
34
+ def serve
35
+ # Note, looks like stopping jets server with Ctrl-C sends the TERM signal
36
+ # down to the sub bin/rackup command cleans up the child process fine.
37
+ Bundler.with_clean_env do
38
+ args = ''
39
+ # only forward the host option, port is always 9292 for simplicity
40
+ if @options[:host]
41
+ args << " --host #{@options[:host]}"
42
+ else
43
+ args << " --host 127.0.0.1" # using the default localhost is not starting up https://stackoverflow.com/questions/4356646/address-family-not-supported-by-protocol-family
44
+ end
45
+
46
+
47
+ command = "cd #{rack_project} && bin/rackup#{args}" # leads to the same wrapper rack scripts
48
+ puts "=> #{command}".color(:green)
49
+ system(command)
50
+ end
51
+ end
52
+
53
+ # blocks until rack server is up
54
+ def wait_for_socket
55
+ return unless Jets.rack?
56
+
57
+ retries = 0
58
+ max_retries = 30 # 15 seconds at a delay of 0.5s
59
+ delay = 0.5
60
+ if ENV['C9_USER'] # overrides for local testing
61
+ max_retries = 3
62
+ delay = 3
63
+ end
64
+ begin
65
+ server = TCPSocket.new('localhost', 9292)
66
+ server.close
67
+ rescue Errno::ECONNREFUSED, Errno::EAFNOSUPPORT
68
+ puts "Unable to connect to localhost:9292. Delay for #{delay} and will try to connect again." if ENV['JETS_DEBUG']
69
+ sleep(delay)
70
+ retries += 1
71
+ if retries < max_retries
72
+ retry
73
+ else
74
+ puts "Giving up on trying to connect to localhost:9292"
75
+ return false
76
+ end
77
+ end
78
+ puts "Connected to localhost:9292 successfully"
79
+ true
80
+ end
81
+
82
+ def rack_project
83
+ "#{Jets.root}/rack"
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,30 @@
1
+ module Jets
2
+ module Rdoc
3
+ # Use for both jets.gemspec and rake rdoc task
4
+ def options
5
+ exclude = %w[
6
+ docs
7
+ spec
8
+ vendor
9
+ core.rb
10
+ .js
11
+ templates
12
+ commands
13
+ internal
14
+ support
15
+ Dockerfile
16
+ Dockerfile.base
17
+ Gemfile
18
+ Gemfile.lock
19
+ Guardfile
20
+ LICENSE
21
+ Procfile
22
+ Rakefile
23
+ bin
24
+ ]
25
+ exclude = exclude.map { |word| ['-x', word] }.flatten
26
+ ["-m", "README.md", "--markup", "tomdoc"] + exclude
27
+ end
28
+ extend self
29
+ end
30
+ end
@@ -0,0 +1,71 @@
1
+ class Jets::Resource
2
+ extend Memoist
3
+
4
+ attr_reader :definition, :replacements
5
+ def initialize(definition, replacements={})
6
+ @definition = definition
7
+ @replacements = replacements
8
+ end
9
+
10
+ def template
11
+ standarize(definition)
12
+ end
13
+ memoize :template
14
+
15
+ # CloudFormation Resources reference: https://amzn.to/2NKg6ip
16
+ def standarize(*definition)
17
+ Standardizer.new(definition).template
18
+ end
19
+
20
+ def logical_id
21
+ id = template.keys.first
22
+ # replace possible {namespace} in the logical id
23
+ id = replacer.replace_value(id)
24
+ id = Jets::Camelizer.camelize(id)
25
+
26
+ Jets::Resource.truncate_id(id)
27
+ end
28
+
29
+ def self.truncate_id(id)
30
+ # Api Gateway resource name has a limit of 64 characters.
31
+ # Yet it throws not found when ID is longer than 62 characters and I don't know why.
32
+ # To keep it safe, let's stick to the 62 characters limit.
33
+ if id.size > 62
34
+ "#{id[0..55]}#{Digest::MD5.hexdigest(id)[0..5]}"
35
+ else
36
+ id
37
+ end
38
+ end
39
+
40
+ def type
41
+ attributes['Type']
42
+ end
43
+
44
+ def properties
45
+ attributes['Properties']
46
+ end
47
+
48
+ def attributes
49
+ attributes = template.values.first
50
+ attributes = replacer.replace_placeholders(attributes)
51
+ Jets::Camelizer.transform(attributes)
52
+ end
53
+
54
+ def parameters
55
+ {}
56
+ end
57
+
58
+ def outputs
59
+ {}
60
+ end
61
+
62
+ def replacer
63
+ Replacer.new(replacements)
64
+ end
65
+ memoize :replacer
66
+
67
+ def permission
68
+ Permission.new(replacements, self)
69
+ end
70
+ memoize :permission
71
+ end
@@ -0,0 +1,42 @@
1
+ module Jets::Resource::ApiGateway::BasePath
2
+ class Function < Jets::Resource::Base
3
+ include Jets::Resource::Lambda::Function::Environment
4
+
5
+ def definition
6
+ {
7
+ base_path_function: {
8
+ type: "AWS::Lambda::Function",
9
+ properties: {
10
+ function_name: function_name,
11
+ code: {
12
+ s3_bucket: "!Ref S3Bucket",
13
+ s3_key: code_s3_key,
14
+ },
15
+ role: "!GetAtt BasePathRole.Arn",
16
+ handler: handler,
17
+ runtime: "ruby2.5",
18
+ timeout: 60,
19
+ memory_size: 1536,
20
+ environment: env_properties[:environment],
21
+ }
22
+ }
23
+ }
24
+ end
25
+
26
+ def function_name
27
+ method = "jets-base-path"
28
+ # need to add the deployment timestamp because or else function name collides between deploys
29
+ timestamp = Jets::Resource::ApiGateway::Deployment.timestamp
30
+ "#{Jets.config.project_namespace}-#{method}-#{timestamp}"
31
+ end
32
+
33
+ def handler
34
+ "handlers/functions/jets/base_path.lambda_handler"
35
+ end
36
+
37
+ def code_s3_key
38
+ checksum = Jets::Builders::Md5.checksums["stage/code"]
39
+ "jets/code/code-#{checksum}.zip" # s3_key
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,44 @@
1
+ # CloudFormation Docs AWS::ApiGateway::DomainName: https://amzn.to/2BsrSqo
2
+ #
3
+ # Example:
4
+ #
5
+ # Type: AWS::ApiGateway::BasePathMapping
6
+ # Properties:
7
+ # BasePath: String
8
+ # DomainName: String
9
+ # RestApiId: String
10
+ # Stage: String
11
+ #
12
+ # Currently unable to add base path mapping in-place with CloudFormation.
13
+ # The workaround for this is to do it post deployment with raw API calls outside
14
+ # of CloudFormation. Leaving this around for now in case there's a workaround
15
+ # to get this into CloudFormation instead of raw API calls. Some notes:
16
+ # * Also tried to change the domain name of to something like demo-dev-[random].mydomain.com
17
+ # That does not work because the domain name has to match the route53 record exactly.
18
+ #
19
+ module Jets::Resource::ApiGateway::BasePath
20
+ class Mapping < Jets::Resource::Base
21
+ def definition
22
+ function_logical_id = "BasePathFunction" # lambda function that supports custom resource
23
+ {
24
+ base_path_mapping: {
25
+ type: "Custom::BasePathMapping",
26
+ properties: {
27
+ service_token: "!GetAtt #{function_logical_id}.Arn",
28
+ # base_path: '', # empty path represents root
29
+ # domain_name: "!Ref DomainName",
30
+ # rest_api_id: "!Ref RestApi", # since this is in the Deployment template
31
+ # stage: Deployment.stage_name,
32
+ },
33
+ depends_on: Jets::Resource::ApiGateway::Deployment.logical_id,
34
+ }
35
+ }
36
+ end
37
+
38
+ def outputs
39
+ {
40
+ "BasePathMapping" => "!Ref BasePathMapping",
41
+ }
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,76 @@
1
+ module Jets::Resource::ApiGateway::BasePath
2
+ class Role < Jets::Resource::Base
3
+ extend Memoist
4
+ include Jets::AwsServices
5
+
6
+ def definition
7
+ {
8
+ base_path_role: {
9
+ type: "AWS::IAM::Role",
10
+ properties: {
11
+ role_name: role_name,
12
+ path: "/",
13
+ assume_role_policy_document: {
14
+ version: "2012-10-17",
15
+ statement: [{
16
+ effect: "Allow",
17
+ principal: {service: ["lambda.amazonaws.com"]},
18
+ action: ["sts:AssumeRole"]}
19
+ ]
20
+ },
21
+ policies: [
22
+ policy_name: "#{role_name}-policy",
23
+ policy_document: policy_document,
24
+ ]
25
+ },
26
+ }
27
+ }
28
+ end
29
+
30
+ def policy_document
31
+ project_namespace = Jets.config.project_namespace
32
+ default_policy_statements = Jets::Application.default_iam_policy # Array of Hashes
33
+ apigateway = [{
34
+ action: [ "apigateway:*" ],
35
+ effect: "Allow",
36
+ resource: "arn:aws:apigateway:#{Jets.aws.region}::/restapis/*", # scoped to all restapis because this changes
37
+ },{
38
+ action: [ "apigateway:*" ],
39
+ effect: "Allow",
40
+ resource: "arn:aws:apigateway:#{Jets.aws.region}::/domainnames/*", # scoped to all restapis because this changes
41
+ }]
42
+ cloudformation = [{
43
+ action: ["cloudformation:DescribeStacks"],
44
+ effect: "Allow",
45
+ resource: "arn:aws:cloudformation:#{Jets.aws.region}:#{Jets.aws.account}:stack/#{project_namespace}*",
46
+ }]
47
+
48
+ # Combine the statements
49
+ {
50
+ version: '2012-10-17',
51
+ statement: default_policy_statements + apigateway + cloudformation
52
+ }
53
+ end
54
+
55
+ # Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb
56
+ def rest_api_id
57
+ stack_name = Jets::Naming.parent_stack_name
58
+ return "RestApi" unless stack_exists?(stack_name)
59
+
60
+ stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
61
+
62
+ api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
63
+
64
+ # resources = cfn.describe_stack_resources(stack_name: api_gateway_stack_arn).stack_resources
65
+ stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
66
+ rest_api_id = lookup(stack[:outputs], "RestApi")
67
+ end
68
+ memoize :rest_api_id
69
+
70
+ def role_name
71
+ # TODO: dont think we should change the role name every time but have to right now because the deployment logical id changes
72
+ timestamp = Jets::Resource::ApiGateway::Deployment.timestamp
73
+ "#{Jets.config.project_namespace}-base-path-mapping-#{timestamp}"
74
+ end
75
+ end
76
+ end