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,234 @@
1
+ require 'digest'
2
+
3
+ module Jets::Commands
4
+ class Build
5
+ include StackInfo
6
+
7
+ def initialize(options)
8
+ @options = options.dup
9
+ end
10
+
11
+ def run
12
+ puts "Building project for Lambda..."
13
+
14
+ return if @options[:noop]
15
+ # run gets called from the CLI and does not have all the stack_options yet.
16
+ # We compute it and change the options early here.
17
+ @options.merge!(stack_type: stack_type, s3_bucket: s3_bucket)
18
+ build
19
+ end
20
+
21
+ def build
22
+ build_code unless @options[:templates]
23
+ build_templates
24
+ end
25
+
26
+ def build_code
27
+ Jets::Builders::CodeBuilder.new.build unless @options[:noop]
28
+ end
29
+
30
+ def build_templates
31
+ puts "Building CloudFormation templates."
32
+ clean_templates
33
+ build_minimal_template
34
+ build_all_templates if full?
35
+ end
36
+
37
+ def full?
38
+ @options[:templates] || @options[:stack_type] == :full
39
+ end
40
+
41
+ def build_all_templates
42
+ # CloudFormation templates
43
+ # 1. Shared templates - child templates needs them
44
+ build_api_gateway_templates
45
+ # 2. Child templates - parent template needs them
46
+ build_app_child_templates
47
+ # 2. Child templates - parent template needs them
48
+ build_shared_resources_templates
49
+ # 4. Finally parent template
50
+ build_parent_template # must be called at the end
51
+ end
52
+
53
+ def build_minimal_template
54
+ # minimal_template does no longer includes ApiGateway since that is now paged and
55
+ # at this point we know nothing about the pages.
56
+ Jets::Cfn::Builders::ParentBuilder.new(@options).build
57
+ end
58
+
59
+ def build_api_gateway_templates
60
+ @api_gateway_builder = Jets::Cfn::Builders::ApiGatewayBuilder.new(@options).build
61
+ Jets::Cfn::Builders::ApiDeploymentBuilder.new(@options).build
62
+ end
63
+
64
+ def build_app_child_templates
65
+ app_files.each do |path|
66
+ build_child_template(path)
67
+ end
68
+ end
69
+
70
+ def build_shared_resources_templates
71
+ Jets::Stack.subclasses.each do |subclass|
72
+ Jets::Cfn::Builders::SharedBuilder.new(subclass).build
73
+ end
74
+ end
75
+
76
+ # path: app/controllers/comments_controller.rb
77
+ # path: app/jobs/easy_job.rb
78
+ def build_child_template(path)
79
+ md = path.match(%r{app/(.*?)/}) # extract: controller, job or function
80
+ process_class = md[1].classify
81
+ builder_class = "Jets::Cfn::Builders::#{process_class}Builder".constantize
82
+
83
+ # Examples:
84
+ # Jets::Cfn::Builders::ControllerBuilder.new(PostsController)
85
+ # Jets::Cfn::Builders::JobBuilder.new(EasyJob)
86
+ # Jets::Cfn::Builders::RuleBuilder.new(CheckRule)
87
+ # Jets::Cfn::Builders::FunctionBuilder.new(Hello)
88
+ # Jets::Cfn::Builders::FunctionBuilder.new(HelloFunction)
89
+ app_class = Jets::Klass.from_path(path)
90
+ builder = builder_class.new(app_class)
91
+ unless Jets.poly_only? && app_class == Jets::PreheatJob
92
+ builder.build
93
+ end
94
+ end
95
+
96
+ def build_parent_template
97
+ options = @options.dup
98
+ options[:api_gateway_page_range] = @api_gateway_builder.range
99
+ options[:indexed_paths] = @api_gateway_builder.indexed_paths
100
+ options[:required_parameters] = @api_gateway_builder.required_parameters
101
+ Jets::Cfn::Builders::ParentBuilder.new(options).build
102
+ end
103
+
104
+ def clean_templates
105
+ FileUtils.rm_rf("#{Jets.build_root}/templates")
106
+ end
107
+
108
+ def app_files
109
+ self.class.app_files
110
+ end
111
+
112
+ # Crucial that the Dir.pwd is in the tmp_code because for
113
+ # because Jets.boot set ups autoload_paths and this is how project
114
+ # classes are loaded.
115
+ # TODO: rework code so that Dir.pwd does not have to be in tmp_code for build to work.
116
+ def self.app_files
117
+ paths = []
118
+ expression = "#{Jets.root}/app/**/**/*.rb"
119
+ Dir.glob(expression).each do |path|
120
+ return false unless File.file?(path)
121
+ next unless app_file?(path)
122
+ next if concerns?(path)
123
+
124
+ relative_path = path.sub("#{Jets.root}/", '')
125
+ # Rids of the Jets.root at beginning
126
+ paths << relative_path
127
+ end
128
+ paths += internal_app_files
129
+ paths
130
+ end
131
+
132
+ def shared_files
133
+ self.class.shared_files
134
+ end
135
+
136
+ def self.shared_files
137
+ paths = []
138
+ expression = "#{Jets.root}/app/**/**/*.rb"
139
+ Dir.glob(expression).each do |path|
140
+ return false unless File.file?(path)
141
+ next unless path.include?("app/shared/resources")
142
+
143
+ relative_path = path.sub("#{Jets.root}/", '')
144
+ # Rids of the Jets.root at beginning
145
+ paths << relative_path
146
+ end
147
+ paths
148
+ end
149
+
150
+ # Finds out of the app has polymorphic functions only and zero ruby functions.
151
+ # In this case, we can skip a lot of the ruby related building and speed up the
152
+ # deploy process.
153
+ def self.poly_only?
154
+ !app_has_ruby? && !shared_has_ruby?
155
+ end
156
+
157
+ def self.app_has_ruby?
158
+ has_ruby = app_files.detect do |path|
159
+ app_class = Jets::Klass.from_path(path) # IE: PostsController, Jets::PublicController
160
+ langs = app_class.tasks.map(&:lang)
161
+ langs.include?(:ruby) && app_class != Jets::PreheatJob
162
+ end
163
+ !!has_ruby
164
+ end
165
+
166
+ def self.shared_has_ruby?
167
+ has_ruby = false
168
+ Jets::Stack.subclasses.each do |klass|
169
+ klass.functions.each do |fun|
170
+ if fun.lang == :ruby
171
+ has_ruby = true
172
+ break
173
+ end
174
+ end
175
+ end
176
+ has_ruby
177
+ end
178
+
179
+ # Add internal Jets controllers if they are being used
180
+ # TODO: Interesting, this eventually just used to generate handlers and controllers only.
181
+ # Maybe rename to make that clear.
182
+ # The copying of other internal files like views is done in builders/code_builder.rb copy_internal_jets_code
183
+ def self.internal_app_files
184
+ paths = []
185
+ controllers = File.expand_path("../../internal/app/controllers/jets", __FILE__)
186
+
187
+ public_catchall = Jets::Router.has_controller?("Jets::PublicController")
188
+ paths << "#{controllers}/public_controller.rb" if public_catchall
189
+
190
+ rack_catchall = Jets::Router.has_controller?("Jets::RackController")
191
+ paths << "#{controllers}/rack_controller.rb" if rack_catchall
192
+
193
+ mailer_controller = Jets::Router.has_controller?("Jets::MailersController")
194
+ paths << "#{controllers}/mailers_controller.rb" if mailer_controller
195
+
196
+ if Jets.config.prewarm.enable
197
+ jobs = File.expand_path("../../internal/app/jobs/jets", __FILE__)
198
+ paths << "#{jobs}/preheat_job.rb"
199
+ end
200
+
201
+ paths
202
+ end
203
+
204
+ def self.app_file?(path)
205
+ return false unless File.extname(path) == ".rb"
206
+ # Do not define lamda functions for the application_controller.rb or
207
+ # application_job.rb
208
+ excludes = %w[
209
+ application_controller.rb
210
+ application_job.rb
211
+ ]
212
+ return false if excludes.detect { |p| path.include?(p) }
213
+
214
+ includes = %w[
215
+ app/controllers
216
+ app/jobs
217
+ app/functions
218
+ app/rules
219
+ ]
220
+ return true if includes.detect { |p| path.include?(p) }
221
+
222
+ false
223
+ end
224
+
225
+ def self.concerns?(path)
226
+ path =~ %r{app/\w+/concerns/}
227
+ end
228
+
229
+ def self.tmp_code(full_build_path=false)
230
+ full_build_path ? "#{Jets.build_root}/stage/code" : "stage/code"
231
+ end
232
+
233
+ end
234
+ end
@@ -0,0 +1,169 @@
1
+ require "base64"
2
+ require "json"
3
+
4
+ class Jets::Commands::Call
5
+ include Jets::AwsServices
6
+
7
+ def initialize(provided_function_name, event, options={})
8
+ @options = options
9
+ @guess = @options[:guess].nil? ? true : @options[:guess]
10
+
11
+ @provided_function_name = provided_function_name
12
+ @event = event
13
+
14
+ @invocation_type = options[:invocation_type] || "RequestResponse"
15
+ @log_type = options[:log_type] || "Tail"
16
+ @qualifier = @qualifier
17
+ end
18
+
19
+ def function_name
20
+ if @guess
21
+ ensure_guesses_found! # possibly exits here
22
+ guesser.function_name # guesser adds namespace already
23
+ else
24
+ [Jets.config.project_namespace, @provided_function_name].join('-')
25
+ end
26
+ end
27
+
28
+ def run
29
+ @options[:local] ? local_run : remote_run
30
+ end
31
+
32
+ # With local mode there is no way to bypass the guesser
33
+ def local_run
34
+ puts "Local mode enabled!"
35
+ ensure_guesses_found! # possibly exits here
36
+ klass = guesser.class_name.constantize
37
+ # Example:
38
+ # PostsController.process(event, context, meth)
39
+ event = JSON.load(transformed_event) || {} # transformed_event is JSON text String
40
+
41
+ fun = Jets::PolyFun.new(klass, guesser.method_name)
42
+ result = fun.run(event) # check the logs for polymorphic function errors
43
+ # Note: even though data might not always be json, the JSON.dump does a
44
+ # good job of not bombing, so always calling it to simplify code.
45
+
46
+ text = Jets::Util.normalize_result(result)
47
+ STDOUT.puts text
48
+ end
49
+
50
+ def remote_run
51
+ puts "Calling lambda function #{function_name} on AWS" unless @options[:mute]
52
+ return if @options[:noop]
53
+
54
+ options = {
55
+ # client_context: client_context,
56
+ function_name: function_name,
57
+ invocation_type: @invocation_type, # "Event", # RequestResponse
58
+ log_type: @log_type, # pretty sweet
59
+ payload: transformed_event, # "fileb://file-path/input.json", <= JSON
60
+ qualifier: @qualifier, # "1",
61
+ }
62
+ begin
63
+ resp = aws_lambda.invoke(options)
64
+ rescue Aws::Lambda::Errors::ResourceNotFoundException
65
+ puts "The function #{function_name} was not found. Maybe check the spelling or the AWS_PROFILE?".color(:red)
66
+ return
67
+ end
68
+
69
+ if @options[:show_log]
70
+ puts "Last 4KB of log in the x-amz-log-result header:".color(:green)
71
+ puts Base64.decode64(resp.log_result)
72
+ end
73
+
74
+ add_console_link_to_clipboard
75
+ result = resp.payload.read # already been normalized/JSON.dump by AWS
76
+ unless @options[:mute_output]
77
+ STDOUT.puts result # only thing that goes to stdout
78
+ end
79
+ end
80
+
81
+ def guesser
82
+ @guesser ||= Guesser.new(@provided_function_name)
83
+ end
84
+
85
+ def ensure_guesses_found!
86
+ unless guesser.class_name and guesser.method_name
87
+ puts guesser.error_message
88
+ exit
89
+ end
90
+ end
91
+
92
+ # @event is String because it can be the file:// notation
93
+ # Returns text String for the lambda.invoke payload.
94
+ def transformed_event
95
+ text = @event
96
+ if text && text.include?("file://")
97
+ text = load_event_from_file(text)
98
+ end
99
+
100
+ check_valid_json!(text)
101
+
102
+ puts "Function name: #{function_name.color(:green)}" unless @options[:mute]
103
+ return text unless function_name.include?("_controller-")
104
+ return text if @options[:lambda_proxy] == false
105
+
106
+ event = JSON.load(text)
107
+ lambda_proxy = {"queryStringParameters" => event}
108
+ JSON.dump(lambda_proxy)
109
+ end
110
+
111
+ def load_event_from_file(text)
112
+ path = text.gsub('file://','')
113
+ path = "#{Jets.root}/#{path}" unless path[0..0] == '/'
114
+ unless File.exist?(path)
115
+ puts "File #{path} does not exist. Are you sure the file exists?".color(:red)
116
+ exit
117
+ end
118
+ text = IO.read(path)
119
+ end
120
+
121
+ # Exits with friendly error message when user provides bad just
122
+ def check_valid_json!(text)
123
+ JSON.load(text)
124
+ rescue JSON::ParserError => e
125
+ puts "Invalid json provided:\n '#{text}'"
126
+ puts "Exiting... Please try again and provide valid json."
127
+ exit 1
128
+ end
129
+
130
+ # So use can quickly paste this into their browser if they want to see the function
131
+ # via the Lambda console
132
+ def add_console_link_to_clipboard
133
+ return unless RUBY_PLATFORM =~ /darwin/
134
+ return unless system("type pbcopy > /dev/null")
135
+
136
+ # TODO: for add_console_link_to_clipboard get the region from the ~/.aws/config and AWS_PROFILE setting
137
+ region = Aws.config[:region] || 'us-east-1'
138
+ link = "https://console.aws.amazon.com/lambda/home?region=#{region}#/functions/#{function_name}?tab=configuration"
139
+ system("echo #{link} | pbcopy")
140
+ puts "Pro tip: The Lambda Console Link to the #{function_name} function has been added to your clipboard." unless @options[:mute]
141
+ end
142
+
143
+ # TODO: Hook client_context up and maek sure it works. Think I've figure out how to sign client_context below.
144
+ # Client context must be a valid Base64-encoded JSON object
145
+ # Example: http://docs.aws.amazon.com/mobileanalytics/latest/ug/PutEvents.html
146
+ def client_context
147
+ context = {
148
+ "client" => {
149
+ "client_id" => "Jets",
150
+ "app_title" => "jets call cli",
151
+ "app_version_name" => Jets::VERSION,
152
+ },
153
+ "custom" => {},
154
+ "env" =>{
155
+ "platform" => RUBY_PLATFORM,
156
+ "platform_version" => RUBY_VERSION,
157
+ }
158
+ }
159
+ Base64.encode64(JSON.dump(context))
160
+ end
161
+
162
+ # For this class redirect puts to stderr so user can pipe output to tools like
163
+ # jq. Example:
164
+ # jets call posts_controller-index '{"test":1}' | jq .
165
+ def puts(text)
166
+ $stderr.puts(text)
167
+ end
168
+
169
+ end
@@ -0,0 +1,96 @@
1
+ class Jets::Commands::Call
2
+ class AnonymousGuesser < BaseGuesser
3
+ def detect_class_name
4
+ found_path = function_paths.find do |path|
5
+ File.exist?("#{Jets.root}/#{path}")
6
+ end
7
+
8
+ klass = Jets::Klass.from_path(found_path) if found_path
9
+ klass.to_s
10
+ end
11
+
12
+ def method_name
13
+ return @method_name if defined?(@method_name)
14
+
15
+ full_function_name = @provided_function_name.underscore
16
+ underscored_class_name = class_name.underscore
17
+ meth = full_function_name.sub("#{underscored_class_name}_","")
18
+
19
+ if meth == class_name.constantize.handler.to_s
20
+ @method_name = meth
21
+ else
22
+ @method_name_error = "#{class_name} class found but #{meth} method not found"
23
+ @method_name = nil
24
+ end
25
+ end
26
+
27
+ # Useful to printing out what was attempted to look up
28
+ def error_message
29
+ guess_paths = function_paths
30
+ puts "Unable to find the function to call."
31
+ if class_name and !method_name
32
+ puts @method_name_error
33
+ else
34
+ puts "Tried: #{guess_paths.join(', ')}"
35
+ end
36
+ end
37
+
38
+ def function_filenames(meth=nil, primary_namespace=nil)
39
+ guesses = []
40
+ parts = meth.split('_')
41
+
42
+ if primary_namespace.nil?
43
+ guesses << meth
44
+
45
+ if parts.size == 1 # already on final_primary_namespace
46
+ return guesses # end of recursion
47
+ else
48
+ next_primary_namespace = parts.first
49
+ guesses += function_filenames(meth, next_primary_namespace) # start of recursion
50
+ return guesses # return early
51
+ end
52
+ end
53
+
54
+ next_meth = meth.sub("#{primary_namespace}_", '')
55
+ next_parts = next_meth.split('_')
56
+
57
+ # Takes the next_parts and creates guesses with the parts joined by '/'
58
+ # with the primary_namespace prepended. So if next_parts is
59
+ # ["long", "name", "function"] and primary_namespace is "complex"
60
+ #
61
+ # guesses that get added:
62
+ #
63
+ # [
64
+ # "complex/long_name_function",
65
+ # "complex/long/name_function",
66
+ # "complex/long/name/function",
67
+ # ]
68
+ n = next_parts.size + 1
69
+ next_parts.size.times do |i|
70
+ namespace = i == 0 ? nil : next_parts[0..i-1].join('/')
71
+ class_path = next_parts[i..-1].join('_')
72
+ guesses << [primary_namespace, namespace, class_path].compact.join('/')
73
+ end
74
+
75
+ final_primary_namespace = parts[0..-2].join('_')
76
+ if primary_namespace == final_primary_namespace
77
+ return guesses # end of recursion
78
+ else
79
+ namespace_size = parts.size - next_parts.size
80
+ next_primary_namespace = parts[0..namespace_size].join('_')
81
+ guesses += function_filenames(meth, next_primary_namespace)
82
+ return guesses
83
+ end
84
+ end
85
+
86
+ def function_paths
87
+ # drop the last word for starting filename
88
+ starting_filename = @provided_function_name.underscore.split('_')[0..-2].join('_')
89
+ filenames = function_filenames(starting_filename)
90
+ filenames.map do |name|
91
+ "app/functions/#{name}.rb"
92
+ end
93
+ end
94
+
95
+ end
96
+ end