jets-fs 1.6.10

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 (379) 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 +73 -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 +6 -0
  21. data/.python-version +1 -0
  22. data/.rspec +4 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +533 -0
  25. data/Dockerfile +16 -0
  26. data/Dockerfile.base +53 -0
  27. data/Gemfile +14 -0
  28. data/Gemfile.lock +190 -0
  29. data/Guardfile +22 -0
  30. data/LICENSE.txt +22 -0
  31. data/Procfile +2 -0
  32. data/README.md +203 -0
  33. data/Rakefile +21 -0
  34. data/backers.md +16 -0
  35. data/bin/release +9 -0
  36. data/buildspec.yml +18 -0
  37. data/exe/jets +14 -0
  38. data/jets.gemspec +61 -0
  39. data/lib/jets.rb +71 -0
  40. data/lib/jets/application.rb +308 -0
  41. data/lib/jets/aws_info.rb +111 -0
  42. data/lib/jets/aws_services.rb +60 -0
  43. data/lib/jets/aws_services/stack_status.rb +59 -0
  44. data/lib/jets/booter.rb +130 -0
  45. data/lib/jets/builders.rb +16 -0
  46. data/lib/jets/builders/code_builder.rb +379 -0
  47. data/lib/jets/builders/code_size.rb +57 -0
  48. data/lib/jets/builders/gem_replacer.rb +76 -0
  49. data/lib/jets/builders/handler_generator.rb +172 -0
  50. data/lib/jets/builders/lambda_layer.rb +69 -0
  51. data/lib/jets/builders/md5.rb +60 -0
  52. data/lib/jets/builders/md5_zip.rb +61 -0
  53. data/lib/jets/builders/purger.rb +35 -0
  54. data/lib/jets/builders/rack_packager.rb +51 -0
  55. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  56. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  57. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  58. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  59. data/lib/jets/builders/ruby_packager.rb +207 -0
  60. data/lib/jets/builders/shim_vars.rb +5 -0
  61. data/lib/jets/builders/shim_vars/app.rb +78 -0
  62. data/lib/jets/builders/shim_vars/base.rb +25 -0
  63. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  64. data/lib/jets/builders/templates/handler.rb +12 -0
  65. data/lib/jets/builders/tidy.rb +107 -0
  66. data/lib/jets/builders/util.rb +31 -0
  67. data/lib/jets/camelizer.rb +67 -0
  68. data/lib/jets/cfn.rb +6 -0
  69. data/lib/jets/cfn/builders.rb +20 -0
  70. data/lib/jets/cfn/builders/api_deployment_builder.rb +58 -0
  71. data/lib/jets/cfn/builders/api_gateway_builder.rb +80 -0
  72. data/lib/jets/cfn/builders/base_child_builder.rb +82 -0
  73. data/lib/jets/cfn/builders/controller_builder.rb +42 -0
  74. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  75. data/lib/jets/cfn/builders/interface.rb +127 -0
  76. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  77. data/lib/jets/cfn/builders/parent_builder.rb +93 -0
  78. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  79. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  80. data/lib/jets/cfn/ship.rb +189 -0
  81. data/lib/jets/cfn/status.rb +212 -0
  82. data/lib/jets/cfn/upload.rb +139 -0
  83. data/lib/jets/cli.rb +189 -0
  84. data/lib/jets/commands.rb +27 -0
  85. data/lib/jets/commands/base.rb +164 -0
  86. data/lib/jets/commands/build.rb +217 -0
  87. data/lib/jets/commands/call.rb +174 -0
  88. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  89. data/lib/jets/commands/call/autoload_guesser.rb +112 -0
  90. data/lib/jets/commands/call/base_guesser.rb +33 -0
  91. data/lib/jets/commands/call/guesser.rb +48 -0
  92. data/lib/jets/commands/clean.rb +23 -0
  93. data/lib/jets/commands/clean/base.rb +24 -0
  94. data/lib/jets/commands/clean/build.rb +13 -0
  95. data/lib/jets/commands/clean/log.rb +107 -0
  96. data/lib/jets/commands/console.rb +13 -0
  97. data/lib/jets/commands/db.rb +15 -0
  98. data/lib/jets/commands/db/environment-task.rake +3 -0
  99. data/lib/jets/commands/db/tasks.rb +44 -0
  100. data/lib/jets/commands/dbconsole.rb +131 -0
  101. data/lib/jets/commands/delete.rb +143 -0
  102. data/lib/jets/commands/deploy.rb +131 -0
  103. data/lib/jets/commands/dynamodb.rb +22 -0
  104. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  105. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  106. data/lib/jets/commands/gems.rb +21 -0
  107. data/lib/jets/commands/help.rb +9 -0
  108. data/lib/jets/commands/help/build.md +6 -0
  109. data/lib/jets/commands/help/call.md +61 -0
  110. data/lib/jets/commands/help/clean/build.md +5 -0
  111. data/lib/jets/commands/help/clean/log.md +5 -0
  112. data/lib/jets/commands/help/console.md +18 -0
  113. data/lib/jets/commands/help/db/generate.md +8 -0
  114. data/lib/jets/commands/help/dbconsole.md +9 -0
  115. data/lib/jets/commands/help/delete.md +22 -0
  116. data/lib/jets/commands/help/deploy.md +32 -0
  117. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  118. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  119. data/lib/jets/commands/help/gems/check.md +8 -0
  120. data/lib/jets/commands/help/generate.md +22 -0
  121. data/lib/jets/commands/help/import/rack.md +13 -0
  122. data/lib/jets/commands/help/import/rails.md +11 -0
  123. data/lib/jets/commands/help/new.md +42 -0
  124. data/lib/jets/commands/help/routes.md +16 -0
  125. data/lib/jets/commands/help/runner.md +17 -0
  126. data/lib/jets/commands/help/server.md +15 -0
  127. data/lib/jets/commands/help/status.md +14 -0
  128. data/lib/jets/commands/help/upgrade.md +5 -0
  129. data/lib/jets/commands/help/url.md +6 -0
  130. data/lib/jets/commands/import.rb +18 -0
  131. data/lib/jets/commands/import/base.rb +49 -0
  132. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  133. data/lib/jets/commands/import/rack.rb +16 -0
  134. data/lib/jets/commands/import/rail.rb +74 -0
  135. data/lib/jets/commands/import/sequence.rb +90 -0
  136. data/lib/jets/commands/import/templates/config/database.yml +26 -0
  137. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  138. data/lib/jets/commands/main.rb +152 -0
  139. data/lib/jets/commands/markdown.rb +8 -0
  140. data/lib/jets/commands/markdown/creator.rb +58 -0
  141. data/lib/jets/commands/markdown/index.rb +27 -0
  142. data/lib/jets/commands/markdown/page.rb +125 -0
  143. data/lib/jets/commands/markdown/shell.rb +11 -0
  144. data/lib/jets/commands/new.rb +157 -0
  145. data/lib/jets/commands/rake_command.rb +61 -0
  146. data/lib/jets/commands/rake_tasks.rb +45 -0
  147. data/lib/jets/commands/runner.rb +18 -0
  148. data/lib/jets/commands/sequence.rb +99 -0
  149. data/lib/jets/commands/stack_info.rb +30 -0
  150. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  151. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  152. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  153. data/lib/jets/commands/templates/skeleton/Gemfile.tt +35 -0
  154. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  155. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  156. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  157. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  158. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  159. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  160. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  161. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  162. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
  163. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  164. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +66 -0
  165. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
  166. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  167. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +4 -0
  168. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +4 -0
  169. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  170. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  171. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  172. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  173. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  174. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  175. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  176. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  177. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  178. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  179. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  180. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
  181. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  182. data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
  183. data/lib/jets/commands/upgrade.rb +146 -0
  184. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  185. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  186. data/lib/jets/commands/url.rb +68 -0
  187. data/lib/jets/commands/webpacker_template.rb +18 -0
  188. data/lib/jets/controller.rb +16 -0
  189. data/lib/jets/controller/base.rb +103 -0
  190. data/lib/jets/controller/callbacks.rb +62 -0
  191. data/lib/jets/controller/cookies.rb +40 -0
  192. data/lib/jets/controller/cookies/jar.rb +269 -0
  193. data/lib/jets/controller/layout.rb +17 -0
  194. data/lib/jets/controller/middleware.rb +5 -0
  195. data/lib/jets/controller/middleware/cors.rb +60 -0
  196. data/lib/jets/controller/middleware/local.rb +119 -0
  197. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  198. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  199. data/lib/jets/controller/middleware/local/route_matcher.rb +97 -0
  200. data/lib/jets/controller/middleware/main.rb +46 -0
  201. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  202. data/lib/jets/controller/params.rb +87 -0
  203. data/lib/jets/controller/rack.rb +5 -0
  204. data/lib/jets/controller/rack/adapter.rb +63 -0
  205. data/lib/jets/controller/rack/env.rb +105 -0
  206. data/lib/jets/controller/redirection.rb +55 -0
  207. data/lib/jets/controller/rendering.rb +84 -0
  208. data/lib/jets/controller/rendering/rack_renderer.rb +238 -0
  209. data/lib/jets/controller/request.rb +29 -0
  210. data/lib/jets/controller/response.rb +61 -0
  211. data/lib/jets/core.rb +211 -0
  212. data/lib/jets/core_ext/kernel.rb +56 -0
  213. data/lib/jets/db.rb +15 -0
  214. data/lib/jets/dotenv.rb +39 -0
  215. data/lib/jets/erb.rb +51 -0
  216. data/lib/jets/generator.rb +41 -0
  217. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  218. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
  219. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  220. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  221. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  222. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  223. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  224. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  225. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  226. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  227. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  228. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  229. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  230. data/lib/jets/inflections.rb +32 -0
  231. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  232. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
  233. data/lib/jets/internal/app/functions/jets/base_path.rb +153 -0
  234. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +62 -0
  235. data/lib/jets/io.rb +14 -0
  236. data/lib/jets/job.rb +4 -0
  237. data/lib/jets/job/base.rb +29 -0
  238. data/lib/jets/job/dsl.rb +108 -0
  239. data/lib/jets/klass.rb +109 -0
  240. data/lib/jets/lambda.rb +18 -0
  241. data/lib/jets/lambda/dsl.rb +384 -0
  242. data/lib/jets/lambda/function.rb +29 -0
  243. data/lib/jets/lambda/function_constructor.rb +55 -0
  244. data/lib/jets/lambda/functions.rb +34 -0
  245. data/lib/jets/lambda/task.rb +111 -0
  246. data/lib/jets/logger.rb +24 -0
  247. data/lib/jets/mega.rb +7 -0
  248. data/lib/jets/mega/hash_converter.rb +25 -0
  249. data/lib/jets/mega/request.rb +140 -0
  250. data/lib/jets/mega/request/source.rb +21 -0
  251. data/lib/jets/middleware.rb +38 -0
  252. data/lib/jets/middleware/configurator.rb +84 -0
  253. data/lib/jets/middleware/default_stack.rb +49 -0
  254. data/lib/jets/middleware/layer.rb +34 -0
  255. data/lib/jets/middleware/stack.rb +77 -0
  256. data/lib/jets/naming.rb +49 -0
  257. data/lib/jets/overrides/lambda.rb +1 -0
  258. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  259. data/lib/jets/overrides/rails.rb +4 -0
  260. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  261. data/lib/jets/overrides/rails/common_methods.rb +20 -0
  262. data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
  263. data/lib/jets/overrides/rails/url_helper.rb +25 -0
  264. data/lib/jets/poly_fun.rb +82 -0
  265. data/lib/jets/poly_fun/base_executor.rb +125 -0
  266. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  267. data/lib/jets/poly_fun/node_error.rb +8 -0
  268. data/lib/jets/poly_fun/node_executor.rb +54 -0
  269. data/lib/jets/poly_fun/python_error.rb +8 -0
  270. data/lib/jets/poly_fun/python_executor.rb +23 -0
  271. data/lib/jets/preheat.rb +117 -0
  272. data/lib/jets/processors.rb +4 -0
  273. data/lib/jets/processors/deducer.rb +65 -0
  274. data/lib/jets/processors/main_processor.rb +59 -0
  275. data/lib/jets/rack_server.rb +80 -0
  276. data/lib/jets/rdoc.rb +30 -0
  277. data/lib/jets/resource.rb +74 -0
  278. data/lib/jets/resource/api_gateway.rb +9 -0
  279. data/lib/jets/resource/api_gateway/base_path.rb +5 -0
  280. data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
  281. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  282. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  283. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  284. data/lib/jets/resource/api_gateway/deployment.rb +78 -0
  285. data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
  286. data/lib/jets/resource/api_gateway/method.rb +98 -0
  287. data/lib/jets/resource/api_gateway/resource.rb +78 -0
  288. data/lib/jets/resource/api_gateway/rest_api.rb +60 -0
  289. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
  290. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
  291. data/lib/jets/resource/api_gateway/rest_api/routes.rb +11 -0
  292. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +12 -0
  293. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
  294. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
  295. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
  296. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +123 -0
  297. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  298. data/lib/jets/resource/associated.rb +26 -0
  299. data/lib/jets/resource/base.rb +28 -0
  300. data/lib/jets/resource/child_stack.rb +7 -0
  301. data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
  302. data/lib/jets/resource/child_stack/api_gateway.rb +29 -0
  303. data/lib/jets/resource/child_stack/app_class.rb +112 -0
  304. data/lib/jets/resource/child_stack/base.rb +24 -0
  305. data/lib/jets/resource/child_stack/shared.rb +90 -0
  306. data/lib/jets/resource/config.rb +4 -0
  307. data/lib/jets/resource/config/config_rule.rb +74 -0
  308. data/lib/jets/resource/config/managed_rule.rb +15 -0
  309. data/lib/jets/resource/events.rb +3 -0
  310. data/lib/jets/resource/events/rule.rb +31 -0
  311. data/lib/jets/resource/iam.rb +8 -0
  312. data/lib/jets/resource/iam/application_role.rb +27 -0
  313. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  314. data/lib/jets/resource/iam/class_role.rb +74 -0
  315. data/lib/jets/resource/iam/function_role.rb +54 -0
  316. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  317. data/lib/jets/resource/iam/policy_document.rb +41 -0
  318. data/lib/jets/resource/lambda.rb +5 -0
  319. data/lib/jets/resource/lambda/function.rb +216 -0
  320. data/lib/jets/resource/lambda/function/environment.rb +61 -0
  321. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  322. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  323. data/lib/jets/resource/permission.rb +45 -0
  324. data/lib/jets/resource/replacer.rb +77 -0
  325. data/lib/jets/resource/route53.rb +3 -0
  326. data/lib/jets/resource/route53/record_set.rb +70 -0
  327. data/lib/jets/resource/s3.rb +17 -0
  328. data/lib/jets/resource/sns.rb +3 -0
  329. data/lib/jets/resource/sqs.rb +3 -0
  330. data/lib/jets/resource/standardizer.rb +42 -0
  331. data/lib/jets/route.rb +166 -0
  332. data/lib/jets/router.rb +175 -0
  333. data/lib/jets/router/scope.rb +30 -0
  334. data/lib/jets/rule.rb +4 -0
  335. data/lib/jets/rule/base.rb +19 -0
  336. data/lib/jets/rule/dsl.rb +110 -0
  337. data/lib/jets/spec_helpers.rb +52 -0
  338. data/lib/jets/spec_helpers/params.rb +10 -0
  339. data/lib/jets/spec_helpers/request.rb +98 -0
  340. data/lib/jets/spec_helpers/response.rb +5 -0
  341. data/lib/jets/stack.rb +103 -0
  342. data/lib/jets/stack/builder.rb +38 -0
  343. data/lib/jets/stack/definition.rb +50 -0
  344. data/lib/jets/stack/function.rb +60 -0
  345. data/lib/jets/stack/main.rb +5 -0
  346. data/lib/jets/stack/main/dsl.rb +33 -0
  347. data/lib/jets/stack/main/extensions/base.rb +45 -0
  348. data/lib/jets/stack/main/extensions/cloudwatch.rb +19 -0
  349. data/lib/jets/stack/main/extensions/lambda.rb +71 -0
  350. data/lib/jets/stack/main/extensions/sns.rb +12 -0
  351. data/lib/jets/stack/main/extensions/sqs.rb +36 -0
  352. data/lib/jets/stack/output.rb +38 -0
  353. data/lib/jets/stack/output/dsl.rb +19 -0
  354. data/lib/jets/stack/output/lookup.rb +36 -0
  355. data/lib/jets/stack/parameter.rb +38 -0
  356. data/lib/jets/stack/parameter/dsl.rb +42 -0
  357. data/lib/jets/stack/resource.rb +32 -0
  358. data/lib/jets/stack/resource/dsl.rb +19 -0
  359. data/lib/jets/tmp_loader.rb +52 -0
  360. data/lib/jets/turbine.rb +30 -0
  361. data/lib/jets/turbo.rb +47 -0
  362. data/lib/jets/turbo/database_yaml.rb +41 -0
  363. data/lib/jets/turbo/project/.gitignore +12 -0
  364. data/lib/jets/turbo/project/.jetskeep +1 -0
  365. data/lib/jets/turbo/project/Gemfile +16 -0
  366. data/lib/jets/turbo/project/Rakefile +2 -0
  367. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  368. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  369. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  370. data/lib/jets/turbo/project/config.ru +5 -0
  371. data/lib/jets/turbo/project/config/application.rb +4 -0
  372. data/lib/jets/turbo/project/config/routes.rb +4 -0
  373. data/lib/jets/turbo/rail.rb +113 -0
  374. data/lib/jets/turbo/templates/config/database.yml +26 -0
  375. data/lib/jets/util.rb +38 -0
  376. data/lib/jets/version.rb +3 -0
  377. data/readme/prerelease.md +6 -0
  378. data/readme/testing.md +60 -0
  379. metadata +859 -0
