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,19 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV["JETS_ENV"] ||= ENV["RACK_ENV"] || "development"
4
+ ENV["NODE_ENV"] ||= "development"
5
+
6
+ require "pathname"
7
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
8
+ Pathname.new(__FILE__).realpath)
9
+
10
+ require "rubygems"
11
+ require "bundler/setup"
12
+
13
+ require "webpacker"
14
+ require "webpacker/webpack_runner"
15
+
16
+ APP_ROOT = File.expand_path("..", __dir__)
17
+ Dir.chdir(APP_ROOT) do
18
+ Webpacker::WebpackRunner.run(ARGV)
19
+ end
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ ENV["JETS_ENV"] ||= ENV["RACK_ENV"] || "development"
4
+ ENV["NODE_ENV"] ||= "development"
5
+
6
+ require "pathname"
7
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
8
+ Pathname.new(__FILE__).realpath)
9
+
10
+ require "rubygems"
11
+ require "bundler/setup"
12
+
13
+ require "webpacker"
14
+ require "webpacker/dev_server_runner"
15
+
16
+ APP_ROOT = File.expand_path("..", __dir__)
17
+ Dir.chdir(APP_ROOT) do
18
+ Webpacker::DevServerRunner.run(ARGV)
19
+ end
@@ -0,0 +1,68 @@
1
+ module Jets::Commands
2
+ class Url
3
+ include Jets::AwsServices
4
+
5
+ def initialize(options)
6
+ @options = options
7
+ end
8
+
9
+ def display
10
+ stack_name = Jets::Naming.parent_stack_name
11
+ unless stack_exists?(stack_name)
12
+ puts "Stack for #{Jets.config.project_name.color(:green)} project for environment #{Jets.env.color(:green)}. Couldn't find #{stack_name.color(:green)} stack."
13
+ exit
14
+ end
15
+
16
+ stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
17
+
18
+ api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
19
+ if api_gateway_stack_arn && endpoint_available?
20
+ api_gateway_endpoint = get_gateway_endpoint(api_gateway_stack_arn)
21
+ STDOUT.puts "API Gateway Endpoint: #{api_gateway_endpoint}"
22
+ show_custom_domain
23
+ else
24
+ puts "API Gateway not found. This jets app does have an API Gateway associated with it. Please double check your config/routes.rb if you were expecting to see a url for the app. Also check that #{stack_name.color(:green)} is a jets app."
25
+ end
26
+ end
27
+
28
+ def get_gateway_endpoint(api_gateway_stack_arn)
29
+ stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
30
+ rest_api = lookup(stack[:outputs], "RestApi")
31
+ region_id = lookup(stack[:outputs], "Region")
32
+ stage_name = Jets::Resource::ApiGateway::Deployment.stage_name
33
+
34
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-call-api.html
35
+ # https://my-api-id.execute-api.region-id.amazonaws.com/stage-name/{resourcePath}
36
+ "https://#{rest_api}.execute-api.#{region_id}.amazonaws.com/#{stage_name}"
37
+ end
38
+
39
+ def show_custom_domain
40
+ return unless endpoint_available? && Jets.custom_domain? && Jets.config.domain.route53
41
+
42
+ domain_name = Jets::Resource::ApiGateway::DomainName.new
43
+ # Looks funny but its right.
44
+ # domain_name is a method on the Jets::Resource::ApiGateway::Domain instance
45
+ url = "https://#{domain_name.domain_name}"
46
+ puts "Custom Domain: #{url}"
47
+ end
48
+
49
+ def endpoint_unavailable?
50
+ return false if Jets::Router.routes.empty?
51
+ resp, status = stack_status
52
+ return false if status.include?("ROLLBACK")
53
+ end
54
+
55
+ def endpoint_available?
56
+ !endpoint_unavailable?
57
+ end
58
+
59
+ # All CloudFormation states listed here:
60
+ # http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
61
+ def stack_status
62
+ resp = cfn.describe_stacks(stack_name: @parent_stack_name)
63
+ status = resp.stacks[0].stack_status
64
+ [resp, status]
65
+ end
66
+
67
+ end
68
+ end
@@ -0,0 +1,18 @@
1
+ require 'thor'
2
+
3
+ # These commands are ran after rake webpacker:install to enhance the generated
4
+ # javascript assets to support Jets.
5
+ # Done this way so it works for both jets new and jets webpacker:install
6
+ class Jets::Commands::WebpackerTemplate < Thor::Group
7
+ include Thor::Actions
8
+
9
+ class_option :force, desc: "Bypass confirmation and overwrite existing files."
10
+ class_option :bootstrap, type: :boolean, default: true, desc: "Install bootstrap"
11
+ def self.source_root
12
+ File.expand_path("templates/webpacker", File.dirname(__FILE__))
13
+ end
14
+
15
+ def reapply_templates
16
+ directory "app/javascript", "app/javascript", force: options[:force]#, bootstrap: options[:bootstrap]
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ class Jets::Controller
2
+ DEFAULT_CONTENT_TYPE = "text/html; charset=utf-8"
3
+
4
+ autoload :Base, "jets/controller/base"
5
+ autoload :Callbacks, "jets/controller/callbacks"
6
+ autoload :Cookies, "jets/controller/cookies"
7
+ autoload :Layout, "jets/controller/layout"
8
+ autoload :Middleware, "jets/controller/middleware"
9
+ autoload :Params, "jets/controller/params"
10
+ autoload :Rack, "jets/controller/rack"
11
+ autoload :Redirection, "jets/controller/redirection"
12
+ autoload :Renderers, "jets/controller/renderers"
13
+ autoload :Rendering, "jets/controller/rendering"
14
+ autoload :Request, "jets/controller/request"
15
+ autoload :Response, "jets/controller/response"
16
+ end
@@ -0,0 +1,103 @@
1
+ require "json"
2
+ require "rack/utils" # Rack::Utils.parse_nested_query
3
+
4
+ # Controller public methods get turned into Lambda functions.
5
+ class Jets::Controller
6
+ class Base < Jets::Lambda::Functions
7
+ include Callbacks
8
+ include Cookies
9
+ include Layout
10
+ include Params
11
+ include Rendering
12
+
13
+ delegate :headers, to: :request
14
+ delegate :set_header, to: :response
15
+ attr_reader :request, :response
16
+ attr_accessor :session
17
+ def initialize(event, context={}, meth)
18
+ super
19
+ @request = Request.new(event, context)
20
+ @response = Response.new
21
+ end
22
+
23
+ def process!
24
+ adapter = Jets::Controller::Rack::Adapter.new(event, context, meth)
25
+ adapter.rack_vars(
26
+ 'jets.controller' => self,
27
+ 'lambda.context' => context,
28
+ 'lambda.event' => event,
29
+ 'lambda.meth' => meth,
30
+ )
31
+ # adapter.process ultimately calls app controller action at the very last
32
+ # middleware stack.
33
+ adapter.process # Returns API Gateway hash structure
34
+ end
35
+
36
+ def dispatch!
37
+ t1 = Time.now
38
+ log_info_start
39
+
40
+ if run_before_actions(break_if: -> { @rendered })
41
+ send(@meth)
42
+ triplet = ensure_render
43
+ run_after_actions
44
+ else
45
+ Jets.logger.info "Filter chain halted as #{@last_callback_name} rendered or redirected"
46
+ triplet = ensure_render
47
+ end
48
+
49
+ took = Time.now - t1
50
+ status = triplet[0]
51
+ Jets.logger.info "Completed Status Code #{status} in #{took}s"
52
+
53
+ triplet # status, headers, body
54
+ end
55
+
56
+ def log_info_start
57
+ display_event = @event.dup
58
+ display_event['body'] = '[BASE64_ENCODED]' if @event['isBase64Encoded']
59
+ # Interesting, JSON.dump makes logging look like JSON.pretty_generate in
60
+ # CloudWatch but not locally. This is what we want.
61
+ ip = request.ip
62
+ Jets.logger.info "Started #{@event['httpMethod']} \"#{@event['path']}\" for #{ip} at #{Time.now}"
63
+ Jets.logger.info "Processing #{self.class.name}##{@meth}"
64
+ Jets.logger.info " Event: #{json_dump(display_event)}"
65
+ Jets.logger.info " Parameters: #{JSON.dump(params(raw: true).to_h)}"
66
+ end
67
+
68
+ # Handles binary data safely
69
+ def json_dump(data)
70
+ JSON.dump(data)
71
+ rescue Encoding::UndefinedConversionError
72
+ data['body'] = '[BINARY]'
73
+ JSON.dump(data)
74
+ end
75
+
76
+ def self.process(event, context={}, meth)
77
+ controller = new(event, context, meth)
78
+ # Using send because process! is private method in Jets::RackController so
79
+ # it doesnt create a lambda function. It's doesnt matter what scope process!
80
+ # is in Controller::Base because Jets lambda functions inheritance doesnt
81
+ # include methods in Controller::Base.
82
+ controller.send(:process!)
83
+ end
84
+
85
+ class_attribute :internal_controller
86
+ def self.internal(value=nil)
87
+ if !value.nil?
88
+ self.internal_controller = value
89
+ else
90
+ self.internal_controller
91
+ end
92
+ end
93
+
94
+ class_attribute :auth_type
95
+ def self.authorization_type(value=nil)
96
+ if !value.nil?
97
+ self.auth_type = value
98
+ else
99
+ self.auth_type
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,62 @@
1
+ # Simpified version of callbacks
2
+ # Does not support if
3
+ class Jets::Controller
4
+ module Callbacks
5
+ extend ActiveSupport::Concern
6
+ included do
7
+ class_attribute :before_actions
8
+ self.before_actions = []
9
+ class_attribute :after_actions
10
+ self.after_actions = []
11
+
12
+ class << self
13
+ def before_action(meth, options={})
14
+ self.before_actions += [[meth, options]]
15
+ end
16
+
17
+ def prepend_before_action(meth, options={})
18
+ self.before_actions = [[meth, options]] + self.before_actions
19
+ end
20
+
21
+ alias_method :append_before_action, :before_action
22
+
23
+ def after_action(meth, options={})
24
+ self.after_actions += [[meth, options]]
25
+ end
26
+
27
+ def prepend_after_action(meth, options={})
28
+ self.after_actions = [[meth, options]] + self.after_actions
29
+ end
30
+
31
+ alias_method :append_after_action, :after_action
32
+ end
33
+ end # included
34
+
35
+ # Instance Methods
36
+ # define run_before_actions and run_after_actions
37
+ # returns true if all actions were run, false if break_if condition yielded `true`
38
+ [:before, :after].each do |type|
39
+ define_method "run_#{type}_actions" do |break_if: nil|
40
+ called_method = @meth.to_sym
41
+ callbacks = self.class.send("#{type}_actions")
42
+ callbacks.each do |array|
43
+ callback, options = array
44
+
45
+ except = options[:except]
46
+ next if except && except.include?(called_method)
47
+
48
+ only = options[:only]
49
+ if only
50
+ send(callback) if only.include?(called_method)
51
+ else
52
+ send(callback)
53
+ end
54
+ @last_callback_name = callback
55
+
56
+ return false if !break_if.nil? && break_if.call
57
+ end
58
+ true
59
+ end
60
+ end
61
+ end # ClassOptions
62
+ end
@@ -0,0 +1,40 @@
1
+ # Based on sinatra/cookies.rb
2
+ # https://github.com/sinatra/sinatra/blob/master/sinatra-contrib/lib/sinatra/cookies.rb
3
+ class Jets::Controller
4
+ # = Jets::Controller::Cookies
5
+ #
6
+ # Easy way to deal with cookies
7
+ #
8
+ # == Usage
9
+ #
10
+ # Allows you to read cookies:
11
+ #
12
+ # def index
13
+ # "value: #{cookies[:something]}"
14
+ # end
15
+ #
16
+ # And of course to write cookies:
17
+ #
18
+ # def show
19
+ # cookies[:something] = 'foobar'
20
+ # render json: cookies
21
+ # end
22
+ #
23
+ # And generally behaves like a hash:
24
+ #
25
+ # def index
26
+ # cookies.merge! 'foo' => 'bar', 'bar' => 'baz'
27
+ # cookies.keep_if { |key, value| key.start_with? 'b' }
28
+ # foo, bar = cookies.values_at 'foo', 'bar'
29
+ # puts "size: #{cookies.length}"
30
+ # render json: cookies
31
+ # end
32
+ #
33
+ module Cookies
34
+ autoload :Jar, "jets/controller/cookies/jar"
35
+
36
+ def cookies
37
+ @cookies ||= Jar.new(self)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,269 @@
1
+ # Based on sinatra/cookies.rb
2
+ # https://github.com/sinatra/sinatra/blob/master/sinatra-contrib/lib/sinatra/cookies.rb
3
+ module Jets::Controller::Cookies
4
+ class Jar
5
+ include Enumerable
6
+ attr_reader :options
7
+
8
+ def initialize(controller)
9
+ @response_string = nil
10
+ @response_hash = {}
11
+ @response = controller.response
12
+ @request = controller.request
13
+ @deleted = []
14
+
15
+ @options = {
16
+ path: @request.script_name.to_s.empty? ? '/' : @request.script_name,
17
+ domain: @request.host == 'localhost' ? nil : @request.host,
18
+ secure: @request.ssl?,
19
+ httponly: true
20
+ }
21
+ end
22
+
23
+ def ==(other)
24
+ other.respond_to? :to_hash and to_hash == other.to_hash
25
+ end
26
+
27
+ def [](key)
28
+ response_cookies[key.to_s] || request_cookies[key.to_s]
29
+ end
30
+
31
+ def []=(key, value)
32
+ set(key, value: value)
33
+ end
34
+
35
+ def assoc(key)
36
+ to_hash.assoc(key.to_s)
37
+ end if Hash.method_defined? :assoc
38
+
39
+ def clear
40
+ each_key { |k| delete(k) }
41
+ end
42
+
43
+ def compare_by_identity?
44
+ false
45
+ end
46
+
47
+ def default
48
+ nil
49
+ end
50
+
51
+ alias default_proc default
52
+
53
+ def delete(key)
54
+ result = self[key]
55
+ @response.delete_cookie(key.to_s, @options)
56
+ result
57
+ end
58
+
59
+ def delete_if
60
+ return enum_for(__method__) unless block_given?
61
+ each { |k, v| delete(k) if yield(k, v) }
62
+ self
63
+ end
64
+
65
+ def each(&block)
66
+ return enum_for(__method__) unless block_given?
67
+ to_hash.each(&block)
68
+ end
69
+
70
+ def each_key(&block)
71
+ return enum_for(__method__) unless block_given?
72
+ to_hash.each_key(&block)
73
+ end
74
+
75
+ alias each_pair each
76
+
77
+ def each_value(&block)
78
+ return enum_for(__method__) unless block_given?
79
+ to_hash.each_value(&block)
80
+ end
81
+
82
+ def empty?
83
+ to_hash.empty?
84
+ end
85
+
86
+ def fetch(key, &block)
87
+ response_cookies.fetch(key.to_s) do
88
+ request_cookies.fetch(key.to_s, &block)
89
+ end
90
+ end
91
+
92
+ def flatten
93
+ to_hash.flatten
94
+ end if Hash.method_defined? :flatten
95
+
96
+ def has_key?(key)
97
+ response_cookies.has_key? key.to_s or request_cookies.has_key? key.to_s
98
+ end
99
+
100
+ def has_value?(value)
101
+ response_cookies.has_value? value or request_cookies.has_value? value
102
+ end
103
+
104
+ def hash
105
+ to_hash.hash
106
+ end
107
+
108
+ alias include? has_key?
109
+ alias member? has_key?
110
+
111
+ def index(value)
112
+ warn "Hash#index is deprecated; use Hash#key"
113
+ key(value)
114
+ end
115
+
116
+ def inspect
117
+ "<##{self.class}: #{to_hash.inspect[1..-2]}>"
118
+ end
119
+
120
+ def invert
121
+ to_hash.invert
122
+ end if Hash.method_defined? :invert
123
+
124
+ def keep_if
125
+ return enum_for(__method__) unless block_given?
126
+ delete_if { |*a| not yield(*a) }
127
+ end
128
+
129
+ def key(value)
130
+ to_hash.key(value)
131
+ end
132
+
133
+ alias key? has_key?
134
+
135
+ def keys
136
+ to_hash.keys
137
+ end
138
+
139
+ def length
140
+ to_hash.length
141
+ end
142
+
143
+ def merge(other, &block)
144
+ to_hash.merge(other, &block)
145
+ end
146
+
147
+ def merge!(other)
148
+ other.each_pair do |key, value|
149
+ if block_given? and include? key
150
+ self[key] = yield(key.to_s, self[key], value)
151
+ else
152
+ self[key] = value
153
+ end
154
+ end
155
+ end
156
+
157
+ def rassoc(value)
158
+ to_hash.rassoc(value)
159
+ end
160
+
161
+ def rehash
162
+ response_cookies.rehash
163
+ request_cookies.rehash
164
+ self
165
+ end
166
+
167
+ def reject(&block)
168
+ return enum_for(__method__) unless block_given?
169
+ to_hash.reject(&block)
170
+ end
171
+
172
+ alias reject! delete_if
173
+
174
+ def replace(other)
175
+ select! { |k, v| other.include?(k) or other.include?(k.to_s) }
176
+ merge! other
177
+ end
178
+
179
+ def select(&block)
180
+ return enum_for(__method__) unless block_given?
181
+ to_hash.select(&block)
182
+ end
183
+
184
+ alias select! keep_if if Hash.method_defined? :select!
185
+
186
+ def set(key, options = {})
187
+ @response.set_cookie key.to_s, @options.merge(options)
188
+ end
189
+
190
+ def shift
191
+ key, value = to_hash.shift
192
+ delete(key)
193
+ [key, value]
194
+ end
195
+
196
+ alias size length
197
+
198
+ def sort(&block)
199
+ to_hash.sort(&block)
200
+ end if Hash.method_defined? :sort
201
+
202
+ alias store []=
203
+
204
+ def to_hash
205
+ request_cookies.merge(response_cookies)
206
+ end
207
+
208
+ def to_a
209
+ to_hash.to_a
210
+ end
211
+
212
+ def to_s
213
+ to_hash.to_s
214
+ end
215
+
216
+ alias update merge!
217
+ alias value? has_value?
218
+
219
+ def values
220
+ to_hash.values
221
+ end
222
+
223
+ def values_at(*list)
224
+ list.map { |k| self[k] }
225
+ end
226
+
227
+ private
228
+
229
+ def warn(message)
230
+ super "#{caller.first[/^[^:]:\d+:/]} warning: #{message}"
231
+ end
232
+
233
+ def deleted
234
+ parse_response
235
+ @deleted
236
+ end
237
+
238
+ def response_cookies
239
+ parse_response
240
+ @response_hash
241
+ end
242
+
243
+ def parse_response
244
+ string = @response.headers['Set-Cookie']
245
+ return if @response_string == string
246
+
247
+ hash = {}
248
+
249
+ string.each_line do |line|
250
+ key, value = line.split(';', 2).first.to_s.split('=', 2)
251
+ next if key.nil?
252
+ key = Rack::Utils.unescape(key)
253
+ if line =~ /expires=Thu, 01[-\s]Jan[-\s]1970/
254
+ @deleted << key
255
+ else
256
+ @deleted.delete key
257
+ hash[key] = value
258
+ end
259
+ end
260
+
261
+ @response_hash.replace hash
262
+ @response_string = string
263
+ end
264
+
265
+ def request_cookies
266
+ @request.cookies.reject { |key, value| deleted.include? key }
267
+ end
268
+ end
269
+ end