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,42 @@
1
+ class Jets::Resource::ApiGateway::RestApi
2
+ class ChangeDetection
3
+ extend Memoist
4
+ include Jets::AwsServices
5
+
6
+ def changed?
7
+ return false unless parent_stack_exists?
8
+ current_binary_media_types != new_binary_media_types ||
9
+ Routes.changed?
10
+ end
11
+
12
+ def new_binary_media_types
13
+ rest_api = Jets::Resource::ApiGateway::RestApi.new
14
+ rest_api.binary_media_types
15
+ end
16
+ memoize :new_binary_media_types
17
+
18
+ # Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb
19
+ def current_binary_media_types
20
+ return nil unless parent_stack_exists?
21
+
22
+ stack = cfn.describe_stacks(stack_name: parent_stack_name).stacks.first
23
+
24
+ api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
25
+
26
+ stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
27
+ rest_api_id = lookup(stack[:outputs], "RestApi")
28
+
29
+ resp = apigateway.get_rest_api(rest_api_id: rest_api_id)
30
+ resp.binary_media_types
31
+ end
32
+ memoize :current_binary_media_types
33
+
34
+ def parent_stack_exists?
35
+ stack_exists?(parent_stack_name)
36
+ end
37
+
38
+ def parent_stack_name
39
+ Jets::Naming.parent_stack_name
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,63 @@
1
+ class Jets::Resource::ApiGateway::RestApi
2
+ class LogicalId
3
+ extend Memoist
4
+ include Jets::AwsServices
5
+
6
+ def get
7
+ return default unless stack_exists?(parent_stack_name) && api_gateway_exists?
8
+
9
+ if changed?
10
+ new_id
11
+ else
12
+ current
13
+ end
14
+ end
15
+
16
+ def changed?
17
+ change_detection = ChangeDetection.new
18
+ change_detection.changed?
19
+ end
20
+
21
+ # Takes current logical id and increments the number that is appended to it.
22
+ #
23
+ # Examples:
24
+ #
25
+ # RestApi => RestApi1
26
+ # RestApi1 => RestApi2
27
+ # RestApi2 => RestApi3
28
+ # RestApi7 => RestApi8
29
+ def new_id
30
+ regexp = /(\d+)/
31
+ md = current.match(regexp)
32
+ if md
33
+ current.gsub(regexp,'') + (md[1].to_i + 1).to_s
34
+ else
35
+ current + "1"
36
+ end
37
+ end
38
+
39
+ def current
40
+ resources = cfn.describe_stack_resources(stack_name: api_gateway_stack_arn).stack_resources
41
+ rest_api = resources.find { |r| r.resource_type == 'AWS::ApiGateway::RestApi' }
42
+ rest_api.logical_resource_id
43
+ end
44
+ memoize :current
45
+
46
+ def api_gateway_stack_arn
47
+ stack = cfn.describe_stacks(stack_name: parent_stack_name).stacks.first
48
+ lookup(stack[:outputs], "ApiGateway") # api_gateway_stack_arn
49
+ end
50
+
51
+ def api_gateway_exists?
52
+ !!api_gateway_stack_arn
53
+ end
54
+
55
+ def parent_stack_name
56
+ Jets::Naming.parent_stack_name
57
+ end
58
+
59
+ def default
60
+ "RestApi"
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,7 @@
1
+ class Jets::Resource::ApiGateway::RestApi
2
+ class Routes
3
+ def self.changed?
4
+ Change.new.changed?
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ # Detects route changes
2
+ class Jets::Resource::ApiGateway::RestApi::Routes
3
+ class Change
4
+ def changed?
5
+ To.changed? || Variable.changed? || ENV['JETS_REPLACE_API']
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,130 @@
1
+ class Jets::Resource::ApiGateway::RestApi::Routes::Change
2
+ class Base
3
+ extend Memoist
4
+ include Jets::AwsServices
5
+
6
+ # Build up deployed routes from the existing CloudFormation resources.
7
+ def deployed_routes
8
+ routes = []
9
+
10
+ resources, position = [], true
11
+ while position
12
+ position = nil if position == true # start of loop
13
+ resp = apigateway.get_resources(
14
+ rest_api_id: rest_api_id,
15
+ position: position,
16
+ )
17
+ resources += resp.items
18
+ position = resp.position
19
+ end
20
+
21
+ resources.each do |resource|
22
+ resource_methods = resource.resource_methods
23
+ next if resource_methods.nil?
24
+
25
+ resource_methods.each do |http_verb, resource_method|
26
+ # puts "#{http_verb} #{resource.path} | resource.id #{resource.id}"
27
+ # puts to(resource.id, http_verb)
28
+
29
+ # Test changing config.cors and CloudFormation does an in-place update
30
+ # on the resource. So no need to do bluegreen deployments for OPTIONS.
31
+ next if http_verb == "OPTIONS"
32
+
33
+ path = recreate_path(resource.path)
34
+ method = http_verb.downcase.to_sym
35
+ to = to(resource.id, http_verb)
36
+ route = Jets::Route.new(path: path, method: method, to: to)
37
+ routes << route
38
+ end
39
+ end
40
+ routes
41
+ end
42
+ memoize :deployed_routes
43
+
44
+ def recreate_path(path)
45
+ path = path.gsub(%r{^/},'')
46
+ path = path.gsub(/{([^}]*)\+}/, '*\1')
47
+ path.gsub(/{([^}]*)}/, ':\1')
48
+ end
49
+
50
+ def to(resource_id, http_method)
51
+ uri = method_uri(resource_id, http_method)
52
+ recreate_to(uri) unless uri.nil?
53
+ end
54
+
55
+ def method_uri(resource_id, http_method)
56
+ resp = apigateway.get_method(
57
+ rest_api_id: rest_api_id,
58
+ resource_id: resource_id,
59
+ http_method: http_method
60
+ )
61
+ resp.method_integration.uri
62
+ end
63
+
64
+ # Parses method uri and recreates a Route to argument.
65
+ # So:
66
+ # "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:112233445566:function:demo-test-posts_controller-new/invocations"
67
+ # Returns:
68
+ # posts#new
69
+ def recreate_to(method_uri)
70
+ md = method_uri.match(/function:(.*)\//)
71
+ function_arn = md[1] # IE: demo-dev-posts_controller-new
72
+ controller, action = get_controller_action(function_arn)
73
+ "#{controller}##{action}" # IE: posts#new
74
+ end
75
+
76
+ def get_controller_action(function_arn)
77
+ if function_arn.include?('_controller-')
78
+ controller_action_from_string(function_arn)
79
+ else
80
+ controller_action_from_api(function_arn)
81
+ end
82
+ end
83
+
84
+ # TODO: If this hits the Lambda Rate limit, then list_functions also contains the Lambda
85
+ # function description. So we can paginate through list_functions results and store
86
+ # description from there if needed.
87
+ # Dont think this will be needed though because controller_action_from_string gets called
88
+ # most of the time. Also, user might be able to request their Lambda limit to be increased.
89
+ def controller_action_from_api(function_arn)
90
+ desc = lambda_function_description(function_arn)
91
+ controller, action = desc.split('#')
92
+ controller = controller.underscore.sub(/_controller$/,'')
93
+ [controller, action]
94
+ end
95
+
96
+ def controller_action_from_string(function_arn)
97
+ controller_action = function_arn.sub("#{Jets.project_namespace}-", '')
98
+ md = controller_action.match(/(.*)_controller-(.*)/)
99
+ controller = md[1]
100
+ controller = controller.gsub('-','/')
101
+ action = md[2]
102
+ [controller, action]
103
+ end
104
+
105
+ def lambda_function_description(function_arn)
106
+ resp = aws_lambda.get_function(function_name: function_arn)
107
+ resp.configuration.description # contains full info: PostsController#index
108
+ end
109
+
110
+ # Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb
111
+ def rest_api_id
112
+ stack_name = Jets::Naming.parent_stack_name
113
+ return "RestApi" unless stack_exists?(stack_name)
114
+
115
+ stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
116
+
117
+ api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
118
+
119
+ # resources = cfn.describe_stack_resources(stack_name: api_gateway_stack_arn).stack_resources
120
+ stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
121
+ lookup(stack[:outputs], "RestApi") # rest_api_id
122
+ end
123
+ memoize :rest_api_id
124
+
125
+ def new_routes
126
+ Jets::Router.routes
127
+ end
128
+ memoize :new_routes
129
+ end
130
+ end
@@ -0,0 +1,29 @@
1
+ # Detects route to changes
2
+ class Jets::Resource::ApiGateway::RestApi::Routes::Change
3
+ class To < Base
4
+ def self.changed?
5
+ new.changed?
6
+ end
7
+
8
+ def changed?
9
+ deployed_routes.each do |deployed_route|
10
+ new_route = find_comparable_route(deployed_route)
11
+ if new_route && new_route.to != deployed_route.to
12
+ # change in already deployed route has been detected, requires bluegreen deploy
13
+ return true
14
+ end
15
+ end
16
+ false # Reaching here means no routes have been changed in a way that requires a bluegreen deploy
17
+ end
18
+
19
+ # Find a route that has the same path and method. This is a comparable route
20
+ # Then we will compare the to or controller action to see if an already
21
+ # deployed route has been changed.
22
+ def find_comparable_route(deployed_route)
23
+ new_routes.find do |new_route|
24
+ new_route.path == deployed_route.path &&
25
+ new_route.method == deployed_route.method
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,39 @@
1
+ # Detects route variable changes
2
+ class Jets::Resource::ApiGateway::RestApi::Routes::Change
3
+ class Variable < Base
4
+ def self.changed?
5
+ new.changed?
6
+ end
7
+
8
+ def changed?
9
+ changed = false
10
+ deployed_routes.each do |deployed_route|
11
+ parent = collision.variable_parent(deployed_route.path)
12
+ parent_variables = collision.parent_variables(parent, [deployed_route.path])
13
+ new_parent_variables = collision.parent_variables(parent, new_paths)
14
+
15
+ changed = parent_variables.size > 0 && new_parent_variables.size > 0 &&
16
+ parent_variables != new_parent_variables
17
+ break if changed
18
+ end
19
+ changed
20
+ end
21
+
22
+ # Only consider paths with variables
23
+ def new_paths
24
+ new_routes.map(&:path).select {|p| p.include?(':')}.uniq
25
+ end
26
+
27
+ # Only consider deployed routes with variables
28
+ def deployed_routes
29
+ deployed_routes = super
30
+ deployed_routes.select do |route|
31
+ route.path.include?(':')
32
+ end
33
+ end
34
+
35
+ def collision
36
+ @collision ||= Jets::Resource::ApiGateway::RestApi::Routes::Collision.new
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,121 @@
1
+ # Detects path variable collisions
2
+ class Jets::Resource::ApiGateway::RestApi::Routes
3
+ class Collision
4
+ attr_reader :collisions
5
+ def initialize
6
+ @collisions = []
7
+ end
8
+
9
+ def collision?(paths)
10
+ paths = paths_with_variables(paths)
11
+ parents = variable_parents(paths)
12
+
13
+ collide = false
14
+ parents.each do |parent|
15
+ collide ||= variable_collision_exists?(parent, paths)
16
+ end
17
+ collide
18
+ end
19
+
20
+ def exception
21
+ VariableException.new(collision_message)
22
+ end
23
+
24
+ def collision_message
25
+ <<~EOL
26
+ There are routes with sibling variables under the same parent that collide.
27
+
28
+ Collisions:
29
+ #{@collisions.join("\n ")}
30
+
31
+ API Gateway only allows one unique variable path You must use the same variable name within
32
+ the same parent route path.
33
+ Example: /posts/:id and /posts/:post_id/reveal should both be /posts/:id and /posts/:id/reveal.
34
+
35
+ Please check your `config/routes.rb` and remove the colliding routes.
36
+ More info: http://rubyonjets.com/docs/considerations/api-gateway/
37
+ EOL
38
+ end
39
+
40
+ def variable_collision_exists?(parent, paths)
41
+ paths = paths_with_variables(paths)
42
+ variables = parent_variables(parent, paths)
43
+ collide = variables.uniq.size > 1
44
+ register_collision(parent, variables) if collide
45
+ collide
46
+ end
47
+
48
+ # register collision for later display
49
+ # We don't register the full path but this might be more helpful.
50
+ def register_collision(parent, variables)
51
+ return unless variables.uniq.size # check again just in case
52
+
53
+ variables.each do |v|
54
+ @collisions << "#{parent}/#{v}"
55
+ end
56
+ @collisions.uniq!
57
+ end
58
+
59
+ def parent_variables(parent, paths)
60
+ paths = paths.select do |path|
61
+ parent?(parent, path)
62
+ end
63
+ paths.map do |path|
64
+ path.sub("#{parent}/",'').gsub(%r{/.*},'')
65
+ end.uniq.sort
66
+ end
67
+
68
+ def parent?(parent, path)
69
+ return false if parent == path
70
+
71
+ parent_parts = parent.split('/')
72
+ path_parts = path.split('/')
73
+
74
+ n = parent_parts.size-1
75
+ parent_parts[0..n] == path_parts[0..n]
76
+ end
77
+
78
+ def direct_parent?(parent, path)
79
+ leaf = variable_leaf(path)
80
+ leaf_parent = leaf.split('/')[0..-2].join('/')
81
+ parent == leaf_parent
82
+ end
83
+
84
+ def variable_parents(paths)
85
+ parents = []
86
+ paths = paths_with_variables(paths)
87
+ paths.each do |path|
88
+ parents << variable_parent(path)
89
+ end
90
+ parents.uniq.sort
91
+ end
92
+
93
+ # Strips the path down until only the leaf node part is a variable
94
+ # Example: users/:user_id/posts/:post_id/edit
95
+ # Returns: users/:user_id/posts
96
+ def variable_parent(path)
97
+ path = variable_leaf(path)
98
+ # drop last variable to leave behind the parent
99
+ path.split('/')[0..-2].join('/')
100
+ end
101
+
102
+ # Strips the path down until only the leaf node part is a variable
103
+ # Example: users/:user_id/posts/:post_id/edit
104
+ # Returns: users/:user_id/posts
105
+ def variable_leaf(path)
106
+ return '' unless path.include?(':')
107
+
108
+ parts = path.split('/')
109
+ is_variable = parts.last.include?(':')
110
+ until is_variable
111
+ parts.pop
112
+ is_variable = parts.last.include?(':')
113
+ end
114
+ parts[0..-1].join('/') # parent
115
+ end
116
+
117
+ def paths_with_variables(paths)
118
+ paths.select { |p| p.include?(':') }.uniq
119
+ end
120
+ end
121
+ end