@@ -0,0 +1,174 @@
1
+ require "base64"
2
+ require "json"
3
+
4
+ class Jets::Commands::Call
5
+ autoload :BaseGuesser, "jets/commands/call/base_guesser"
6
+ autoload :AutoloadGuesser, "jets/commands/call/autoload_guesser"
7
+ autoload :AnonymousGuesser, "jets/commands/call/anonymous_guesser"
8
+ autoload :Guesser, "jets/commands/call/guesser"
9
+
10
+ include Jets::AwsServices
11
+
12
+ def initialize(provided_function_name, event, options={})
13
+ @options = options
14
+ @guess = @options[:guess].nil? ? true : @options[:guess]
15
+
16
+ @provided_function_name = provided_function_name
17
+ @event = event
18
+
19
+ @invocation_type = options[:invocation_type] || "RequestResponse"
20
+ @log_type = options[:log_type] || "Tail"
21
+ @qualifier = @qualifier
22
+ end
23
+
24
+ def function_name
25
+ if @guess
26
+ ensure_guesses_found! # possibly exits here
27
+ guesser.function_name # guesser adds namespace already
28
+ else
29
+ [Jets.config.project_namespace, @provided_function_name].join('-')
30
+ end
31
+ end
32
+
33
+ def run
34
+ @options[:local] ? local_run : remote_run
35
+ end
36
+
37
+ # With local mode there is no way to bypass the guesser
38
+ def local_run
39
+ puts "Local mode enabled!"
40
+ ensure_guesses_found! # possibly exits here
41
+ klass = guesser.class_name.constantize
42
+ # Example:
43
+ # PostsController.process(event, context, meth)
44
+ event = JSON.load(transformed_event) || {} # transformed_event is JSON text String
45
+
46
+ fun = Jets::PolyFun.new(klass, guesser.method_name)
47
+ result = fun.run(event) # check the logs for polymorphic function errors
48
+ # Note: even though data might not always be json, the JSON.dump does a
49
+ # good job of not bombing, so always calling it to simplify code.
50
+
51
+ text = Jets::Util.normalize_result(result)
52
+ STDOUT.puts text
53
+ end
54
+
55
+ def remote_run
56
+ puts "Calling lambda function #{function_name} on AWS" unless @options[:mute]
57
+ return if @options[:noop]
58
+
59
+ options = {
60
+ # client_context: client_context,
61
+ function_name: function_name,
62
+ invocation_type: @invocation_type, # "Event", # RequestResponse
63
+ log_type: @log_type, # pretty sweet
64
+ payload: transformed_event, # "fileb://file-path/input.json", <= JSON
65
+ qualifier: @qualifier, # "1",
66
+ }
67
+ begin
68
+ resp = lambda.invoke(options)
69
+ rescue Aws::Lambda::Errors::ResourceNotFoundException
70
+ puts "The function #{function_name} was not found. Maybe check the spelling or the AWS_PROFILE?".color(:red)
71
+ return
72
+ end
73
+
74
+ if @options[:show_log]
75
+ puts "Last 4KB of log in the x-amz-log-result header:".color(:green)
76
+ puts Base64.decode64(resp.log_result)
77
+ end
78
+
79
+ add_console_link_to_clipboard
80
+ result = resp.payload.read # already been normalized/JSON.dump by AWS
81
+ unless @options[:mute_output]
82
+ STDOUT.puts result # only thing that goes to stdout
83
+ end
84
+ end
85
+
86
+ def guesser
87
+ @guesser ||= Guesser.new(@provided_function_name)
88
+ end
89
+
90
+ def ensure_guesses_found!
91
+ unless guesser.class_name and guesser.method_name
92
+ puts guesser.error_message
93
+ exit
94
+ end
95
+ end
96
+
97
+ # @event is String because it can be the file:// notation
98
+ # Returns text String for the lambda.invoke payload.
99
+ def transformed_event
100
+ text = @event
101
+ if text && text.include?("file://")
102
+ text = load_event_from_file(text)
103
+ end
104
+
105
+ check_valid_json!(text)
106
+
107
+ puts "Function name: #{function_name.color(:green)}" unless @options[:mute]
108
+ return text unless function_name.include?("_controller-")
109
+ return text if @options[:lambda_proxy] == false
110
+
111
+ event = JSON.load(text)
112
+ lambda_proxy = {"queryStringParameters" => event}
113
+ JSON.dump(lambda_proxy)
114
+ end
115
+
116
+ def load_event_from_file(text)
117
+ path = text.gsub('file://','')
118
+ path = "#{Jets.root}/#{path}" unless path[0..0] == '/'
119
+ unless File.exist?(path)
120
+ puts "File #{path} does not exist. Are you sure the file exists?".color(:red)
121
+ exit
122
+ end
123
+ text = IO.read(path)
124
+ end
125
+
126
+ # Exits with friendly error message when user provides bad just
127
+ def check_valid_json!(text)
128
+ JSON.load(text)
129
+ rescue JSON::ParserError => e
130
+ puts "Invalid json provided:\n '#{text}'"
131
+ puts "Exiting... Please try again and provide valid json."
132
+ exit 1
133
+ end
134
+
135
+ # So use can quickly paste this into their browser if they want to see the function
136
+ # via the Lambda console
137
+ def add_console_link_to_clipboard
138
+ return unless RUBY_PLATFORM =~ /darwin/
139
+ return unless system("type pbcopy > /dev/null")
140
+
141
+ # TODO: for add_console_link_to_clipboard get the region from the ~/.aws/config and AWS_PROFILE setting
142
+ region = Aws.config[:region] || 'us-east-1'
143
+ link = "https://console.aws.amazon.com/lambda/homepage?region=#{region}#/functions/#{function_name}?tab=configuration"
144
+ system("echo #{link} | pbcopy")
145
+ puts "Pro tip: The Lambda Console Link to the #{function_name} function has been added to your clipboard." unless @options[:mute]
146
+ end
147
+
148
+ # TODO: Hook client_context up and maek sure it works. Think I've figure out how to sign client_context below.
149
+ # Client context must be a valid Base64-encoded JSON object
150
+ # Example: http://docs.aws.amazon.com/mobileanalytics/latest/ug/PutEvents.html
151
+ def client_context
152
+ context = {
153
+ "client" => {
154
+ "client_id" => "Jets",
155
+ "app_title" => "jets call cli",
156
+ "app_version_name" => Jets::VERSION,
157
+ },
158
+ "custom" => {},
159
+ "env" =>{
160
+ "platform" => RUBY_PLATFORM,
161
+ "platform_version" => RUBY_VERSION,
162
+ }
163
+ }
164
+ Base64.encode64(JSON.dump(context))
165
+ end
166
+
167
+ # For this class redirect puts to stderr so user can pipe output to tools like
168
+ # jq. Example:
169
+ # jets call posts_controller-index '{"test":1}' | jq .
170
+ def puts(text)
171
+ $stderr.puts(text)
172
+ end
173
+
174
+ 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
@@ -0,0 +1,112 @@
1
+ class Jets::Commands::Call
2
+ class AutoloadGuesser < BaseGuesser
3
+ def detect_class_name
4
+ guess_classes.each do |class_name_guess|
5
+ begin
6
+ class_name_guess.constantize
7
+ return class_name_guess # if there's no error then the class is found
8
+ rescue NameError
9
+ if out_of_guesses(class_name_guess)
10
+ # puts "Unable to find the class to call. Tried guessing: #{guess_classes[0..-2].join(', ')}."
11
+ # raise # re-raise NameError for now but maybe better to provide
12
+ # a custom error class, so we can rescue it and provide a
13
+ # friendly message to the user
14
+ else
15
+ next
16
+ end
17
+ end
18
+ end
19
+
20
+ nil
21
+ end
22
+
23
+ def method_name
24
+ return @method_name if defined?(@method_name)
25
+ return nil unless class_name
26
+
27
+ underscored_class_name = class_name.underscore.gsub('/','_')
28
+ underscored_function_name = @provided_function_name.underscore.gsub('/','_')
29
+ meth = underscored_function_name.sub(underscored_class_name, '')
30
+ meth = meth.sub(/^[-_]/,'') # remove leading _ or -
31
+
32
+ if class_name.constantize.tasks.map(&:meth).include?(meth.to_sym)
33
+ @method_name = meth
34
+ else
35
+ @method_name_error ="#{class_name} class found but #{meth} method not found"
36
+ @method_name = nil
37
+ end
38
+ end
39
+
40
+ # Useful to printing out what was attempted to look up
41
+ def error_message
42
+ guesses = guess_classes
43
+ puts "Unable to find the function to call."
44
+ if class_name and !method_name
45
+ puts @method_name_error
46
+ else
47
+ puts "Tried: #{guesses.join(', ')}"
48
+ end
49
+ end
50
+
51
+ def process_type
52
+ if @provided_function_name =~ /[-_]controller/
53
+ "controller"
54
+ elsif @provided_function_name =~ /[-_]job/
55
+ "job"
56
+ elsif @provided_function_name =~ /[-_]rule/
57
+ "rule"
58
+ else
59
+ "function"
60
+ end
61
+ end
62
+
63
+ def process_type_pattern
64
+ Regexp.new("[-_]#{process_type}[-_](.*)")
65
+ end
66
+
67
+ # Strips the action because we dont want it to guess the class name
68
+ # So:
69
+ # admin-related-pages => admin_related_pages_controller
70
+ def underscored_name
71
+ # strip action and concidentally the _controller_ string
72
+ name = @provided_function_name.sub(process_type_pattern,'')
73
+ # Ensure _controller or _job at the end except for simple functions
74
+ unless process_type == "function"
75
+ name = name.gsub('-','_') + "_#{process_type}"
76
+ end
77
+ name
78
+ end
79
+
80
+ # Guesses autoload paths.
81
+ #
82
+ # underscored_name: admin_related_pages_controller
83
+ # Returns:
84
+ # [
85
+ # "admin_related_pages_controller",
86
+ # "admin/related_pages_controller",
87
+ # "admin_related/pages_controller",
88
+ # "admin_related_pages/controller",
89
+ # ]
90
+ def autoload_paths
91
+ guesses = []
92
+
93
+ parts = underscored_name.split('_')
94
+ parts.size.times do |i|
95
+ namespace = i == 0 ? nil : parts[0..i-1].join('/')
96
+ class_path = parts[i..-1].join('_')
97
+ guesses << [namespace, class_path].compact.join('/')
98
+ end
99
+
100
+ guesses
101
+ end
102
+
103
+ def guess_classes
104
+ autoload_paths.map(&:classify)
105
+ end
106
+
107
+ def out_of_guesses(guess)
108
+ guess.include?("::Controller")
109
+ end
110
+
111
+ end
112
+ end
@@ -0,0 +1,33 @@
1
+ # Subclasses of BaseGuessor must implement interface:
2
+ # detect_class_name
3
+ # method_name
4
+ # error_message
5
+ #
6
+ class Jets::Commands::Call
7
+ class BaseGuesser
8
+ # provided_function_name:
9
+ # admin/related_pages_controller-list_all
10
+ # admin-related-pages-controller-list-all
11
+ def initialize(provided_function_name)
12
+ @provided_function_name = provided_function_name
13
+ end
14
+
15
+ def class_name
16
+ return @class_name if @detection_ran
17
+
18
+ @class_name = detect_class_name
19
+ @detection_ran = true
20
+ @class_name
21
+ end
22
+
23
+ def function_name
24
+ # Strip the project namespace if the user has accidentally added it
25
+ # Since we're going to automatically add it no matter what at the end
26
+ # and dont want the namespace to be included twice
27
+ @provided_function_name = @provided_function_name.sub("#{Jets.config.project_namespace}-", "")
28
+
29
+ code_path = class_name.underscore.gsub('/','-')
30
+ function_name = [Jets.config.project_namespace, code_path, method_name].join('-')
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,48 @@
1
+ # Guesser transforms the user provided function name to the actual lambda
2
+ # function name.
3
+ #
4
+ # Allow for variety of different inputs to work:
5
+ # Simple:
6
+ # admin/pages_controller-index => admin-pages_controller-index
7
+ # admin-pages_controller-index => admin-pages_controller-index
8
+ #
9
+ # Complex, requires detecting the right class name:
10
+ # admin/related_pages_controller-list_all
11
+ # admin-related-pages-controller-list-all
12
+ #
13
+ # All still result in: admin-related_pages_controller-index
14
+ #
15
+ # The detection process follows. Given worse case:
16
+ # admin-related-pages-controller-list-all
17
+ #
18
+ # Know that the action comes after controller, try:
19
+ # AdminRelatedPagesController
20
+ # Admin::RelatedPagesController <= found stop guessing
21
+ #
22
+ # admin/related_pages_controller <= underscored
23
+ # admin/related_pages_controller-list_all <= add action back on
24
+ # admin-related_pages_controller-list_all <= gsub / - DONE
25
+ #
26
+ # Now we're at a point where we can start guessing
27
+ # function_name = detect_function_name(function_name)
28
+ class Jets::Commands::Call
29
+ class Guesser
30
+ delegate :class_name, :method_name, :error_message, :function_name,
31
+ to: :delegate_guesser
32
+
33
+ # Example of provided_function_name:
34
+ # admin/related_pages_controller-list_all
35
+ # admin-related-pages-controller-list-all
36
+ def initialize(provided_function_name)
37
+ @provided_function_name = provided_function_name
38
+ end
39
+
40
+ def delegate_guesser
41
+ @delegate_guesser ||= if @provided_function_name =~ /[-_](controller|job|rule)/
42
+ AutoloadGuesser.new(@provided_function_name)
43
+ else
44
+ AnonymousGuesser.new(@provided_function_name)
45
+ end
46
+ end
47
+ end
48
+ end