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,63 @@
1
+ module Jets::Cfn::Builders
2
+ class ApiDeploymentBuilder
3
+ include Interface
4
+ include Jets::AwsServices
5
+
6
+ def initialize(options={})
7
+ @options = options
8
+ @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
9
+ end
10
+
11
+ # template is an interface method
12
+ def template
13
+ @template
14
+ end
15
+
16
+ # compose is an interface method
17
+ def compose
18
+ return unless @options[:templates] || @options[:stack_type] != :minimal
19
+
20
+ deployment = Jets::Resource::ApiGateway::Deployment.new
21
+ add_resource(deployment)
22
+ add_parameters(deployment.parameters)
23
+ add_outputs(deployment.outputs)
24
+
25
+ add_base_path_mapping
26
+ end
27
+
28
+ # Because Jets generates a new timestamped logical id for the API Deployment
29
+ # resource it also creates a new root base path mapping and fails. Additionally,
30
+ # the base path mapping depends on the API Deploy for the stage name.
31
+ #
32
+ # We resolve this by using a custom resource that does an in-place update.
33
+ #
34
+ # Note, also tried to change the domain name of to something like demo-dev-[random].mydomain.com
35
+ # but that does not work because the domain name has to match the route53 record exactly.
36
+ #
37
+ def add_base_path_mapping
38
+ return unless Jets.custom_domain?
39
+
40
+ function = Jets::Resource::ApiGateway::BasePath::Function.new
41
+ add_resource(function)
42
+ add_outputs(function.outputs)
43
+
44
+ mapping = Jets::Resource::ApiGateway::BasePath::Mapping.new
45
+ add_resource(mapping)
46
+ add_outputs(mapping.outputs)
47
+
48
+ iam_role = Jets::Resource::ApiGateway::BasePath::Role.new
49
+ add_resource(iam_role)
50
+ add_outputs(iam_role.outputs)
51
+ end
52
+
53
+ # template_path is an interface method
54
+ def template_path
55
+ Jets::Naming.api_deployment_template_path
56
+ end
57
+
58
+ # do not bother writing a template if routes are empty
59
+ def write
60
+ super unless Jets::Router.routes.empty?
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,157 @@
1
+ module Jets::Cfn::Builders
2
+ class ApiGatewayBuilder
3
+ extend Memoist
4
+ include Interface
5
+ include Paged
6
+ include Jets::AwsServices
7
+
8
+ AWS_OUTPUT_LIMIT = 60
9
+
10
+ def initialize(options={})
11
+ @options = options
12
+ push(ActiveSupport::HashWithIndifferentAccess.new(Resources: {}))
13
+ end
14
+
15
+ # template is an interface method
16
+ def template
17
+ current_page
18
+ end
19
+
20
+ # compose is an interface method
21
+ def compose
22
+ return unless @options[:templates] || @options[:stack_type] != :minimal
23
+
24
+ populate_base_template
25
+ add_gateway_routes
26
+ end
27
+
28
+ # template_path is an interface method
29
+ def template_path
30
+ Jets::Naming.api_gateway_template_path("-#{current_page_number}")
31
+ end
32
+
33
+ # do not bother writing a template if routes are empty
34
+ def write
35
+ super unless Jets::Router.routes.empty?
36
+ end
37
+
38
+ # If the are routes in config/routes.rb add Gateway API in parent stack
39
+ def add_gateway_rest_api
40
+ rest_api = Jets::Resource::ApiGateway::RestApi.new
41
+ add_resource(rest_api)
42
+ add_outputs(rest_api.outputs)
43
+
44
+ deployment = Jets::Resource::ApiGateway::Deployment.new
45
+ outputs = deployment.outputs(true)
46
+ add_output("RestApiUrl", Value: outputs["RestApiUrl"])
47
+ end
48
+
49
+ def add_custom_domain
50
+ return unless Jets.custom_domain?
51
+ add_domain_name
52
+ add_route53_dns if Jets.config.domain.route53
53
+ end
54
+
55
+ def add_domain_name
56
+ domain_name = Jets::Resource::ApiGateway::DomainName.new
57
+ add_resource(domain_name)
58
+ add_outputs(domain_name.outputs)
59
+ end
60
+
61
+ def add_route53_dns
62
+ dns = Jets::Resource::Route53::RecordSet.new
63
+ add_resource(dns)
64
+ add_outputs(dns.outputs)
65
+ end
66
+
67
+ # The base template holds RestApi, DomainName, and DnsRecord
68
+ # The base template will be added to the parent template as "ApiGateway"
69
+ # Giving the original name will limit the number of changes required for
70
+ # the AWS 60 output limit change.
71
+ def populate_base_template
72
+ add_gateway_rest_api
73
+ add_custom_domain
74
+ end
75
+
76
+ # Adds route related Resources and Outputs
77
+ def add_gateway_routes
78
+ # The routes required a Gateway Resource to contain them.
79
+ # TODO: Support more routes. Right now outputing all routes in 1 template will hit the 60 routes limit.
80
+ # Will have to either output them as a joined string or break this up to multiple templates.
81
+ # http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html
82
+ # Outputs: Maximum number of outputs that you can declare in your AWS CloudFormation template. 60 outputs
83
+ # Output name: Maximum size of an output name. 255 characters.
84
+ #
85
+ # Note we must use .all_paths, not .routes here because we need to
86
+ # build the parent ApiGateway::Resource nodes also
87
+ indexed_paths.each do |path, page_number|
88
+ homepage = path == ''
89
+ next if homepage # handled by RootResourceId output already
90
+ turn_to_page(page_number)
91
+ resource = Jets::Resource::ApiGateway::Resource.new(path, internal: true, indexed_paths: indexed_paths)
92
+ add_resource(resource)
93
+ add_outputs_and_exports(resource.outputs)
94
+ add_gateway_routes_parameters(resource, page_number)
95
+ end
96
+ end
97
+
98
+ # TODO : consider refactoring this to make intent more clear
99
+ def add_gateway_routes_parameters(resource, page_number)
100
+ add_parameter('RestApi', Description: 'RestApi')
101
+ add_parameter('RootResourceId', Description: 'RootResourceId')
102
+ resource.required_resources_from_parameters.each do |required_resource|
103
+ add_parameter(required_resource[:logical_id], Description: required_resource[:logical_id])
104
+ required_parameters_for_page = required_parameters[page_number] ||= []
105
+ required_parameters_for_page.push required_resource
106
+ end
107
+ end
108
+
109
+ # required_parameters will be used by the Parent Builder to know what parameters need to be passed
110
+ # to gateway template
111
+ def required_parameters
112
+ @required_parameters ||= []
113
+ end
114
+
115
+ def add_outputs_and_exports(attributes)
116
+ attributes.each do |name,value|
117
+ camelized_name = name.to_s.camelize
118
+ add_output(camelized_name, value)
119
+ end
120
+ end
121
+
122
+ # Gateway routes are split across multiple CloudFormation templates because of a 60 Output limit by AWS.
123
+ # Having a resource and its corresponding parent resource ( :ParentId ) in the same template is not guaranteed
124
+ # so routes are indexed up front to allow us to determine how to find :ParentId ( !Ref vs !ImportValue )
125
+ def indexed_paths
126
+ # indexed_paths is a Hash with key => path and value => page_number. Each page number represents a separate
127
+ # template for the routes contained in it.
128
+ # The reason for making the hash is we need to pass these indexed_paths to Jets::Resource::ApiGateway::Resource so it can
129
+ # easily determine what page a parent path is in.
130
+ # NOTE: that we are trying to keep Outputs to 60 and below, however, we are indexing "paths" here. Currently there
131
+ # is a one to one relationship to paths and outputs for Jets::Resource::ApiGateway::Resource. If that one to one changes
132
+ # this solution will not work
133
+ indexed_paths = Hash.new
134
+ # root path == RootResource which comes off RestApi and is in ApiGateway0
135
+ indexed_paths[''] = 0
136
+ starting_index = 0
137
+ page = 1
138
+ loop do
139
+ new_template # create new template here since we know we will need this page later
140
+ Jets::Router.all_paths[starting_index, AWS_OUTPUT_LIMIT].each do |path|
141
+ next if path.empty?
142
+ indexed_paths[path] = page
143
+ end
144
+ starting_index += AWS_OUTPUT_LIMIT
145
+ page += 1
146
+ break if starting_index >= Jets::Router.all_paths.length
147
+ end
148
+
149
+ indexed_paths
150
+ end
151
+ memoize :indexed_paths
152
+
153
+ def new_template
154
+ push(ActiveSupport::HashWithIndifferentAccess.new(Resources: {}))
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,75 @@
1
+ # Implements:
2
+ #
3
+ # * template_path
4
+ #
5
+ # FYI
6
+ #
7
+ # * compose implemented by the classes that include this
8
+ module Jets::Cfn::Builders
9
+ class BaseChildBuilder
10
+ include Interface
11
+
12
+ # The app_class is can be a controller, job or anonymous function class.
13
+ # IE: PostsController, HardJob
14
+ def initialize(app_class)
15
+ @app_class = app_class
16
+ @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
17
+ end
18
+
19
+ # template is an interface method
20
+ def template
21
+ @template
22
+ end
23
+
24
+ # template_path is an interface method for Interface module
25
+ def template_path
26
+ Jets::Naming.app_template_path(@app_class)
27
+ end
28
+
29
+ def add_common_parameters
30
+ common_parameters = Jets::Resource::ChildStack::AppClass.common_parameters
31
+ common_parameters.each do |k,_|
32
+ add_parameter(k, Description: k)
33
+ end
34
+
35
+ depends_on_params.each do |output_key, output_value|
36
+ desc = output_value.gsub("!GetAtt ", "") # desc doesnt allow !GetAtt
37
+ add_parameter(output_key, Description: desc)
38
+ end
39
+ end
40
+
41
+ def depends_on_params
42
+ return {} unless @app_class.depends_on
43
+
44
+ depends = Jets::Stack::Depends.new(@app_class.depends_on)
45
+ depends.params
46
+ end
47
+
48
+ def add_functions
49
+ add_class_iam_policy
50
+ @app_class.tasks.each do |task|
51
+ add_function(task)
52
+ add_function_iam_policy(task)
53
+ end
54
+ end
55
+
56
+ def add_function(task)
57
+ resource = Jets::Resource::Lambda::Function.new(task)
58
+ add_resource(resource)
59
+ end
60
+
61
+ def add_class_iam_policy
62
+ return unless @app_class.build_class_iam?
63
+
64
+ resource = Jets::Resource::Iam::ClassRole.new(@app_class)
65
+ add_resource(resource)
66
+ end
67
+
68
+ def add_function_iam_policy(task)
69
+ return unless task.build_function_iam?
70
+
71
+ resource = Jets::Resource::Iam::FunctionRole.new(task)
72
+ add_resource(resource)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,42 @@
1
+ # Implements:
2
+ #
3
+ # compose
4
+ # template_path
5
+ #
6
+ module Jets::Cfn::Builders
7
+ class ControllerBuilder < BaseChildBuilder
8
+ # compose is an interface method for Interface module
9
+ def compose
10
+ add_common_parameters
11
+ add_api_gateway_parameters
12
+ add_functions
13
+ add_routes
14
+ end
15
+
16
+ def add_api_gateway_parameters
17
+ return if Jets::Router.routes.empty?
18
+
19
+ add_parameter("RestApi", Description: "RestApi")
20
+ scoped_routes.each do |route|
21
+ resource = Jets::Resource::ApiGateway::Resource.new(route.path)
22
+ add_parameter(resource.logical_id, Description: resource.desc)
23
+ end
24
+ end
25
+
26
+ def add_routes
27
+ scoped_routes.each_with_index do |route, i|
28
+ method = Jets::Resource::ApiGateway::Method.new(route)
29
+ add_resource(method)
30
+ add_resource(method.permission)
31
+ add_resource(method.cors) if Jets.config.cors
32
+ end
33
+ end
34
+
35
+ # routes scoped to this controller template.
36
+ def scoped_routes
37
+ @routes ||= Jets::Router.routes.select do |route|
38
+ route.controller_name == @app_class.to_s
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,14 @@
1
+ # Implements:
2
+ #
3
+ # compose
4
+ # template_path
5
+ #
6
+ module Jets::Cfn::Builders
7
+ class FunctionBuilder < BaseChildBuilder
8
+ # compose is an interface method for Interface module
9
+ def compose
10
+ add_common_parameters
11
+ add_functions
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,137 @@
1
+ # The class including this module should implement these methods:
2
+ #
3
+ # * compose
4
+ # * template_path
5
+ # * template
6
+ module Jets::Cfn::Builders
7
+ module Interface
8
+ extend Memoist
9
+
10
+ def build
11
+ # Do not bother building or writing the template unless there are functions defined
12
+ return if @app_class && !@app_class.build?
13
+
14
+ compose # must be implemented by subclass
15
+ write
16
+ self
17
+ end
18
+
19
+ def write
20
+ if self.is_a? Paged
21
+ range.each do |page_num|
22
+ turn_to_page(page_num)
23
+ FileUtils.mkdir_p(File.dirname(template_path))
24
+ IO.write(template_path, text)
25
+ end
26
+ else
27
+ FileUtils.mkdir_p(File.dirname(template_path))
28
+ IO.write(template_path, text)
29
+ end
30
+ end
31
+
32
+ def cook_template
33
+ # need the to_hash or the YAML dump has
34
+ # !ruby/hash:ActiveSupport::HashWithIndifferentAccess
35
+ template.to_hash
36
+ end
37
+
38
+ def text
39
+ text = YAML.dump(cook_template)
40
+ post_process_template(text)
41
+ end
42
+
43
+ # post process the text so that
44
+ # "!Ref IamRole" => !Ref IamRole
45
+ # We strip the surrounding quotes
46
+ def post_process_template(text)
47
+ results = text.split("\n").map do |line|
48
+ if line.include?(': "!') # IE: IamRole: "!Ref IamRole",
49
+ # IamRole: "!Ref IamRole" => IamRole: !Ref IamRole
50
+ line.sub(/: "(.*)"/, ': \1')
51
+ elsif line.include?('- "!') # IE: - "!GetAtt Foo.Arn"
52
+ # IamRole: - "!GetAtt Foo.Arn" => - !GetAtt Foo.Arn
53
+ line.sub(/- "(.*)"/, '- \1')
54
+ else
55
+ line
56
+ end
57
+ end
58
+ results.join("\n") + "\n"
59
+ end
60
+
61
+ def add_parameters(attributes)
62
+ attributes.each do |name,value|
63
+ add_parameter(name.to_s.camelize, Description: value)
64
+ end
65
+ end
66
+
67
+ def add_parameter(name, options={})
68
+ defaults = { Type: "String" }
69
+ options = defaults.merge(options)
70
+ template[:Parameters] ||= {}
71
+ template[:Parameters][name.to_s.camelize] = options
72
+ end
73
+
74
+ def add_outputs(attributes)
75
+ attributes.each do |name,value|
76
+ add_output(name.to_s.camelize, Value: value)
77
+ end
78
+ end
79
+
80
+ def add_output(name, options={})
81
+ template[:Outputs] ||= {}
82
+ template[:Outputs][name.camelize] = options
83
+ end
84
+
85
+ def add_resources
86
+ @app_class.tasks.each do |task|
87
+ task.associated_resources.each do |associated|
88
+ resource = Jets::Resource.new(associated.definition, task.replacements)
89
+ add_resource(resource)
90
+ add_resource(resource.permission)
91
+ end
92
+ end
93
+ end
94
+
95
+ def add_resource(resource)
96
+ add_template_resource(resource.logical_id, resource.type, resource.attributes)
97
+ end
98
+
99
+ # The add_resource method can take an options Hash with both with either
100
+ # top level attributes or properties.
101
+ #
102
+ # Example:
103
+ #
104
+ # Top level options:
105
+ #
106
+ # add_template_resource("MyId", "AWS::ApiGateway::RestApi",
107
+ # type: "AWS::ApiGateway::RestApi",
108
+ # properties: {
109
+ # name: "my-api"
110
+ # },
111
+ # depends_on: ["AnotherResource"]
112
+ # )
113
+ #
114
+ # Simple options with properties only:
115
+ #
116
+ # add_template_resource("MyId", "AWS::CloudFormationStack",
117
+ # template_url: "template_url",
118
+ # parameters: {},
119
+ # )
120
+ #
121
+ def add_template_resource(logical_id, type, options)
122
+ options = Jets::Camelizer.transform(options)
123
+
124
+ attributes = if options.include?('Type')
125
+ base = { 'Type' => type }
126
+ base.merge(options) # options are top-level attributes
127
+ else
128
+ {
129
+ 'Type' => type,
130
+ 'Properties' => options # options are properties
131
+ }
132
+ end
133
+
134
+ template['Resources'][logical_id] = attributes
135
+ end
136
+ end
137
+ end