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,17 @@
1
+ class Jets::Controller
2
+ module Layout
3
+ extend ActiveSupport::Concern
4
+ included do
5
+ class_attribute :layout_name
6
+
7
+ def self.layout(name=nil)
8
+ if !name.nil?
9
+ name = name.to_s if name.is_a?(Symbol)
10
+ self.layout_name = name
11
+ else
12
+ self.layout_name
13
+ end
14
+ end
15
+ end # included
16
+ end # Layout
17
+ end
@@ -0,0 +1,60 @@
1
+ # The rack cors middleware handles all types of requests locally, this includes the OPTIONS request.
2
+ # Remotely on lambda, the rack cors middleware handles all requests except the OPTIONS request.
3
+ # The options request is handled by a OPTIONS API Gateway Method Mock. This is to allow it to bypass
4
+ # API Gateway authorizers.
5
+ module Jets::Controller::Middleware
6
+ class Cors
7
+ extend Memoist
8
+
9
+ def initialize(app)
10
+ @app = app
11
+ end
12
+
13
+ def call(env)
14
+ if env['REQUEST_METHOD'] == 'OPTIONS'
15
+ return [200, cors_headers(true), StringIO.new]
16
+ end
17
+
18
+ status, headers, body = @app.call(env)
19
+ cors_headers.each do |k,v|
20
+ headers[k] ||= v
21
+ end
22
+ [status, headers, body]
23
+ end
24
+
25
+ def cors_headers(preflight=false)
26
+ headers = case Jets.config.cors
27
+ when true
28
+ {
29
+ "access-control-allow-origin" => "*", # Required for CORS support to work
30
+ "access-control-allow-credentials" => "true" # Required for cookies, authorization headers with HTTPS
31
+ }
32
+ when String
33
+ {
34
+ "access-control-allow-origin" => Jets.config.cors, # contains Hash with Access-Control-Allow-* values
35
+ "access-control-allow-credentials" => "true" # Required for cookies, authorization headers with HTTPS
36
+ }
37
+ when Hash
38
+ Jets.config.cors # contains Hash with Access-Control-Allow-* values
39
+ else
40
+ {}
41
+ end
42
+
43
+ headers.merge!(preflight_headers) if preflight
44
+ headers
45
+ end
46
+
47
+ private
48
+ # Preflight OPTIONS request has extra headers.
49
+ # This is only used locally. Remotely on AWS Lambda, OPTIONS requests are handled by an API Gateway Method.
50
+ def preflight_headers
51
+ # FYI: Jets as part of the rack processing normalizes the casing of these headers eventually.
52
+ # IE: Access-Control-Allow-Methods
53
+ default = {
54
+ "access-control-allow-methods" => "DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT",
55
+ "access-control-allow-headers" => "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent",
56
+ }
57
+ Jets.config.cors_preflight || default
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,116 @@
1
+ require 'kramdown'
2
+
3
+ # Handles mimicking of API Gateway to Lambda function call locally
4
+ module Jets::Controller::Middleware
5
+ class Local
6
+ extend Memoist
7
+
8
+ def initialize(app)
9
+ @app = app
10
+ end
11
+
12
+ def call(env)
13
+ route = RouteMatcher.new(env).find_route
14
+ unless route
15
+ return [404, {'Content-Type' => 'text/html'}, not_found(env)]
16
+ end
17
+
18
+ mimic = MimicAwsCall.new(route, env)
19
+ # Make @controller and @meth instance available so we dont not have to pass it around.
20
+ @controller, @meth, @event = mimic.controller, mimic.meth, mimic.event
21
+
22
+ if route.to == 'jets/rack#process' # megamode
23
+ # Bypass the Jets middlewares since it could interfere with the Rack
24
+ # application's middleware stack.
25
+ #
26
+ # Rails sends back a transfer-encoding=chunked. Curling Rails directly works,
27
+ # but passing the Rails response back through this middleware results in errors.
28
+ # Disable chunking responses by deleting the transfer-encoding response header.
29
+ # Would like to understand why this happens this better, if someone can explain please let me know.
30
+ status, headers, body = @controller.dispatch! # jets/rack_controller
31
+ headers.delete "transfer-encoding"
32
+ [status, headers, body]
33
+ elsif polymorphic_function?
34
+ # Will never hit when calling polymorphic function on AWS Lambda.
35
+ # This can only really get called with the local server.
36
+ run_polymophic_function
37
+ else # Normal Jets request
38
+ mimick_aws_lambda!(env, mimic.vars) unless on_aws?(env)
39
+ @app.call(env)
40
+ end
41
+ end
42
+
43
+ def polymorphic_function?
44
+ polymorphic_function.task.lang != :ruby
45
+ end
46
+
47
+ def polymorphic_function
48
+ # Abusing PolyFun to run polymorphic code, should call LambdaExecutor directly
49
+ # after reworking LambdaExecutor so it has a better interface.
50
+ Jets::PolyFun.new(@controller.class, @meth)
51
+ end
52
+ memoize :polymorphic_function
53
+
54
+ def run_polymophic_function
55
+ resp = polymorphic_function.run(@event, @meth) # polymorphic code
56
+ status = resp['statusCode']
57
+ headers = resp['headers']
58
+ body = StringIO.new(resp['body'])
59
+ [status, headers, body] # triplet
60
+ end
61
+
62
+ # Modifies env the in the same way real call from AWS lambda would modify env
63
+ def mimick_aws_lambda!(env, vars)
64
+ env.merge!(vars)
65
+ env
66
+ end
67
+
68
+ def on_aws?(env)
69
+ return false if ENV['TEST'] # usually with test we're passing in full API Gateway fixtures with the HTTP_X_AMZN_TRACE_ID
70
+ on_cloud9 = !!(env['HTTP_HOST'] =~ /cloud9\..*\.amazonaws\.com/)
71
+ !!env['HTTP_X_AMZN_TRACE_ID'] && !on_cloud9
72
+ end
73
+
74
+ def routes_error_message(env)
75
+ message = "<h2>404 Error: Route #{env['PATH_INFO'].sub('/','')} not found</h2>"
76
+ if Jets.env != "production"
77
+ message << "<p>Here are the routes defined in your application:</p>"
78
+ message << "#{routes_table}"
79
+ end
80
+ message
81
+ end
82
+
83
+ def not_found(env)
84
+ message = routes_error_message(env)
85
+ body = <<~HTML
86
+ <!DOCTYPE html>
87
+ <html>
88
+ <head>
89
+ <meta charset="utf-8">
90
+ <title>Route not found</title>
91
+ </head>
92
+ <body>
93
+ #{message}
94
+ </body>
95
+ </html>
96
+ HTML
97
+ StringIO.new(body)
98
+ end
99
+
100
+ # Show pretty route table for user to help with debugging in non-production mode
101
+ def routes_table
102
+ routes = Jets::Router.routes
103
+
104
+ return "Your routes table is empty." if routes.empty?
105
+
106
+ text = "Verb | Path | Controller#action\n"
107
+ text << "--- | --- | ---\n"
108
+ routes.each do |route|
109
+ text << "#{route.method} | #{route.path} | #{route.to}\n"
110
+ end
111
+ html = Kramdown::Document.new(text).to_html
112
+ puts html
113
+ html
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,93 @@
1
+ # Takes a Rack env and converts to ApiGateway event
2
+ class Jets::Controller::Middleware::Local
3
+ class ApiGateway
4
+ extend Memoist
5
+
6
+ def initialize(route, env)
7
+ @route, @env = route, env
8
+ end
9
+
10
+ def event
11
+ resource = @route.path(:api_gateway) # posts/{id}/edit
12
+ path = @env['PATH_INFO'].sub('/','') # remove beginning slash
13
+ {
14
+ "resource" => "/#{resource}", # "/posts/{id}/edit"
15
+ "path" => @env['PATH_INFO'], # /posts/tung/edit
16
+ "httpMethod" => @env['REQUEST_METHOD'], # GET
17
+ "headers" => request_headers,
18
+ "queryStringParameters" => query_string_parameters,
19
+ "pathParameters" => @route.extract_parameters(path),
20
+ "stageVariables" => nil,
21
+ "requestContext" => {},
22
+ "body" => get_body,
23
+ "isBase64Encoded" => false,
24
+ }
25
+ end
26
+ memoize :event
27
+
28
+ # Annoying. The headers part of the AWS Lambda proxy structure
29
+ # does not consisently use the same casing scheme for the header keys.
30
+ # Sometimes it looks like this:
31
+ # Accept-Encoding
32
+ # and sometimes it looks like this:
33
+ # cache-control
34
+ # Map for special cases when the casing doesn't match.
35
+ CASING_MAP = {
36
+ "Cache-Control" => "cache-control",
37
+ "Content-Type" => "content-type",
38
+ "Origin" => "origin",
39
+ "Upgrade-Insecure-Requests" => "upgrade-insecure-requests",
40
+ }
41
+
42
+ # Map rack env headers to Api Gateway event headers. Most rack env headers are
43
+ # prepended by HTTP_.
44
+ #
45
+ # Some API Gateway Lambda Proxy are also in the rack env headers. Example:
46
+ #
47
+ # "X-Amz-Cf-Id": "W8DF6J-lx1bkV00eCiBwIq5dldTSGGiG4BinJlxvN_4o8fCZtbsVjw==",
48
+ # "X-Amzn-Trace-Id": "Root=1-5a0dc1ac-58a7db712a57d6aa4186c2ac",
49
+ # "X-Forwarded-For": "88.88.88.88, 54.239.203.117",
50
+ # "X-Forwarded-Port": "443",
51
+ # "X-Forwarded-Proto": "https",
52
+ #
53
+ # For sample dump of the event headers, check out:
54
+ # spec/fixtures/samples/event-headers-form-post.json
55
+ #
56
+ # We generally do add those API Gateway Lambda specific headers because
57
+ # they would be fake anyway and by not adding them we can distinguish a
58
+ # local request from a remote request on API Gateway.
59
+ def request_headers
60
+ headers = @env.select { |k,v| k =~ /^HTTP_/ }.inject({}) do |h,(k,v)|
61
+ # map things like HTTP_USER_AGENT to "User-Agent"
62
+ key = k.sub('HTTP_','').split('_').map(&:capitalize).join('-')
63
+ h[key] = v
64
+ h
65
+ end
66
+ # Content type is not prepended with HTTP_
67
+ headers["Content-Type"] = @env["CONTENT_TYPE"] if @env["CONTENT_TYPE"]
68
+
69
+ # Adjust the casing so it matches the Lambda AWS Proxy structure
70
+ CASING_MAP.each do |nice_casing, bad_casing|
71
+ if headers.key?(nice_casing)
72
+ headers[bad_casing] = headers.delete(nice_casing)
73
+ end
74
+ end
75
+
76
+ headers
77
+ end
78
+
79
+ def query_string_parameters
80
+ Rack::Utils.parse_nested_query(@env['QUERY_STRING'])
81
+ end
82
+
83
+ # To get the post body:
84
+ # rack.input: #<StringIO:0x007f8ccf8db9a0>
85
+ def get_body
86
+ input = @env["rack.input"] || StringIO.new
87
+ body = input.read
88
+ input.rewind # IMPORTANT or else it screws up other middlewares that use the body
89
+ # return nil for blank string, because Lambda AWS_PROXY does this
90
+ body unless body.empty?
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,38 @@
1
+ class Jets::Controller::Middleware::Local
2
+ class MimicAwsCall
3
+ extend Memoist
4
+
5
+ def initialize(route, env)
6
+ @route, @env = route, env
7
+ end
8
+
9
+ def vars
10
+ {
11
+ 'jets.controller' => controller,
12
+ 'lambda.context' => context,
13
+ 'lambda.event' => event,
14
+ 'lambda.meth' => meth,
15
+ }
16
+ end
17
+
18
+ # Actual controller instance
19
+ def controller
20
+ controller_class = @route.controller_name.constantize
21
+ meth = @route.action_name
22
+ controller_class.new(event, context, meth)
23
+ end
24
+
25
+ def meth
26
+ @route.action_name
27
+ end
28
+
29
+ def event
30
+ @env['adapter.event'] || ApiGateway.new(@route, @env).event
31
+ end
32
+ memoize :event
33
+
34
+ def context
35
+ @env['adapter.context'] || {"fake" => "context in mimic_aws_call.rb"}
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,106 @@
1
+ class Jets::Controller::Middleware::Local
2
+ class RouteMatcher
3
+ def initialize(env)
4
+ @env = env
5
+ end
6
+
7
+ def find_route
8
+ reset_routes!
9
+ # Precedence:
10
+ # 1. Routes with no captures get highest precedence: posts/new
11
+ # 2. Then we consider the routes with captures: post/:id
12
+ #
13
+ # Within these 2 groups we consider the routes with the longest path first
14
+ # since posts/:id and posts/:id/edit can both match.
15
+ routes = router.ordered_routes
16
+ route = routes.find do |r|
17
+ route_found?(r)
18
+ end
19
+ route
20
+ end
21
+
22
+ # "hot reload" for development
23
+ def reset_routes!
24
+ return unless Jets.env.development?
25
+
26
+ Jets::Router.clear!
27
+ Jets.application.load_routes(refresh: true)
28
+ end
29
+
30
+ def route_found?(route)
31
+ request_method = @env["REQUEST_METHOD"] || "GET"
32
+ actual_path = @env["PATH_INFO"].sub(/^\//,'') # remove beginning slash
33
+
34
+ # Immediately stop checking when the request method: GET, POST, ANY, etc
35
+ # doesnt match.
36
+ return false if request_method != route.method and route.method != "ANY"
37
+
38
+ path = route.path
39
+
40
+ if actual_path == path
41
+ # regular string match detection
42
+ return true # exact route matches are highest precedence
43
+ end
44
+
45
+ # Check path for route capture and wildcard matches:
46
+ # A colon (:) means the variable has a variable
47
+ if path.include?(':') # 2nd highest precedence
48
+ capture_detection(path, actual_path) # early return true or false
49
+ # A star (*) means the variable has a glob
50
+ elsif path.include?('*') # lowest precedence
51
+ proxy_detection(path, actual_path) # early return true or false
52
+ else
53
+ false # reach here, means no route matched
54
+ end
55
+ end
56
+
57
+ # catchall/globbing/wildcard/proxy routes. Examples:
58
+ #
59
+ # get "files/*path", to: "files#show"
60
+ # get "others/*rest", to: "others#show"
61
+ # get "*catchall", to: "public_files#show" # last catchall route for Jets
62
+ #
63
+ def proxy_detection(route_path, actual_path)
64
+ # drop the proxy_segment
65
+ leading_path = route_path.split('/')[0..-2].join('/')
66
+
67
+ # get "*catchall", to: "public_files#show"
68
+ if leading_path.empty? # This is the last catchall route "*catchall"
69
+ return true # always return true here because the entire path
70
+ # will always match
71
+ end
72
+
73
+ # Other types of wildcard route:
74
+ #
75
+ # get "files/*path", to: "files#show"
76
+ # get "others/*rest", to: "others#show"
77
+ unless leading_path.ends_with?('/')
78
+ # Ensure trailing slash to make pattern matching stricter
79
+ leading_path = "#{leading_path}/"
80
+ end
81
+
82
+ pattern = "^#{leading_path}"
83
+ regexp = Regexp.new(pattern)
84
+ !!regexp.match(actual_path) # could be true or false
85
+ end
86
+
87
+ def capture_detection(route_path, actual_path)
88
+ # changes path to a string used for a regexp
89
+ # posts/:id/edit => posts\/(.*)\/edit
90
+
91
+ regexp_string = route_path.split('/').map do |s|
92
+ s.include?(':') ? Jets::Route::CAPTURE_REGEX : s
93
+ end.join('\/')
94
+ # make sure beginning and end of the string matches
95
+ regexp_string = "^#{regexp_string}$"
96
+
97
+ regexp = Regexp.new(regexp_string)
98
+ !!regexp.match(actual_path) # could be true or false
99
+ end
100
+
101
+ def router
102
+ return @router if @router
103
+ @router = Jets.application.routes
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,46 @@
1
+ # All roads lead here
2
+ #
3
+ # 1. AWS Lambda: PostsController - Rack::Adapter - Jets.application.call
4
+ # 2. Local server: config.ru - run Jet.application - Jets.application.call
5
+ #
6
+ # Then eventually:
7
+ #
8
+ # Jets.application.call - Middleware stack - Jets::Controller::Middleware::Main
9
+ #
10
+ module Jets::Controller::Middleware
11
+ class Main
12
+ def initialize(env)
13
+ @env = env
14
+ @controller = env['jets.controller']
15
+ @event = env['lambda.event']
16
+ @context = env['lambda.context']
17
+ @meth = env['lambda.meth']
18
+ end
19
+
20
+ def call
21
+ dup.call!
22
+ end
23
+
24
+ def call!
25
+ setup
26
+ @controller.dispatch! # Returns triplet
27
+ end
28
+
29
+ # Common setup logical at this point of middleware processing right before
30
+ # calling any controller actions.
31
+ def setup
32
+ # We already recreated a mimicke rack env earlier as part of the very first
33
+ # middleware layer. However, by the time the rack env reaches the main middleware
34
+ # it could had been updated by other middlewares. We update the env here again.
35
+ @controller.request.set_env!(@env)
36
+ # This allows sesison helpers to work. Sessions are managed by
37
+ # the Rack::Session::Cookie middleware by default.
38
+ @controller.session = @env['rack.session'] || {}
39
+ end
40
+
41
+ def self.call(env)
42
+ instance = new(env)
43
+ instance.call
44
+ end
45
+ end
46
+ end